]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch 'master' of git@gitorious.org:statusnet/mainline into testing
authorBrion Vibber <brion@pobox.com>
Tue, 23 Mar 2010 19:13:32 +0000 (12:13 -0700)
committerBrion Vibber <brion@pobox.com>
Tue, 23 Mar 2010 19:13:32 +0000 (12:13 -0700)
217 files changed:
README
actions/accessadminpanel.php
actions/all.php
actions/apiaccountupdateprofile.php
actions/apigroupshow.php
actions/apimediaupload.php [new file with mode: 0644]
actions/apioauthauthorize.php
actions/apistatusesupdate.php
actions/apistatusnetconfig.php
actions/apitimelinefavorites.php
actions/apitimelinefriends.php
actions/apitimelinegroup.php
actions/apitimelinehome.php
actions/apitimelinementions.php
actions/apitimelinepublic.php
actions/apitimelinetag.php
actions/apitimelineuser.php
actions/avatarsettings.php
actions/confirmaddress.php
actions/deleteuser.php
actions/foaf.php
actions/foafgroup.php
actions/invite.php
actions/othersettings.php
actions/public.php
actions/recoverpassword.php
actions/replies.php
actions/showfavorites.php
actions/shownotice.php
actions/siteadminpanel.php
actions/sitenoticeadminpanel.php
actions/tag.php
actions/useradminpanel.php
actions/version.php
classes/File.php
classes/Group_alias.php
classes/Notice.php
classes/Profile.php
classes/Profile_role.php
classes/Subscription.php
classes/User.php
classes/User_group.php
classes/User_username.php
config.php.sample
htaccess.sample
index.php
lib/action.php
lib/activity.php
lib/activitycontext.php [new file with mode: 0644]
lib/activityobject.php [new file with mode: 0644]
lib/activityutils.php [new file with mode: 0644]
lib/activityverb.php [new file with mode: 0644]
lib/adminpanelaction.php
lib/apiaction.php
lib/apiauth.php
lib/atom10feed.php
lib/atomcategory.php [new file with mode: 0644]
lib/authenticationplugin.php
lib/authorizationplugin.php
lib/avatarlink.php [new file with mode: 0644]
lib/command.php
lib/commandinterpreter.php
lib/common.php
lib/default.php
lib/deluserqueuehandler.php [new file with mode: 0644]
lib/htmloutputter.php
lib/imagefile.php
lib/iomaster.php
lib/language.php
lib/mail.php
lib/mediafile.php
lib/messageform.php
lib/mysqlschema.php
lib/noticeform.php
lib/noticelist.php
lib/pgsqlschema.php
lib/poco.php [new file with mode: 0644]
lib/pocoaddress.php [new file with mode: 0644]
lib/pocourl.php [new file with mode: 0644]
lib/queuemanager.php
lib/router.php
lib/schema.php
lib/servererroraction.php
lib/subs.php
lib/userprofile.php
lib/util.php
locale/ar/LC_MESSAGES/statusnet.po
locale/arz/LC_MESSAGES/statusnet.po
locale/bg/LC_MESSAGES/statusnet.po
locale/br/LC_MESSAGES/statusnet.po [new file with mode: 0644]
locale/ca/LC_MESSAGES/statusnet.po
locale/cs/LC_MESSAGES/statusnet.po
locale/de/LC_MESSAGES/statusnet.po
locale/el/LC_MESSAGES/statusnet.po
locale/en_GB/LC_MESSAGES/statusnet.po
locale/es/LC_MESSAGES/statusnet.po
locale/fa/LC_MESSAGES/statusnet.po
locale/fi/LC_MESSAGES/statusnet.po
locale/fr/LC_MESSAGES/statusnet.po
locale/ga/LC_MESSAGES/statusnet.po
locale/he/LC_MESSAGES/statusnet.po
locale/hsb/LC_MESSAGES/statusnet.po
locale/ia/LC_MESSAGES/statusnet.po
locale/is/LC_MESSAGES/statusnet.po
locale/it/LC_MESSAGES/statusnet.po
locale/ja/LC_MESSAGES/statusnet.po
locale/ko/LC_MESSAGES/statusnet.po
locale/mk/LC_MESSAGES/statusnet.po
locale/nb/LC_MESSAGES/statusnet.po
locale/nl/LC_MESSAGES/statusnet.po
locale/nn/LC_MESSAGES/statusnet.po
locale/pl/LC_MESSAGES/statusnet.po
locale/pt/LC_MESSAGES/statusnet.po
locale/pt_BR/LC_MESSAGES/statusnet.po
locale/ru/LC_MESSAGES/statusnet.po
locale/statusnet.po
locale/sv/LC_MESSAGES/statusnet.po
locale/te/LC_MESSAGES/statusnet.po
locale/tr/LC_MESSAGES/statusnet.po
locale/uk/LC_MESSAGES/statusnet.po
locale/vi/LC_MESSAGES/statusnet.po
locale/zh_CN/LC_MESSAGES/statusnet.po
locale/zh_TW/LC_MESSAGES/statusnet.po
plugins/Autocomplete/jquery-autocomplete/indicator.gif [new file with mode: 0644]
plugins/CasAuthentication/CasAuthenticationPlugin.php
plugins/CasAuthentication/caslogin.php
plugins/CasAuthentication/extlib/CAS.php
plugins/CasAuthentication/extlib/CAS/PGTStorage/pgt-db.php
plugins/CasAuthentication/extlib/CAS/PGTStorage/pgt-file.php
plugins/CasAuthentication/extlib/CAS/PGTStorage/pgt-main.php
plugins/CasAuthentication/extlib/CAS/client.php
plugins/CasAuthentication/extlib/CAS/domxml-php4-php5.php [deleted file]
plugins/CasAuthentication/extlib/CAS/domxml-php4-to-php5.php [new file with mode: 0644]
plugins/CasAuthentication/extlib/CAS/languages/catalan.php
plugins/CasAuthentication/extlib/CAS/languages/english.php
plugins/CasAuthentication/extlib/CAS/languages/french.php
plugins/CasAuthentication/extlib/CAS/languages/german.php
plugins/CasAuthentication/extlib/CAS/languages/greek.php
plugins/CasAuthentication/extlib/CAS/languages/japanese.php
plugins/CasAuthentication/extlib/CAS/languages/languages.php
plugins/CasAuthentication/extlib/CAS/languages/spanish.php
plugins/Comet/CometPlugin.php
plugins/Facebook/FacebookPlugin.php
plugins/Facebook/facebookaction.php
plugins/Imap/ImapPlugin.php
plugins/LdapAuthentication/LdapAuthenticationPlugin.php
plugins/LdapAuthentication/README
plugins/LdapAuthorization/LdapAuthorizationPlugin.php
plugins/LdapAuthorization/README
plugins/MemcachedPlugin.php [new file with mode: 0644]
plugins/Minify/MinifyPlugin.php
plugins/OStatus/OStatusPlugin.php
plugins/OStatus/actions/groupsalmon.php
plugins/OStatus/actions/ostatussub.php
plugins/OStatus/actions/usersalmon.php
plugins/OStatus/actions/userxrd.php
plugins/OStatus/classes/FeedSub.php
plugins/OStatus/classes/HubSub.php
plugins/OStatus/classes/Magicsig.php
plugins/OStatus/classes/Ostatus_profile.php
plugins/OStatus/extlib/Crypt/AES.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/DES.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/Hash.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RC4.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA.php
plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/Key.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/KeyPair.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php [deleted file]
plugins/OStatus/extlib/Crypt/RSA/MathLoader.php [deleted file]
plugins/OStatus/extlib/Crypt/Random.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/Rijndael.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/TripleDES.php [new file with mode: 0644]
plugins/OStatus/extlib/Math/BigInteger.php [new file with mode: 0644]
plugins/OStatus/extlib/hkit/hcard.profile.php [deleted file]
plugins/OStatus/extlib/hkit/hkit.class.php [deleted file]
plugins/OStatus/lib/discovery.php
plugins/OStatus/lib/discoveryhints.php [new file with mode: 0644]
plugins/OStatus/lib/feeddiscovery.php
plugins/OStatus/lib/linkheader.php [new file with mode: 0644]
plugins/OStatus/lib/magicenvelope.php
plugins/OStatus/lib/safecrypt_rsa.php [new file with mode: 0644]
plugins/OStatus/lib/safemath_biginteger.php [new file with mode: 0644]
plugins/OStatus/lib/xrdaction.php
plugins/OStatus/scripts/testfeed.php [new file with mode: 0644]
plugins/OStatus/scripts/updateostatus.php
plugins/OStatus/tests/remote-tests.php [new file with mode: 0644]
plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php [new file with mode: 0644]
plugins/OpenID/OpenIDPlugin.php
plugins/OpenID/User_openid.php
plugins/OpenID/User_openid_trustroot.php
plugins/OpenID/openid.php
plugins/OpenID/openidsettings.php
plugins/Orbited/OrbitedPlugin.php
plugins/README-plugins [new file with mode: 0644]
plugins/Realtime/RealtimePlugin.php
plugins/Realtime/realtimeupdate.js
plugins/Recaptcha/RecaptchaPlugin.php
plugins/ReverseUsernameAuthentication/README
plugins/ReverseUsernameAuthentication/ReverseUsernameAuthenticationPlugin.php
plugins/TabFocus/TabFocusPlugin.php [new file with mode: 0644]
plugins/TabFocus/tabfocus.js [new file with mode: 0644]
plugins/TwitterBridge/README
plugins/TwitterBridge/daemons/synctwitterfriends.php
plugins/TwitterBridge/twitter.php
scripts/fixup_utf8.php
scripts/importtwitteratom.php
scripts/useremail.php
scripts/xmppdaemon.php
tests/ActivityParseTests.php
tests/UserFeedParseTest.php
theme/base/css/display.css
theme/base/css/ie6.css
theme/default/css/display.css
theme/identica/css/display.css

diff --git a/README b/README
index daa393cbe638686c2aec589fbb691546b2bcd6f4..c5adda17768d7c298be21d41d99e7d8554ae06bd 100644 (file)
--- a/README
+++ b/README
@@ -137,7 +137,9 @@ run correctly.
 
 - PHP 5.2.3+. It may be possible to run this software on earlier
   versions of PHP, but many of the functions used are only available
-  in PHP 5.2 or above.
+  in PHP 5.2 or above. 5.2.6 or later is needed for XMPP background
+  daemons on 64-bit platforms. PHP 5.3.x should work but is known
+  to cause some failures for OpenID.
 - MySQL 5.x. The StatusNet database is stored, by default, in a MySQL
   server. It has been primarily tested on 5.x servers, although it may
   be possible to install on earlier (or later!) versions. The server
@@ -690,7 +692,7 @@ instructions; read to the end first before trying them.
 9. Copy htaccess.sample to .htaccess in the new directory. Change the
    RewriteBase to use the correct path.
 10. Rebuild the database. (You can safely skip this step and go to #12
-    if you're upgrading from another 0.8.x version).
+    if you're upgrading from another 0.9.x version).
 
     NOTE: this step is destructive and cannot be
     reversed. YOU CAN EASILY DESTROY YOUR SITE WITH THIS STEP. Don't
index 4768e2faf9eb3381b8c8ae47b2cfd98f41b97d82..73354e97a7bd1c47fb14395bc3b6c4ec51021422 100644 (file)
@@ -51,6 +51,7 @@ class AccessadminpanelAction extends AdminPanelAction
 
     function title()
     {
+        // TRANS: Page title
         return _('Access');
     }
 
@@ -62,6 +63,7 @@ class AccessadminpanelAction extends AdminPanelAction
 
     function getInstructions()
     {
+       // TRANS: Page notice
         return _('Site access settings');
     }
 
@@ -155,24 +157,34 @@ class AccessAdminPanelForm extends AdminForm
     function formData()
     {
        $this->out->elementStart('fieldset', array('id' => 'settings_admin_access'));
+       // TRANS: Form legend for registration form.
         $this->out->element('legend', null, _('Registration'));
         $this->out->elementStart('ul', 'form_data');
         $this->li();
-        $this->out->checkbox('private', _('Private'),
+        // TRANS: Checkbox instructions for admin setting "Private"
+        $instructions = _('Prohibit anonymous users (not logged in) from viewing site?');
+        // TRANS: Checkbox label for prohibiting anonymous users from viewing site.
+        $this->out->checkbox('private', _m('LABEL', 'Private'),
                              (bool) $this->value('private'),
-                             _('Prohibit anonymous users (not logged in) from viewing site?'));
+                             $instructions);
         $this->unli();
 
         $this->li();
+        // TRANS: Checkbox instructions for admin setting "Invite only"
+        $instructions = _('Make registration invitation only.');
+        // TRANS: Checkbox label for configuring site as invite only.
         $this->out->checkbox('inviteonly', _('Invite only'),
                              (bool) $this->value('inviteonly'),
-                             _('Make registration invitation only.'));
+                             $instructions);
         $this->unli();
 
         $this->li();
+        // TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+        $instructions = _('Disable new registrations.');
+        // TRANS: Checkbox label for disabling new user registrations.
         $this->out->checkbox('closed', _('Closed'),
                              (bool) $this->value('closed'),
-                             _('Disable new registrations.'));
+                             $instructions);
         $this->unli();
         $this->out->elementEnd('ul');
         $this->out->elementEnd('fieldset');
@@ -186,7 +198,9 @@ class AccessAdminPanelForm extends AdminForm
 
     function formActions()
     {
-        $this->out->submit('submit', _('Save'), 'submit', null, _('Save access settings'));
+        // TRANS: Title / tooltip for button to save access settings in site admin panel
+        $title = _('Save access settings');
+        $this->out->submit('submit', _m('BUTTON', 'Save'), 'submit', null, $title);
     }
 
 }
index 6be0c00e3a36c2722925a4278eca0054cb685cf7..8c22e6f5f076337b5829a791129369beaef2b9db 100644 (file)
@@ -60,6 +60,7 @@ class AllAction extends ProfileAction
         }
 
         if ($this->page > 1 && $this->notice->N == 0) {
+            // TRANS: Server error when page not found (404)
             $this->serverError(_('No such page'), $code = 404);
         }
 
@@ -81,8 +82,10 @@ class AllAction extends ProfileAction
     function title()
     {
         if ($this->page > 1) {
+            // TRANS: Page title. %1$s is user nickname, %2$d is page number
             return sprintf(_('%1$s and friends, page %2$d'), $this->user->nickname, $this->page);
         } else {
+            // TRANS: Page title. %1$s is user nickname
             return sprintf(_("%s and friends"), $this->user->nickname);
         }
     }
@@ -96,6 +99,7 @@ class AllAction extends ProfileAction
                         'nickname' =>
                         $this->user->nickname)
                 ),
+            // TRANS: %1$s is user nickname
                 sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->user->nickname)),
             new Feed(Feed::RSS2,
                 common_local_url(
@@ -104,6 +108,7 @@ class AllAction extends ProfileAction
                         'id' => $this->user->nickname
                     )
                 ),
+            // TRANS: %1$s is user nickname
                 sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->user->nickname)),
             new Feed(Feed::ATOM,
                 common_local_url(
@@ -112,6 +117,7 @@ class AllAction extends ProfileAction
                         'id' => $this->user->nickname
                     )
                 ),
+                // TRANS: %1$s is user nickname
                 sprintf(_('Feed for friends of %s (Atom)'), $this->user->nickname))
         );
     }
@@ -124,6 +130,7 @@ class AllAction extends ProfileAction
 
     function showEmptyListMessage()
     {
+        // TRANS: %1$s is user nickname
         $message = sprintf(_('This is the timeline for %s and friends but no one has posted anything yet.'), $this->user->nickname) . ' ';
 
         if (common_logged_in()) {
@@ -131,6 +138,7 @@ class AllAction extends ProfileAction
             if ($this->user->id === $current_user->id) {
                 $message .= _('Try subscribing to more people, [join a group](%%action.groups%%) or post something yourself.');
             } else {
+                // TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@"
                 $message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from his profile or [post something to his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->user->nickname, $this->user->nickname, '@' . $this->user->nickname);
             }
         } else {
@@ -166,8 +174,10 @@ class AllAction extends ProfileAction
     {
         $user = common_current_user();
         if ($user && ($user->id == $this->user->id)) {
+            // TRANS: H1 text
             $this->element('h1', null, _("You and friends"));
         } else {
+            // TRANS: H1 text. %1$s is user nickname
             $this->element('h1', null, sprintf(_('%s and friends'), $this->user->nickname));
         }
     }
index fd4384a25c465093f042cdeee6c4650ede04b245..9b371ea95764e1f829e7c9bce1eba8cffcb3859a 100644 (file)
@@ -115,11 +115,11 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction
 
         $original = clone($profile);
 
-        if (empty($this->name)) {
+        if (!empty($this->name)) {
             $profile->fullname = $this->name;
         }
 
-        if (empty($this->url)) {
+        if (!empty($this->url)) {
             $profile->homepage = $this->url;
         }
 
index 95d6f95afa8a18be770d5d8a0d00225563638d16..5745a81f4172e6572694bba3b12ccb1ea638f8ed 100644 (file)
@@ -45,6 +45,7 @@ require_once INSTALLDIR . '/lib/apiprivateauth.php';
  * @author   Evan Prodromou <evan@status.net>
  * @author   Jeffery To <jeffery.to@gmail.com>
  * @author   Zach Copley <zach@status.net>
+ * @author   Michele <macno@macno.org>
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link     http://status.net/
  */
@@ -68,6 +69,24 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
 
         $this->group = $this->getTargetGroup($this->arg('id'));
 
+        if (empty($this->group)) {
+            $alias = Group_alias::staticGet(
+                'alias',
+                common_canonical_nickname($this->arg('id'))
+            );
+            if (!empty($alias)) {
+                $args = array('id' => $alias->group_id, 'format' => $this->format);
+                common_redirect(common_local_url('ApiGroupShow', $args), 301);
+            } else {
+                $this->clientError(
+                    _('Group not found!'),
+                    404,
+                    $this->format
+                );
+            }
+            return;
+        }
+
         return true;
     }
 
@@ -85,15 +104,6 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
     {
         parent::handle($args);
 
-        if (empty($this->group)) {
-            $this->clientError(
-                _('Group not found!'),
-                404,
-                $this->format
-            );
-            return;
-        }
-
         switch($this->format) {
         case 'xml':
             $this->showSingleXmlGroup($this->group);
@@ -105,7 +115,6 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
             $this->clientError(_('API method not found.'), 404, $this->format);
             break;
         }
-
     }
 
     /**
diff --git a/actions/apimediaupload.php b/actions/apimediaupload.php
new file mode 100644 (file)
index 0000000..ec316ed
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Upload an image via the API
+ *
+ * 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  API
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 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/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/lib/apiauth.php';
+require_once INSTALLDIR . '/lib/mediafile.php';
+
+/**
+ * Upload an image via the API.  Returns a shortened URL for the image
+ * to the user.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiMediaUploadAction extends ApiAuthAction
+{
+    /**
+     * Handle the request
+     *
+     * Grab the file from the 'media' param, then store, and shorten
+     *
+     * @todo Upload throttle!
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(
+                _('This method requires a POST.'),
+                400, $this->format
+            );
+            return;
+        }
+
+        // Workaround for PHP returning empty $_POST and $_FILES when POST
+        // length > post_max_size in php.ini
+
+        if (empty($_FILES)
+            && empty($_POST)
+            && ($_SERVER['CONTENT_LENGTH'] > 0)
+        ) {
+             $msg = _('The server was unable to handle that much POST ' .
+                    'data (%s bytes) due to its current configuration.');
+
+            $this->clientError(sprintf($msg, $_SERVER['CONTENT_LENGTH']));
+            return;
+        }
+
+        $upload = null;
+
+        try {
+            $upload = MediaFile::fromUpload('media', $this->auth_user);
+        } catch (ClientException $ce) {
+            $this->clientError($ce->getMessage());
+            return;
+        }
+
+        if (isset($upload)) {
+            $this->showResponse($upload);
+        } else {
+            $this->clientError('Upload failed.');
+            return;
+        }
+    }
+
+    /**
+     * Show a Twitpic-like response with the ID of the media file
+     * and a (hopefully) shortened URL for it.
+     *
+     * @param File $upload  the uploaded file
+     *
+     * @return void
+     */
+    function showResponse($upload)
+    {
+        $this->initDocument();
+        $this->elementStart('rsp', array('stat' => 'ok'));
+        $this->element('mediaid', null, $upload->fileRecord->id);
+        $this->element('mediaurl', null, $upload->shortUrl());
+        $this->elementEnd('rsp');
+        $this->endDocument();
+    }
+
+    /**
+     * Overrided clientError to show a more Twitpic-like error
+     *
+     * @param String $msg an error message
+     *
+     */
+    function clientError($msg)
+    {
+        $this->initDocument();
+        $this->elementStart('rsp', array('stat' => 'fail'));
+
+        // @todo add in error code
+        $errAttr = array('msg' => $msg);
+
+        $this->element('err', $errAttr, null);
+        $this->elementEnd('rsp');
+        $this->endDocument();
+    }
+
+}
index 2caa8d20b33a36ced4c703bbf66fc40c0a607799..e7c6f376116d636bdd42c05d55ecb6b00c306739 100644 (file)
@@ -156,7 +156,7 @@ class ApiOauthAuthorizeAction extends ApiOauthAction
 
                 if (!$result) {
                     common_log_db_error($appUser, 'DELETE', __FILE__);
-                    throw new ServerException(_('DB error deleting OAuth app user.'));
+                    throw new ServerException(_('Database error deleting OAuth application user.'));
                     return;
                 }
             }
@@ -182,7 +182,7 @@ class ApiOauthAuthorizeAction extends ApiOauthAction
 
             if (!$result) {
                 common_log_db_error($appUser, 'INSERT', __FILE__);
-                throw new ServerException(_('DB error inserting OAuth app user.'));
+                throw new ServerException(_('Database error inserting OAuth application user.'));
                 return;
             }
 
index bf367e1e181741e4d5626bd6332f0ae5432cc713..1956c85863d747173b4a15c8cc30e10f9caefe43 100644 (file)
@@ -244,11 +244,17 @@ class ApiStatusesUpdateAction extends ApiAuthAction
                 $options = array_merge($options, $locOptions);
             }
 
-            $this->notice =
-              Notice::saveNew($this->auth_user->id,
-                              $content,
-                              $this->source,
-                              $options);
+            try {
+                $this->notice = Notice::saveNew(
+                    $this->auth_user->id,
+                    $content,
+                    $this->source,
+                    $options
+                );
+            } catch (Exception $e) {
+                $this->clientError($e->getMessage());
+                return;
+            }
 
             if (isset($upload)) {
                 $upload->attachToNotice($this->notice);
index 51400dfc98c7a81be06a2d47eb16dc0e6942c74b..66b23c02d5db082be206395eaa9788e3db0f9220 100644 (file)
@@ -50,13 +50,17 @@ if (!defined('STATUSNET')) {
 class ApiStatusnetConfigAction extends ApiAction
 {
     var $keys = array(
-        'site' => array('name', 'server', 'theme', 'path', 'fancy', 'language',
-                        'email', 'broughtby', 'broughtbyurl', 'closed',
-                        'inviteonly', 'private','textlimit'),
-        'license' => array('url', 'title', 'image'),
+        'site' => array('name', 'server', 'theme', 'path', 'logo', 'fancy', 'language',
+                        'email', 'broughtby', 'broughtbyurl', 'timezone', 'closed',
+                        'inviteonly', 'private', 'textlimit', 'ssl', 'sslserver', 'shorturllength'),
+        'license' => array('type', 'owner', 'url', 'title', 'image'),
         'nickname' => array('featured'),
+        'profile' => array('biolimit'),
+        'group' => array('desclimit'),
+        'notice' => array('contentlimit'),
         'throttle' => array('enabled', 'count', 'timespan'),
-        'xmpp' => array('enabled', 'server', 'user')
+        'xmpp' => array('enabled', 'server', 'port', 'user'),
+        'integration' => array('source')
     );
 
     /**
@@ -93,8 +97,6 @@ class ApiStatusnetConfigAction extends ApiAction
 
             // XXX: check that all sections and settings are legal XML elements
 
-            common_debug(var_export($this->keys, true));
-
             foreach ($this->keys as $section => $settings) {
                 $this->elementStart($section);
                 foreach ($settings as $setting) {
@@ -106,6 +108,14 @@ class ApiStatusnetConfigAction extends ApiAction
                     } else if ($value === true) {
                         $value = 'true';
                     }
+
+                    // return theme logo if there's no site specific one
+                    if (empty($value)) {
+                        if ($section == 'site' && $setting == 'logo') {
+                            $value = Theme::path('logo.png');
+                        }
+                    }
+
                     $this->element($setting, null, $value);
                 }
                 $this->elementEnd($section);
index c89d02247acda2edbfcff97d87d5bb9f9c2e860b..8cb2e808de0c350ceb74ebb70f57e70afdfe106d 100644 (file)
@@ -23,7 +23,8 @@
  * @package   StatusNet
  * @author    Craig Andrews <candrews@integralblue.com>
  * @author    Evan Prodromou <evan@status.net>
- * @author    Zach Copley <zach@status.net> * @copyright 2009 StatusNet, Inc.
+ * @author    Zach Copley <zach@status.net>
+ * @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/
  */
@@ -123,22 +124,26 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
             ? $avatar->displayUrl()
             : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
 
+        $link = common_local_url(
+            'showfavorites',
+            array('nickname' => $this->user->nickname)
+        );
+
+        $self = $this->getSelfUri();
+
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $link = common_local_url(
-                'showfavorites',
-                array('nickname' => $this->user->nickname)
-            );
             $this->showRssTimeline(
                 $this->notices,
                 $title,
                 $link,
                 $subtitle,
                 null,
-                $logo
+                $logo,
+                $self
             );
             break;
         case 'atom':
@@ -153,23 +158,8 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
             $atom->setLogo($logo);
             $atom->setUpdated('now');
 
-            $atom->addLink(
-                common_local_url(
-                    'showfavorites',
-                    array('nickname' => $this->user->nickname)
-                )
-            );
-
-            $id = $this->arg('id');
-            $aargs = array('format' => 'atom');
-            if (!empty($id)) {
-                $aargs['id'] = $id;
-            }
-
-            $atom->addLink(
-                $this->getSelfUri('ApiTimelineFavorites', $aargs),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
+            $atom->addLink($link);
+            $atom->setSelfLink($self);
 
             $atom->addEntryFromNotices($this->notices);
 
index 9ef3ace607eb5b9ef22ad96bd495ca887c413b1c..ac350ab1b7a25acf8c5ee77dba5cd6269089670c 100644 (file)
@@ -117,9 +117,17 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
 
         $subtitle = sprintf(
             _('Updates from %1$s and friends on %2$s!'),
-            $this->user->nickname, $sitename
+            $this->user->nickname,
+            $sitename
         );
 
+        $link = common_local_url(
+            'all',
+             array('nickname' => $this->user->nickname)
+        );
+
+        $self = $this->getSelfUri();
+
         $logo = (!empty($avatar))
             ? $avatar->displayUrl()
             : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
@@ -130,19 +138,14 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
             break;
         case 'rss':
 
-            $link = common_local_url(
-                'all', array(
-                    'nickname' => $this->user->nickname
-                )
-            );
-
             $this->showRssTimeline(
                 $this->notices,
                 $title,
                 $link,
                 $subtitle,
                 null,
-                $logo
+                $logo,
+                $self
             );
             break;
         case 'atom':
@@ -156,24 +159,8 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
             $atom->setSubtitle($subtitle);
             $atom->setLogo($logo);
             $atom->setUpdated('now');
-
-            $atom->addLink(
-                common_local_url(
-                    'all',
-                    array('nickname' => $this->user->nickname)
-                )
-            );
-
-            $id = $this->arg('id');
-            $aargs = array('format' => 'atom');
-            if (!empty($id)) {
-                $aargs['id'] = $id;
-            }
-
-            $atom->addLink(
-                $this->getSelfUri('ApiTimelineFriends', $aargs),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
+            $atom->addLink($link);
+            $atom->setSelfLink($self);
 
             $atom->addEntryFromNotices($this->notices);
 
index 8f971392bf7650adbb9e1e2dec5eb331b21d0fe4..da816c40a9063141a8b567270ab0872e1e82898b 100644 (file)
@@ -107,6 +107,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
         // We'll pull common formatting out of this for other formats
         $atom = new AtomGroupNoticeFeed($this->group);
 
+        $self = $this->getSelfUri();
+
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
@@ -118,7 +120,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
                 $this->group->homeUrl(),
                 $atom->subtitle,
                 null,
-                $atom->logo
+                $atom->logo,
+                $self
             );
             break;
         case 'atom':
@@ -126,24 +129,12 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
             header('Content-Type: application/atom+xml; charset=utf-8');
 
             try {
-
                 $atom->addAuthorRaw($this->group->asAtomAuthor());
                 $atom->setActivitySubject($this->group->asActivitySubject());
-
-                $id = $this->arg('id');
-                $aargs = array('format' => 'atom');
-                if (!empty($id)) {
-                    $aargs['id'] = $id;
-                }
-                $self = $this->getSelfUri('ApiTimelineGroup', $aargs);
-
                 $atom->setId($self);
                 $atom->setSelfLink($self);
-
                 $atom->addEntryFromNotices($this->notices);
-
                 $this->raw($atom->getString());
-
             } catch (Atom10FeedException $e) {
                 $this->serverError(
                     'Could not generate feed for group - ' . $e->getMessage()
index abd3877860371cd152b7cb7e34266948e5776a1e..1618c9923c8be7eb79b4c8bd2221afb982bca4b8 100644 (file)
@@ -72,7 +72,7 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
     function prepare($args)
     {
         parent::prepare($args);
-        common_debug("api home_timeline");
+
         $this->user = $this->getTargetUser($this->arg('id'));
 
         if (empty($this->user)) {
@@ -121,8 +121,15 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
             $this->user->nickname, $sitename
         );
 
-        $logo = (!empty($avatar)) 
-            ? $avatar->displayUrl() 
+        $link = common_local_url(
+            'all',
+            array('nickname' => $this->user->nickname)
+        );
+
+        $self = $this->getSelfUri();
+
+        $logo = (!empty($avatar))
+            ? $avatar->displayUrl()
             : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
 
         switch($this->format) {
@@ -130,17 +137,14 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $link = common_local_url(
-                'all',
-                array('nickname' => $this->user->nickname)
-            );
             $this->showRssTimeline(
                 $this->notices,
                 $title,
                 $link,
                 $subtitle,
                 null,
-                $logo
+                $logo,
+                $self
             );
             break;
         case 'atom':
@@ -155,23 +159,8 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
             $atom->setLogo($logo);
             $atom->setUpdated('now');
 
-            $atom->addLink(
-                common_local_url(
-                    'all',
-                    array('nickname' => $this->user->nickname)
-                )
-            );
-
-            $id = $this->arg('id');
-            $aargs = array('format' => 'atom');
-            if (!empty($id)) {
-                $aargs['id'] = $id;
-            }
-
-            $atom->addLink(
-                $this->getSelfUri('ApiTimelineHome', $aargs),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
+            $atom->addLink($link);
+            $atom->setSelfLink($self);
 
             $atom->addEntryFromNotices($this->notices);
             $this->raw($atom->getString());
index 31627ab7bf36424ea6fa09539388265bb61f96b1..c3aec7c5afacb8dca1f6b971cd2d65d36cff9f1e 100644 (file)
@@ -123,6 +123,9 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
             'replies',
             array('nickname' => $this->user->nickname)
         );
+
+        $self = $this->getSelfUri();
+
         $subtitle   = sprintf(
             _('%1$s updates that reply to updates from %2$s / %3$s.'),
             $sitename, $this->user->nickname, $profile->getBestName()
@@ -134,10 +137,20 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo);
+            $this->showRssTimeline(
+                $this->notices,
+                $title,
+                $link,
+                $subtitle,
+                null,
+                $logo,
+                $self
+            );
             break;
         case 'atom':
 
+            header('Content-Type: application/atom+xml; charset=utf-8');
+
             $atom = new AtomNoticeFeed();
 
             $atom->setId($id);
@@ -146,23 +159,8 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
             $atom->setLogo($logo);
             $atom->setUpdated('now');
 
-            $atom->addLink(
-                common_local_url(
-                    'replies',
-                    array('nickname' => $this->user->nickname)
-                )
-            );
-
-            $id = $this->arg('id');
-            $aargs = array('format' => 'atom');
-            if (!empty($id)) {
-                $aargs['id'] = $id;
-            }
-
-            $atom->addLink(
-                $this->getSelfUri('ApiTimelineMentions', $aargs),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
+            $atom->addLink($link);
+            $atom->setSelfLink($self);
 
             $atom->addEntryFromNotices($this->notices);
             $this->raw($atom->getString());
index 3e4dad690e83ee80684ef39544ca49b3f5b01e66..9034614253d438b5566a1993c6b1da0182094b18 100644 (file)
@@ -107,7 +107,8 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
         $title      = sprintf(_("%s public timeline"), $sitename);
         $taguribase = TagURI::base();
         $id         = "tag:$taguribase:PublicTimeline";
-        $link       = common_root_url();
+        $link       = common_local_url('public');
+        $self       = $this->getSelfUri();
         $subtitle   = sprintf(_("%s updates from everyone!"), $sitename);
 
         switch($this->format) {
@@ -115,10 +116,20 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $sitelogo);
+            $this->showRssTimeline(
+                $this->notices,
+                $title,
+                $link,
+                $subtitle,
+                null,
+                $sitelogo,
+                $self
+            );
             break;
         case 'atom':
 
+            header('Content-Type: application/atom+xml; charset=utf-8');
+
             $atom = new AtomNoticeFeed();
 
             $atom->setId($id);
@@ -126,16 +137,8 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
             $atom->setSubtitle($subtitle);
             $atom->setLogo($sitelogo);
             $atom->setUpdated('now');
-
             $atom->addLink(common_local_url('public'));
-
-            $atom->addLink(
-                $this->getSelfUri(
-                    'ApiTimelinePublic', array('format' => 'atom')
-                ),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
-
+            $atom->setSelfLink($self);
             $atom->addEntryFromNotices($this->notices);
 
             $this->raw($atom->getString());
index a29061fccfcbc50d35eef9c27ee3e79ad94ea3c1..fed1437ea805805a06ba4c3ba608aebbc952076d 100644 (file)
@@ -25,7 +25,7 @@
  * @author    Evan Prodromou <evan@status.net>
  * @author    Jeffery To <jeffery.to@gmail.com>
  * @author    Zach Copley <zach@status.net>
- * @copyright 2009 StatusNet, Inc.
+ * @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/
  */
@@ -67,6 +67,8 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
     {
         parent::prepare($args);
 
+        common_debug("apitimelinetag prepare()");
+
         $this->tag     = $this->arg('tag');
         $this->notices = $this->getNotices();
 
@@ -108,22 +110,28 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
         $taguribase = TagURI::base();
         $id         = "tag:$taguribase:TagTimeline:".$tag;
 
+        $link = common_local_url(
+            'tag',
+            array('tag' => $this->tag)
+        );
+
+        $self = $this->getSelfUri();
+
+        common_debug("self link is: $self");
+
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $link = common_local_url(
-                'tag',
-                array('tag' => $this->tag)
-            );
             $this->showRssTimeline(
                 $this->notices,
                 $title,
                 $link,
                 $subtitle,
                 null,
-                $sitelogo
+                $sitelogo,
+                $self
             );
             break;
         case 'atom':
@@ -138,22 +146,8 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
             $atom->setLogo($logo);
             $atom->setUpdated('now');
 
-            $atom->addLink(
-                common_local_url(
-                    'tag',
-                    array('tag' => $this->tag)
-                )
-            );
-
-            $aargs = array('format' => 'atom');
-            if (!empty($this->tag)) {
-                $aargs['tag'] = $this->tag;
-            }
-
-            $atom->addLink(
-                $this->getSelfUri('ApiTimelineTag', $aargs),
-                array('rel' => 'self', 'type' => 'application/atom+xml')
-            );
+            $atom->addLink($link);
+            $atom->setSelfLink($self);
 
             $atom->addEntryFromNotices($this->notices);
             $this->raw($atom->getString());
index 2d0047c0464f8723d75d418a7c318fa11c880331..11431a82ca9231658ccf0ea8d82ec693905354e3 100644 (file)
@@ -116,13 +116,13 @@ class ApiTimelineUserAction extends ApiBareAuthAction
         // We'll use the shared params from the Atom stub
         // for other feed types.
         $atom = new AtomUserNoticeFeed($this->user);
-        $title      = $atom->title;
-        $link       = common_local_url(
+
+        $link = common_local_url(
             'showstream',
             array('nickname' => $this->user->nickname)
         );
-        $subtitle = $atom->subtitle;
-        $logo = $atom->logo;
+
+        $self = $this->getSelfUri();
 
         // FriendFeed's SUP protocol
         // Also added RSS and Atom feeds
@@ -136,25 +136,22 @@ class ApiTimelineUserAction extends ApiBareAuthAction
             break;
         case 'rss':
             $this->showRssTimeline(
-                $this->notices, $title, $link,
-                $subtitle, $suplink, $logo
+                $this->notices,
+                $atom->title,
+                $link,
+                $atom->subtitle,
+                $suplink,
+                $atom->logo,
+                $self
             );
             break;
         case 'atom':
 
             header('Content-Type: application/atom+xml; charset=utf-8');
 
-            $id = $this->arg('id');
-            $aargs = array('format' => 'atom');
-            if (!empty($id)) {
-                $aargs['id'] = $id;
-            }
-            $self = $this->getSelfUri('ApiTimelineUser', $aargs);
             $atom->setId($self);
             $atom->setSelfLink($self);
-
             $atom->addEntryFromNotices($this->notices);
-
             $this->raw($atom->getString());
 
             break;
index 6a7398746ae8f8ec2a5916812f588202c2487f8d..d4ea11cb7e9deb03b3857e4abff3ee4608d5cd76 100644 (file)
@@ -301,6 +301,10 @@ class AvatarsettingsAction extends AccountSettingsAction
             $this->showForm($e->getMessage());
             return;
         }
+        if ($imagefile === null) {
+            $this->showForm(_('No file uploaded.'));
+            return;
+        }
 
         $cur = common_current_user();
 
index 6fd74f3ff7889bf40e55d9df9343edecb0d10e6c..cc8351d8dcc0309ae593b77e120688fb571602c9 100644 (file)
@@ -141,7 +141,7 @@ class ConfirmaddressAction extends Action
 
     function title()
     {
-        return _('Confirm Address');
+        return _('Confirm address');
     }
 
     /**
index c4f84fad2d82d03711b703891bd1045c8862b8ff..4e6b27395389406f627cec8bed330ebfe62b274f 100644 (file)
@@ -162,7 +162,15 @@ class DeleteuserAction extends ProfileFormAction
     function handlePost()
     {
         if (Event::handle('StartDeleteUser', array($this, $this->user))) {
-            $this->user->delete();
+            // Mark the account as deleted and shove low-level deletion tasks
+            // to background queues. Removing a lot of posts can take a while...
+            if (!$this->user->hasRole(Profile_role::DELETED)) {
+                $this->user->grantRole(Profile_role::DELETED);
+            }
+
+            $qm = QueueManager::get();
+            $qm->enqueue($this->user, 'deluser');
+
             Event::handle('EndDeleteUser', array($this, $this->user));
         }
     }
index e9f67b7f2bd0208e248bff5d30a8857a9e4d5113..fc2ec9b12f20c9b0ac93d95c100e8bc200ef1ba4 100644 (file)
@@ -251,7 +251,7 @@ class FoafAction extends Action
         }
 
         // Their account
-        $this->elementStart('holdsAccount');
+        $this->elementStart('account');
         $this->elementStart('OnlineAccount', $attr);
         if ($service) {
             $this->element('accountServiceHomepage', array('rdf:resource' =>
@@ -306,7 +306,7 @@ class FoafAction extends Action
         }
 
         $this->elementEnd('OnlineAccount');
-        $this->elementEnd('holdsAccount');
+        $this->elementEnd('account');
 
         return $person;
     }
index ebdf1cee2567555748fe04e9423203f4f1a7131b..d685554ac4dd8aa5a9ac402daaf5ede07240e03a 100644 (file)
@@ -146,7 +146,7 @@ class FoafGroupAction extends Action
             {
                 $this->elementStart('Agent', array('rdf:about' => $uri));
                 $this->element('nick', null, $details['nickname']);
-                $this->elementStart('holdsAccount');
+                $this->elementStart('account');
                 $this->elementStart('sioc:User', array('rdf:about'=>$uri.'#acct'));
                 $this->elementStart('sioc:has_function');
                 $this->elementStart('statusnet:GroupAdminRole');
@@ -154,7 +154,7 @@ class FoafGroupAction extends Action
                 $this->elementEnd('statusnet:GroupAdminRole');
                 $this->elementEnd('sioc:has_function');
                 $this->elementEnd('sioc:User');
-                $this->elementEnd('holdsAccount');
+                $this->elementEnd('account');
                 $this->elementEnd('Agent');
             }
             else
@@ -177,4 +177,4 @@ class FoafGroupAction extends Action
         $this->elementEnd('Document');
     }
 
-}
\ No newline at end of file
+}
index d0ed64ec9079449ec3d9013973aab5e912257a6b..54b2de62ac910e3792f902495c54a4554e81a79c 100644 (file)
@@ -194,7 +194,8 @@ class InviteAction extends CurrentUserDesignAction
                         _('Optionally add a personal message to the invitation.'));
         $this->elementEnd('li');
         $this->elementEnd('ul');
-        $this->submit('send', _('Send'));
+        // TRANS: Send button for inviting friends
+        $this->submit('send', _m('BUTTON', 'Send'));
         $this->elementEnd('fieldset');
         $this->elementEnd('form');
     }
index 0de7cd90860b1a7cc26198a4e033c5820bb4ef5a..10e9873b390b16f6cbc7e0d849a0c6d770a9814a 100644 (file)
@@ -57,7 +57,7 @@ class OthersettingsAction extends AccountSettingsAction
 
     function title()
     {
-        return _('Other Settings');
+        return _('Other settings');
     }
 
     /**
index 50278bfcedab55a80c9fe2c2ed359ad79399e727..0b3b5fde846fd23b2cbb4aedcce78e25f71363a8 100644 (file)
@@ -94,6 +94,7 @@ class PublicAction extends Action
         }
 
         if($this->page > 1 && $this->notice->N == 0){
+            // TRANS: Server error when page not found (404)
             $this->serverError(_('No such page'),$code=404);
         }
 
index dcff35f6ed32dddc72da3689c0cb4456c92428ef..f9956897f69918f1efa634db6149c9f1a0452a4f 100644 (file)
@@ -21,7 +21,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
 # You have 24 hours to claim your password
 
-define(MAX_RECOVERY_TIME, 24 * 60 * 60);
+define('MAX_RECOVERY_TIME', 24 * 60 * 60);
 
 class RecoverpasswordAction extends Action
 {
@@ -262,10 +262,20 @@ class RecoverpasswordAction extends Action
         # See if it's an unconfirmed email address
 
         if (!$user) {
-            $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
-            if ($confirm_email && $confirm_email->address_type == 'email') {
+            // Warning: it may actually be legit to have multiple folks
+            // who have claimed, but not yet confirmed, the same address.
+            // We'll only send to the first one that comes up.
+            $confirm_email = new Confirm_address();
+            $confirm_email->address = common_canonical_email($nore);
+            $confirm_email->address_type = 'email';
+            $confirm_email->find();
+            if ($confirm_email->fetch()) {
                 $user = User::staticGet($confirm_email->user_id);
+            } else {
+                $confirm_email = null;
             }
+        } else {
+            $confirm_email = null;
         }
 
         if (!$user) {
@@ -276,9 +286,11 @@ class RecoverpasswordAction extends Action
         # Try to get an unconfirmed email address if they used a user name
 
         if (!$user->email && !$confirm_email) {
-            $confirm_email = Confirm_address::staticGet('user_id', $user->id);
-            if ($confirm_email && $confirm_email->address_type != 'email') {
-                # Skip non-email confirmations
+            $confirm_email = new Confirm_address();
+            $confirm_email->user_id = $user->id;
+            $confirm_email->address_type = 'email';
+            $confirm_email->find();
+            if (!$confirm_email->fetch()) {
                 $confirm_email = null;
             }
         }
@@ -294,7 +306,7 @@ class RecoverpasswordAction extends Action
         $confirm->code = common_confirmation_code(128);
         $confirm->address_type = 'recover';
         $confirm->user_id = $user->id;
-        $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
+        $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address;
 
         if (!$confirm->insert()) {
             common_log_db_error($confirm, 'INSERT', __FILE__);
@@ -319,7 +331,8 @@ class RecoverpasswordAction extends Action
         $body .= common_config('site', 'name');
         $body .= "\n";
 
-        mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
+        $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname);
+        mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address);
 
         $this->mode = 'sent';
         $this->msg = _('Instructions for recovering your password ' .
index 164c328db3cd6e0f4749f11543254899f79e4acb..4ff1b7a8d20e7e8549d095ba838cfe82760b4760 100644 (file)
@@ -89,6 +89,7 @@ class RepliesAction extends OwnerDesignAction
              NOTICES_PER_PAGE + 1);
 
         if($this->page > 1 && $this->notice->N == 0){
+            // TRANS: Server error when page not found (404)
             $this->serverError(_('No such page'),$code=404);
         }
 
index f2d0822936bc562c9014b4b531ec2eb3d2fdaf17..5b85de6835d704c610a0dfc0e20b24f606569da7 100644 (file)
@@ -134,6 +134,7 @@ class ShowfavoritesAction extends OwnerDesignAction
         }
 
         if($this->page > 1 && $this->notice->N == 0){
+            // TRANS: Server error when page not found (404)
             $this->serverError(_('No such page'),$code=404);
         }
 
index d09100f676aaf473e46e54aadd409f6ff1b1eb0c..a23027f7c5f6858f308008c647c9e21fe576691e 100644 (file)
@@ -103,11 +103,6 @@ class ShownoticeAction extends OwnerDesignAction
 
         $this->user = User::staticGet('id', $this->profile->id);
 
-        if ($this->notice->is_local == Notice::REMOTE_OMB) {
-            common_redirect($this->notice->uri);
-            return false;
-        }
-
         $this->avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
 
         return true;
@@ -198,13 +193,20 @@ class ShownoticeAction extends OwnerDesignAction
 
         if ($this->notice->is_local == Notice::REMOTE_OMB) {
             if (!empty($this->notice->url)) {
-                common_redirect($this->notice->url, 301);
+                $target = $this->notice->url;
             } else if (!empty($this->notice->uri) && preg_match('/^https?:/', $this->notice->uri)) {
-                common_redirect($this->notice->uri, 301);
+                // Old OMB posts saved the remote URL only into the URI field.
+                $target = $this->notice->uri;
+            } else {
+                // Shouldn't happen.
+                $target = false;
+            }
+            if ($target && $target != $this->selfUrl()) {
+                common_redirect($target, 301);
+                return false;
             }
-        } else {
-            $this->showPage();
         }
+        $this->showPage();
     }
 
     /**
index cb3c2e8fde7f4ee5339cd0a476fd0a9a1238db19..e5482987fb02cf3a57fdc44713139936d99b34ad 100644 (file)
@@ -161,8 +161,8 @@ class SiteadminpanelAction extends AdminPanelAction
 
         // Validate text limit
 
-        if (!Validate::number($values['site']['textlimit'], array('min' => 140))) {
-            $this->clientError(_("Minimum text limit is 140 characters."));
+        if (!Validate::number($values['site']['textlimit'], array('min' => 0))) {
+            $this->clientError(_("Minimum text limit is 0 (unlimited)."));
         }
 
         // Validate dupe limit
index 3931aa9825f7482ca81ac8e9a8dec148cd51db9f..a68cc699ca5cb52cb529724e3c7637f23fc04659 100644 (file)
@@ -93,7 +93,7 @@ class SitenoticeadminpanelAction extends AdminPanelAction
         // assert(all values are valid);
         // This throws an exception on validation errors
 
-        $this->validate(&$siteNotice);
+        $this->validate($siteNotice);
 
         $config = new Config();
 
index e91df6ea97525752b1ea7e945b5e75d64ce95ddb..ee9617b662cd1d4185a00c2c6f142e511ff94042 100644 (file)
@@ -48,6 +48,7 @@ class TagAction extends Action
         $this->notice = Notice_tag::getStream($this->tag, (($this->page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
 
         if($this->page > 1 && $this->notice->N == 0){
+            // TRANS: Server error when page not found (404)
             $this->serverError(_('No such page'),$code=404);
         }
 
index 6813222f5f2b60e36f45f51ed36b481e832dfead..ee9c23076903cdefe939350ae5562ca784de0287 100644 (file)
@@ -55,7 +55,8 @@ class UseradminpanelAction extends AdminPanelAction
 
     function title()
     {
-        return _('User');
+        // TRANS: User admin panel title
+        return _m('TITLE', 'User');
     }
 
     /**
index c1f673c45c04844db093dccb2c7c9304c4bad3a2..b6593e5edb09cbdfe061201abf2ad13d2fcd1c49 100644 (file)
@@ -266,5 +266,6 @@ class VersionAction extends Action
                               'Craig Andrews',
                               'mEDI',
                               'Brett Taylor',
-                              'Brigitte Schuster');
+                              'Brigitte Schuster',
+                              'Brion Vibber');
 }
index ba8332841409f936c5c3e28ad615fef34e479151..33273bbdccb577047e545f77504da008cd31fd35 100644 (file)
@@ -194,7 +194,11 @@ class File extends Memcached_DataObject
     {
         require_once 'MIME/Type/Extension.php';
         $mte = new MIME_Type_Extension();
-        $ext = $mte->getExtension($mimetype);
+        try {
+            $ext = $mte->getExtension($mimetype);
+        } catch ( Exception $e) {
+            $ext = strtolower(preg_replace('/\W/', '', $mimetype));
+        }
         $nickname = $profile->nickname;
         $datestamp = strftime('%Y%m%dT%H%M%S', time());
         $random = strtolower(common_confirmation_code(32));
@@ -281,7 +285,7 @@ class File extends Memcached_DataObject
         $enclosure->mimetype=$this->mimetype;
 
         if(! isset($this->filename)){
-            $notEnclosureMimeTypes = array('text/html','application/xhtml+xml');
+            $notEnclosureMimeTypes = array(null,'text/html','application/xhtml+xml');
             $mimetype = strtolower($this->mimetype);
             $semicolon = strpos($mimetype,';');
             if($semicolon){
index be3d0a6c6f09583479d379594d08fef2dba6f18d..c5a1895a11e32988e4ca91277e36f8d53bc13941 100644 (file)
@@ -34,7 +34,7 @@ class Group_alias extends Memcached_DataObject
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
     /* Static get */
-    function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Group_alias',$k,$v); }
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Group_alias',$k,$v); }
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
index 4c7e6ab4b708e7452e34dbc338fa0161cd919a83..f7194e3394ee893c24fd63a1f3c97a36093abd13 100644 (file)
@@ -119,6 +119,9 @@ class Notice extends Memcached_DataObject
         // NOTE: we don't clear queue items
 
         $result = parent::delete();
+
+        $this->blowOnDelete();
+        return $result;
     }
 
     /**
@@ -421,6 +424,18 @@ class Notice extends Memcached_DataObject
         $profile->blowNoticeCount();
     }
 
+    /**
+     * Clear cache entries related to this notice at delete time.
+     * Necessary to avoid breaking paging on public, profile timelines.
+     */
+    function blowOnDelete()
+    {
+        $this->blowOnInsert();
+
+        self::blow('profile:notice_ids:%d;last', $this->profile_id);
+        self::blow('public;last');
+    }
+
     /** save all urls in the notice to the db
      *
      * follow redirects and save all available file information
@@ -589,7 +604,6 @@ class Notice extends Memcached_DataObject
                               array(),
                               'public',
                               $offset, $limit, $since_id, $max_id);
-
         return Notice::getStreamByIds($ids);
     }
 
@@ -1128,6 +1142,7 @@ class Notice extends Memcached_DataObject
 
         if ($source) {
             $xs->elementStart('source');
+            $xs->element('id', null, $profile->profileurl);
             $xs->element('title', null, $profile->nickname . " - " . common_config('site', 'name'));
             $xs->element('link', array('href' => $profile->profileurl));
             $user = User::staticGet('id', $profile->id);
@@ -1143,13 +1158,14 @@ class Notice extends Memcached_DataObject
             }
 
             $xs->element('icon', null, $profile->avatarUrl(AVATAR_PROFILE_SIZE));
+            $xs->element('updated', null, common_date_w3dtf($this->created));
         }
 
         if ($source) {
             $xs->elementEnd('source');
         }
 
-        $xs->element('title', null, $this->content);
+        $xs->element('title', null, common_xml_safe_str($this->content));
 
         if ($author) {
             $xs->raw($profile->asAtomAuthor());
@@ -1225,7 +1241,11 @@ class Notice extends Memcached_DataObject
             }
         }
 
-        $xs->element('content', array('type' => 'html'), $this->rendered);
+        $xs->element(
+            'content',
+            array('type' => 'html'),
+            common_xml_safe_str($this->rendered)
+        );
 
         $tag = new Notice_tag();
         $tag->notice_id = $this->id;
index 91f6e4692216b52bafec13eb5e6ce34055be1960..eded1ff71fcc84a2a4ec9c59dd16b9b73eafe703 100644 (file)
@@ -732,6 +732,9 @@ class Profile extends Memcached_DataObject
     function hasRight($right)
     {
         $result = false;
+        if ($this->hasRole(Profile_role::DELETED)) {
+            return false;
+        }
         if (Event::handle('UserRightsCheck', array($this, $right, &$result))) {
             switch ($right)
             {
index d0a0b31f0f86b6662efc8efeec85d72940b6803e..e7aa1f0f0675b45bb07145c1831fe6a18e2fd31b 100644 (file)
@@ -53,6 +53,7 @@ class Profile_role extends Memcached_DataObject
     const ADMINISTRATOR = 'administrator';
     const SANDBOXED     = 'sandboxed';
     const SILENCED      = 'silenced';
+    const DELETED       = 'deleted'; // Pending final deletion of notices...
 
     public static function isValid($role)
     {
index 5ac95f92222a1aa9b80f12b5610859645a9b1510..60c12cccc3d8d67545679355d2eb944e6e9f0612 100644 (file)
@@ -62,6 +62,14 @@ class Subscription extends Memcached_DataObject
 
     static function start($subscriber, $other)
     {
+        // @fixme should we enforce this as profiles in callers instead?
+        if ($subscriber instanceof User) {
+            $subscriber = $subscriber->getProfile();
+        }
+        if ($other instanceof User) {
+            $other = $other->getProfile();
+        }
+
         if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
             throw new Exception(_('You have been banned from subscribing.'));
         }
@@ -75,20 +83,7 @@ class Subscription extends Memcached_DataObject
         }
 
         if (Event::handle('StartSubscribe', array($subscriber, $other))) {
-
-            $sub = new Subscription();
-
-            $sub->subscriber = $subscriber->id;
-            $sub->subscribed = $other->id;
-            $sub->created    = common_sql_now();
-
-            $result = $sub->insert();
-
-            if (!$result) {
-                common_log_db_error($sub, 'INSERT', __FILE__);
-                throw new Exception(_('Could not save subscription.'));
-            }
-
+            $sub = self::saveNew($subscriber->id, $other->id);
             $sub->notify();
 
             self::blow('user:notices_with_friends:%d', $subscriber->id);
@@ -103,20 +98,11 @@ class Subscription extends Memcached_DataObject
                 !self::exists($other, $subscriber) &&
                 !$subscriber->hasBlocked($other)) {
 
-                $auto = new Subscription();
-
-                $auto->subscriber = $other->id;
-                $auto->subscribed = $subscriber->id;
-                $auto->created    = common_sql_now();
-
-                $result = $auto->insert();
-
-                if (!$result) {
-                    common_log_db_error($auto, 'INSERT', __FILE__);
-                    throw new Exception(_('Could not save subscription.'));
+                try {
+                    self::start($other, $subscriber);
+                } catch (Exception $e) {
+                    common_log(LOG_ERR, "Exception during autosubscribe of {$other->nickname} to profile {$subscriber->id}: {$e->getMessage()}");
                 }
-
-                $auto->notify();
             }
 
             Event::handle('EndSubscribe', array($subscriber, $other));
@@ -125,6 +111,30 @@ class Subscription extends Memcached_DataObject
         return true;
     }
 
+    /**
+     * Low-level subscription save.
+     * Outside callers should use Subscription::start()
+     */
+    protected function saveNew($subscriber_id, $other_id)
+    {
+        $sub = new Subscription();
+
+        $sub->subscriber = $subscriber_id;
+        $sub->subscribed = $other_id;
+        $sub->jabber     = 1;
+        $sub->sms        = 1;
+        $sub->created    = common_sql_now();
+
+        $result = $sub->insert();
+
+        if (!$result) {
+            common_log_db_error($sub, 'INSERT', __FILE__);
+            throw new Exception(_('Could not save subscription.'));
+        }
+
+        return $sub;
+    }
+
     function notify()
     {
         # XXX: add other notifications (Jabber, SMS) here
index 0b25b71a032a0476516089990467cc5edde97eb9..8ad2ec63d5c81d12cbf6c3b35c7eb41b8cac5e60 100644 (file)
@@ -153,19 +153,12 @@ class User extends Memcached_DataObject
         return Sms_carrier::staticGet('id', $this->carrier);
     }
 
+    /**
+     * @deprecated use Subscription::start($sub, $other);
+     */
     function subscribeTo($other)
     {
-        $sub = new Subscription();
-        $sub->subscriber = $this->id;
-        $sub->subscribed = $other->id;
-
-        $sub->created = common_sql_now(); // current time
-
-        if (!$sub->insert()) {
-            return false;
-        }
-
-        return true;
+        return Subscription::start($this->getProfile(), $other);
     }
 
     function hasBlocked($other)
@@ -213,6 +206,7 @@ class User extends Memcached_DataObject
         if(! User::allowed_nickname($nickname)){
             common_log(LOG_WARNING, sprintf("Attempted to register a nickname that is not allowed: %s", $profile->nickname),
                        __FILE__);
+            return false;
         }
         $profile->profileurl = common_profile_url($nickname);
 
@@ -345,17 +339,7 @@ class User extends Memcached_DataObject
                     common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick),
                                __FILE__);
                 } else {
-                    $defsub = new Subscription();
-                    $defsub->subscriber = $user->id;
-                    $defsub->subscribed = $defuser->id;
-                    $defsub->created = $user->created;
-
-                    $result = $defsub->insert();
-
-                    if (!$result) {
-                        common_log_db_error($defsub, 'INSERT', __FILE__);
-                        return false;
-                    }
+                    Subscription::start($user, $defuser);
                 }
             }
 
index 0460c9870a34cb318ed1c21a34429ea46059720e..110f0830125f0cbe64389e61d2d5d510281c5697 100644 (file)
@@ -295,7 +295,7 @@ class User_group extends Memcached_DataObject
         }
 
         // If not, check local groups.
-    
+
         $group = Local_group::staticGet('nickname', $nickname);
         if (!empty($group)) {
             return User_group::staticGet('id', $group->group_id);
@@ -371,16 +371,15 @@ class User_group extends Memcached_DataObject
 
         if ($source) {
             $xs->elementStart('source');
+            $xs->element('id', null, $this->permalink());
             $xs->element('title', null, $profile->nickname . " - " . common_config('site', 'name'));
             $xs->element('link', array('href' => $this->permalink()));
-        }
-
-        if ($source) {
+            $xs->element('updated', null, $this->modified);
             $xs->elementEnd('source');
         }
 
         $xs->element('title', null, $this->nickname);
-        $xs->element('summary', null, $this->description);
+        $xs->element('summary', null, common_xml_safe_str($this->description));
 
         $xs->element('link', array('rel' => 'alternate',
                                    'href' => $this->permalink()));
@@ -390,7 +389,11 @@ class User_group extends Memcached_DataObject
         $xs->element('published', null, common_date_w3dtf($this->created));
         $xs->element('updated', null, common_date_w3dtf($this->modified));
 
-        $xs->element('content', array('type' => 'html'), $this->description);
+        $xs->element(
+            'content',
+            array('type' => 'html'),
+            common_xml_safe_str($this->description)
+        );
 
         $xs->elementEnd('entry');
 
@@ -455,7 +458,7 @@ class User_group extends Memcached_DataObject
         $group = new User_group();
 
         $group->query('BEGIN');
-        
+
         if (empty($uri)) {
             // fill in later...
             $uri = null;
@@ -483,7 +486,7 @@ class User_group extends Memcached_DataObject
             $result = $group->update($orig);
             if (!$result) {
                 common_log_db_error($group, 'UPDATE', __FILE__);
-                throw new ServerException(_('Could not set group uri.'));
+                throw new ServerException(_('Could not set group URI.'));
             }
         }
 
index 853fd5cb86a109f28a69569c293d78d0837fcc2a..8d99cddd3f6cbdd3661ebb61f3d81e5b9e4632af 100644 (file)
@@ -55,7 +55,7 @@ class User_username extends Memcached_DataObject
 
     // now define the keys.
     function keys() {
-        return array('provider_name', 'username');
+        return array('provider_name' => 'K', 'username' => 'K');
     }
 
 }
index 3d2a52beccefe943824a80a289589df4a8a6c652..20de7ffedfb72acc5df9808add46e1703d4a0273 100644 (file)
@@ -197,7 +197,7 @@ $config['sphinx']['port'] = 3312;
 //
 // $config['twitterimport']['enabled'] = true;
 
-// Twitter OAuth settings
+// Twitter OAuth settings. Documentation is at http://apiwiki.twitter.com/OAuth-FAQ
 // $config['twitter']['consumer_key']    = 'YOURKEY';
 // $config['twitter']['consumer_secret'] = 'YOURSECRET';
 
@@ -268,6 +268,8 @@ $config['sphinx']['port'] = 3312;
 // Support for file uploads (attachments),
 // select supported mimetypes and quotas (in bytes)
 // $config['attachments']['supported'] = array('image/png', 'application/ogg');
+// $config['attachments']['supported'] = true; //allow all file types to be uploaded
+
 // $config['attachments']['file_quota'] = 5000000;
 // $config['attachments']['user_quota'] = 50000000;
 // $config['attachments']['monthly_quota'] = 15000000;
index 37eb8e01ec01f1169159a1b920c265c00b9bfdc2..18a868698c1dc63e0c53554a0aa5fb13e92732c7 100644 (file)
@@ -5,6 +5,11 @@
 
   RewriteBase /mublog/
 
+  ## Uncomment these if having trouble with API authentication
+  ## when PHP is running in CGI or FastCGI mode.
+  #RewriteCond %{HTTP:Authorization} ^(.*)
+  #RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
+
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule (.*) index.php?p=$1 [L,QSA]
index 36ba3a0d2163915fa700ef0373b5ee65fa317c63..ea5c802779eb9aaf4cb623fcc95ef989f578a63b 100644 (file)
--- a/index.php
+++ b/index.php
@@ -324,10 +324,10 @@ function main()
             $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode());
             $cac->showPage();
         } catch (ServerException $sex) { // snort snort guffaw
-            $sac = new ServerErrorAction($sex->getMessage(), $sex->getCode());
+            $sac = new ServerErrorAction($sex->getMessage(), $sex->getCode(), $sex);
             $sac->showPage();
         } catch (Exception $ex) {
-            $sac = new ServerErrorAction($ex->getMessage());
+            $sac = new ServerErrorAction($ex->getMessage(), 500, $ex);
             $sac->showPage();
         }
     }
index 9884f529c9e1b970d3d708d437a2c9ed179aa4e4..491d7d4810e17ee0db73a36ef0bc8702cfb15161 100644 (file)
@@ -426,39 +426,69 @@ class Action extends HTMLOutputter // lawsuit
         $this->elementStart('ul', array('class' => 'nav'));
         if (Event::handle('StartPrimaryNav', array($this))) {
             if ($user) {
+                // TRANS: Tooltip for main menu option "Personal"
+                $tooltip = _m('TOOLTIP', 'Personal profile and friends timeline');
+                // TRANS: Main menu option when logged in for access to personal profile and friends timeline
                 $this->menuItem(common_local_url('all', array('nickname' => $user->nickname)),
-                                _('Home'), _('Personal profile and friends timeline'), false, 'nav_home');
+                                _m('MENU', 'Personal'), $tooltip, false, 'nav_home');
+                // TRANS: Tooltip for main menu option "Account"
+                $tooltip = _m('TOOLTIP', 'Change your email, avatar, password, profile');
+                // TRANS: Main menu option when logged in for access to user settings
                 $this->menuItem(common_local_url('profilesettings'),
-                                _('Account'), _('Change your email, avatar, password, profile'), false, 'nav_account');
+                                _('Account'), $tooltip, false, 'nav_account');
+                // TRANS: Tooltip for main menu option "Services"
+                $tooltip = _m('TOOLTIP', 'Connect to services');
+                // TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services
                 $this->menuItem(common_local_url('oauthconnectionssettings'),
-                                _('Connect'), _('Connect to services'), false, 'nav_connect');
+                                _('Connect'), $tooltip, false, 'nav_connect');
                 if ($user->hasRight(Right::CONFIGURESITE)) {
+                    // TRANS: Tooltip for menu option "Admin"
+                    $tooltip = _m('TOOLTIP', 'Change site configuration');
+                    // TRANS: Main menu option when logged in and site admin for access to site configuration
                     $this->menuItem(common_local_url('siteadminpanel'),
-                                    _('Admin'), _('Change site configuration'), false, 'nav_admin');
+                                    _m('MENU', 'Admin'), $tooltip, false, 'nav_admin');
                 }
                 if (common_config('invite', 'enabled')) {
+                    // TRANS: Tooltip for main menu option "Invite"
+                    $tooltip = _m('TOOLTIP', 'Invite friends and colleagues to join you on %s');
+                    // TRANS: Main menu option when logged in and invitations are allowed for inviting new users
                     $this->menuItem(common_local_url('invite'),
-                                    _('Invite'),
-                                    sprintf(_('Invite friends and colleagues to join you on %s'),
+                                    _m('MENU', 'Invite'),
+                                    sprintf($tooltip,
                                             common_config('site', 'name')),
                                     false, 'nav_invitecontact');
                 }
+                // TRANS: Tooltip for main menu option "Logout"
+                $tooltip = _m('TOOLTIP', 'Logout from the site');
+                // TRANS: Main menu option when logged in to log out the current user
                 $this->menuItem(common_local_url('logout'),
-                                _('Logout'), _('Logout from the site'), false, 'nav_logout');
+                                _m('MENU', 'Logout'), $tooltip, false, 'nav_logout');
             }
             else {
                 if (!common_config('site', 'closed')) {
+                    // TRANS: Tooltip for main menu option "Register"
+                    $tooltip = _m('TOOLTIP', 'Create an account');
+                    // TRANS: Main menu option when not logged in to register a new account
                     $this->menuItem(common_local_url('register'),
-                                    _('Register'), _('Create an account'), false, 'nav_register');
+                                    _m('MENU', 'Register'), $tooltip, false, 'nav_register');
                 }
+                // TRANS: Tooltip for main menu option "Login"
+                $tooltip = _m('TOOLTIP', 'Login to the site');
+                // TRANS: Main menu option when not logged in to log in
                 $this->menuItem(common_local_url('login'),
-                                _('Login'), _('Login to the site'), false, 'nav_login');
+                                _m('MENU', 'Login'), $tooltip, false, 'nav_login');
             }
+            // TRANS: Tooltip for main menu option "Help"
+            $tooltip = _m('TOOLTIP', 'Help me!');
+            // TRANS: Main menu option for help on the StatusNet site
             $this->menuItem(common_local_url('doc', array('title' => 'help')),
-                            _('Help'), _('Help me!'), false, 'nav_help');
+                            _m('MENU', 'Help'), $tooltip, false, 'nav_help');
             if ($user || !common_config('site', 'private')) {
+                // TRANS: Tooltip for main menu option "Search"
+                $tooltip = _m('TOOLTIP', 'Search for people or text');
+                // TRANS: Main menu option when logged in or when the StatusNet instance is not private
                 $this->menuItem(common_local_url('peoplesearch'),
-                                _('Search'), _('Search for people or text'), false, 'nav_search');
+                                _m('MENU', 'Search'), $tooltip, false, 'nav_search');
             }
             Event::handle('EndPrimaryNav', array($this));
         }
@@ -479,6 +509,7 @@ class Action extends HTMLOutputter // lawsuit
         if ($text) {
             $this->elementStart('dl', array('id' => 'site_notice',
                                             'class' => 'system_notice'));
+            // TRANS: DT element for site notice. String is hidden in default CSS.
             $this->element('dt', null, _('Site notice'));
             $this->elementStart('dd', null);
             $this->raw($text);
index 2cb80f9e1a26bba80f94c19822b41f4db67fc0b1..f9192c6b80061d4c5caeddfc07f16083e0ab7135 100644 (file)
@@ -32,971 +32,6 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-class PoCoURL
-{
-    const URLS      = 'urls';
-    const TYPE      = 'type';
-    const VALUE     = 'value';
-    const PRIMARY   = 'primary';
-
-    public $type;
-    public $value;
-    public $primary;
-
-    function __construct($type, $value, $primary = false)
-    {
-        $this->type    = $type;
-        $this->value   = $value;
-        $this->primary = $primary;
-    }
-
-    function asString()
-    {
-        $xs = new XMLStringer(true);
-        $xs->elementStart('poco:urls');
-        $xs->element('poco:type', null, $this->type);
-        $xs->element('poco:value', null, $this->value);
-        if (!empty($this->primary)) {
-            $xs->element('poco:primary', null, 'true');
-        }
-        $xs->elementEnd('poco:urls');
-        return $xs->getString();
-    }
-}
-
-class PoCoAddress
-{
-    const ADDRESS   = 'address';
-    const FORMATTED = 'formatted';
-
-    public $formatted;
-
-    // @todo Other address fields
-
-    function asString()
-    {
-        if (!empty($this->formatted)) {
-            $xs = new XMLStringer(true);
-            $xs->elementStart('poco:address');
-            $xs->element('poco:formatted', null, $this->formatted);
-            $xs->elementEnd('poco:address');
-            return $xs->getString();
-        }
-
-        return null;
-    }
-}
-
-class PoCo
-{
-    const NS = 'http://portablecontacts.net/spec/1.0';
-
-    const USERNAME     = 'preferredUsername';
-    const DISPLAYNAME  = 'displayName';
-    const NOTE         = 'note';
-
-    public $preferredUsername;
-    public $displayName;
-    public $note;
-    public $address;
-    public $urls = array();
-
-    function __construct($element = null)
-    {
-        if (empty($element)) {
-            return;
-        }
-
-        $this->preferredUsername = ActivityUtils::childContent(
-            $element,
-            self::USERNAME,
-            self::NS
-        );
-
-        $this->displayName = ActivityUtils::childContent(
-            $element,
-            self::DISPLAYNAME,
-            self::NS
-        );
-
-        $this->note = ActivityUtils::childContent(
-            $element,
-            self::NOTE,
-            self::NS
-        );
-
-        $this->address = $this->_getAddress($element);
-        $this->urls = $this->_getURLs($element);
-    }
-
-    private function _getURLs($element)
-    {
-        $urlEls = $element->getElementsByTagnameNS(self::NS, PoCoURL::URLS);
-        $urls = array();
-
-        foreach ($urlEls as $urlEl) {
-
-            $type = ActivityUtils::childContent(
-                $urlEl,
-                PoCoURL::TYPE,
-                PoCo::NS
-            );
-
-            $value = ActivityUtils::childContent(
-                $urlEl,
-                PoCoURL::VALUE,
-                PoCo::NS
-            );
-
-            $primary = ActivityUtils::childContent(
-                $urlEl,
-                PoCoURL::PRIMARY,
-                PoCo::NS
-            );
-
-            $isPrimary = false;
-
-            if (isset($primary) && $primary == 'true') {
-                $isPrimary = true;
-            }
-
-            // @todo check to make sure a primary hasn't already been added
-
-            array_push($urls, new PoCoURL($type, $value, $isPrimary));
-        }
-        return $urls;
-    }
-
-    private function _getAddress($element)
-    {
-        $addressEl = ActivityUtils::child(
-            $element,
-            PoCoAddress::ADDRESS,
-            PoCo::NS
-        );
-
-        if (!empty($addressEl)) {
-            $formatted = ActivityUtils::childContent(
-                $addressEl,
-                PoCoAddress::FORMATTED,
-                self::NS
-            );
-
-            if (!empty($formatted)) {
-                $address = new PoCoAddress();
-                $address->formatted = $formatted;
-                return $address;
-            }
-        }
-
-        return null;
-    }
-
-    function fromProfile($profile)
-    {
-        if (empty($profile)) {
-            return null;
-        }
-
-        $poco = new PoCo();
-
-        $poco->preferredUsername = $profile->nickname;
-        $poco->displayName       = $profile->getBestName();
-
-        $poco->note = $profile->bio;
-
-        $paddy = new PoCoAddress();
-        $paddy->formatted = $profile->location;
-        $poco->address = $paddy;
-
-        if (!empty($profile->homepage)) {
-            array_push(
-                $poco->urls,
-                new PoCoURL(
-                    'homepage',
-                    $profile->homepage,
-                    true
-                )
-            );
-        }
-
-        return $poco;
-    }
-
-    function fromGroup($group)
-    {
-        if (empty($group)) {
-            return null;
-        }
-
-        $poco = new PoCo();
-
-        $poco->preferredUsername = $group->nickname;
-        $poco->displayName       = $group->getBestName();
-
-        $poco->note = $group->description;
-
-        $paddy = new PoCoAddress();
-        $paddy->formatted = $group->location;
-        $poco->address = $paddy;
-
-        if (!empty($group->homepage)) {
-            array_push(
-                $poco->urls,
-                new PoCoURL(
-                    'homepage',
-                    $group->homepage,
-                    true
-                )
-            );
-        }
-
-        return $poco;
-    }
-
-    function getPrimaryURL()
-    {
-        foreach ($this->urls as $url) {
-            if ($url->primary) {
-                return $url;
-            }
-        }
-    }
-
-    function asString()
-    {
-        $xs = new XMLStringer(true);
-        $xs->element(
-            'poco:preferredUsername',
-            null,
-            $this->preferredUsername
-        );
-
-        $xs->element(
-            'poco:displayName',
-            null,
-            $this->displayName
-        );
-
-        if (!empty($this->note)) {
-            $xs->element('poco:note', null, $this->note);
-        }
-
-        if (!empty($this->address)) {
-            $xs->raw($this->address->asString());
-        }
-
-        foreach ($this->urls as $url) {
-            $xs->raw($url->asString());
-        }
-
-        return $xs->getString();
-    }
-}
-
-/**
- * Utilities for turning DOMish things into Activityish things
- *
- * Some common functions that I didn't have the bandwidth to try to factor
- * into some kind of reasonable superclass, so just dumped here. Might
- * be useful to have an ActivityObject parent class or something.
- *
- * @category  OStatus
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link      http://status.net/
- */
-
-class ActivityUtils
-{
-    const ATOM = 'http://www.w3.org/2005/Atom';
-
-    const LINK = 'link';
-    const REL  = 'rel';
-    const TYPE = 'type';
-    const HREF = 'href';
-
-    const CONTENT = 'content';
-    const SRC     = 'src';
-
-    /**
-     * Get the permalink for an Activity object
-     *
-     * @param DOMElement $element A DOM element
-     *
-     * @return string related link, if any
-     */
-
-    static function getPermalink($element)
-    {
-        return self::getLink($element, 'alternate', 'text/html');
-    }
-
-    /**
-     * Get the permalink for an Activity object
-     *
-     * @param DOMElement $element A DOM element
-     *
-     * @return string related link, if any
-     */
-
-    static function getLink(DOMNode $element, $rel, $type=null)
-    {
-        $els = $element->childNodes;
-
-        foreach ($els as $link) {
-            if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) {
-
-                $linkRel = $link->getAttribute(self::REL);
-                $linkType = $link->getAttribute(self::TYPE);
-
-                if ($linkRel == $rel &&
-                    (is_null($type) || $linkType == $type)) {
-                    return $link->getAttribute(self::HREF);
-                }
-            }
-        }
-
-        return null;
-    }
-
-    static function getLinks(DOMNode $element, $rel, $type=null)
-    {
-        $els = $element->childNodes;
-        $out = array();
-
-        foreach ($els as $link) {
-            if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) {
-
-                $linkRel = $link->getAttribute(self::REL);
-                $linkType = $link->getAttribute(self::TYPE);
-
-                if ($linkRel == $rel &&
-                    (is_null($type) || $linkType == $type)) {
-                    $out[] = $link;
-                }
-            }
-        }
-
-        return $out;
-    }
-
-    /**
-     * Gets the first child element with the given tag
-     *
-     * @param DOMElement $element   element to pick at
-     * @param string     $tag       tag to look for
-     * @param string     $namespace Namespace to look under
-     *
-     * @return DOMElement found element or null
-     */
-
-    static function child(DOMNode $element, $tag, $namespace=self::ATOM)
-    {
-        $els = $element->childNodes;
-        if (empty($els) || $els->length == 0) {
-            return null;
-        } else {
-            for ($i = 0; $i < $els->length; $i++) {
-                $el = $els->item($i);
-                if ($el->localName == $tag && $el->namespaceURI == $namespace) {
-                    return $el;
-                }
-            }
-        }
-    }
-
-    /**
-     * Grab the text content of a DOM element child of the current element
-     *
-     * @param DOMElement $element   Element whose children we examine
-     * @param string     $tag       Tag to look up
-     * @param string     $namespace Namespace to use, defaults to Atom
-     *
-     * @return string content of the child
-     */
-
-    static function childContent(DOMNode $element, $tag, $namespace=self::ATOM)
-    {
-        $el = self::child($element, $tag, $namespace);
-
-        if (empty($el)) {
-            return null;
-        } else {
-            return $el->textContent;
-        }
-    }
-
-    /**
-     * Get the content of an atom:entry-like object
-     *
-     * @param DOMElement $element The element to examine.
-     *
-     * @return string unencoded HTML content of the element, like "This -&lt; is <b>HTML</b>."
-     *
-     * @todo handle remote content
-     * @todo handle embedded XML mime types
-     * @todo handle base64-encoded non-XML and non-text mime types
-     */
-
-    static function getContent($element)
-    {
-        $contentEl = ActivityUtils::child($element, self::CONTENT);
-
-        if (!empty($contentEl)) {
-
-            $src  = $contentEl->getAttribute(self::SRC);
-
-            if (!empty($src)) {
-                throw new ClientException(_("Can't handle remote content yet."));
-            }
-
-            $type = $contentEl->getAttribute(self::TYPE);
-
-            // slavishly following http://atompub.org/rfc4287.html#rfc.section.4.1.3.3
-
-            if ($type == 'text') {
-                return $contentEl->textContent;
-            } else if ($type == 'html') {
-                $text = $contentEl->textContent;
-                return htmlspecialchars_decode($text, ENT_QUOTES);
-            } else if ($type == 'xhtml') {
-                $divEl = ActivityUtils::child($contentEl, 'div');
-                if (empty($divEl)) {
-                    return null;
-                }
-                $doc = $divEl->ownerDocument;
-                $text = '';
-                $children = $divEl->childNodes;
-
-                for ($i = 0; $i < $children->length; $i++) {
-                    $child = $children->item($i);
-                    $text .= $doc->saveXML($child);
-                }
-                return trim($text);
-            } else if (in_array(array('text/xml', 'application/xml'), $type) ||
-                       preg_match('#(+|/)xml$#', $type)) {
-                throw new ClientException(_("Can't handle embedded XML content yet."));
-            } else if (strncasecmp($type, 'text/', 5)) {
-                return $contentEl->textContent;
-            } else {
-                throw new ClientException(_("Can't handle embedded Base64 content yet."));
-            }
-        }
-    }
-}
-
-// XXX: Arg! This wouldn't be necessary if we used Avatars conistently
-class AvatarLink
-{
-    public $url;
-    public $type;
-    public $size;
-    public $width;
-    public $height;
-
-    function __construct($element=null)
-    {
-        if ($element) {
-            // @fixme use correct namespaces
-            $this->url = $element->getAttribute('href');
-            $this->type = $element->getAttribute('type');
-            $width = $element->getAttribute('media:width');
-            if ($width != null) {
-                $this->width = intval($width);
-            }
-            $height = $element->getAttribute('media:height');
-            if ($height != null) {
-                $this->height = intval($height);
-            }
-        }
-    }
-
-    static function fromAvatar($avatar)
-    {
-        if (empty($avatar)) {
-            return null;
-        }
-        $alink = new AvatarLink();
-        $alink->type   = $avatar->mediatype;
-        $alink->height = $avatar->height;
-        $alink->width  = $avatar->width;
-        $alink->url    = $avatar->displayUrl();
-        return $alink;
-    }
-
-    static function fromFilename($filename, $size)
-    {
-        $alink = new AvatarLink();
-        $alink->url    = $filename;
-        $alink->height = $size;
-        if (!empty($filename)) {
-            $alink->width  = $size;
-            $alink->type   = self::mediatype($filename);
-        } else {
-            $alink->url    = User_group::defaultLogo($size);
-            $alink->type   = 'image/png';
-        }
-        return $alink;
-    }
-
-    // yuck!
-    static function mediatype($filename) {
-        $ext = strtolower(end(explode('.', $filename)));
-        if ($ext == 'jpeg') {
-            $ext = 'jpg';
-        }
-        // hope we don't support any others
-        $types = array('png', 'gif', 'jpg', 'jpeg');
-        if (in_array($ext, $types)) {
-            return 'image/' . $ext;
-        }
-        return null;
-    }
-}
-
-/**
- * A noun-ish thing in the activity universe
- *
- * The activity streams spec talks about activity objects, while also having
- * a tag activity:object, which is in fact an activity object. Aaaaaah!
- *
- * This is just a thing in the activity universe. Can be the subject, object,
- * or indirect object (target!) of an activity verb. Rotten name, and I'm
- * propagating it. *sigh*
- *
- * @category  OStatus
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link      http://status.net/
- */
-
-class ActivityObject
-{
-    const ARTICLE   = 'http://activitystrea.ms/schema/1.0/article';
-    const BLOGENTRY = 'http://activitystrea.ms/schema/1.0/blog-entry';
-    const NOTE      = 'http://activitystrea.ms/schema/1.0/note';
-    const STATUS    = 'http://activitystrea.ms/schema/1.0/status';
-    const FILE      = 'http://activitystrea.ms/schema/1.0/file';
-    const PHOTO     = 'http://activitystrea.ms/schema/1.0/photo';
-    const ALBUM     = 'http://activitystrea.ms/schema/1.0/photo-album';
-    const PLAYLIST  = 'http://activitystrea.ms/schema/1.0/playlist';
-    const VIDEO     = 'http://activitystrea.ms/schema/1.0/video';
-    const AUDIO     = 'http://activitystrea.ms/schema/1.0/audio';
-    const BOOKMARK  = 'http://activitystrea.ms/schema/1.0/bookmark';
-    const PERSON    = 'http://activitystrea.ms/schema/1.0/person';
-    const GROUP     = 'http://activitystrea.ms/schema/1.0/group';
-    const PLACE     = 'http://activitystrea.ms/schema/1.0/place';
-    const COMMENT   = 'http://activitystrea.ms/schema/1.0/comment';
-    // ^^^^^^^^^^ tea!
-
-    // Atom elements we snarf
-
-    const TITLE   = 'title';
-    const SUMMARY = 'summary';
-    const ID      = 'id';
-    const SOURCE  = 'source';
-
-    const NAME  = 'name';
-    const URI   = 'uri';
-    const EMAIL = 'email';
-
-    public $element;
-    public $type;
-    public $id;
-    public $title;
-    public $summary;
-    public $content;
-    public $link;
-    public $source;
-    public $avatarLinks = array();
-    public $geopoint;
-    public $poco;
-    public $displayName;
-
-    /**
-     * Constructor
-     *
-     * This probably needs to be refactored
-     * to generate a local class (ActivityPerson, ActivityFile, ...)
-     * based on the object type.
-     *
-     * @param DOMElement $element DOM thing to turn into an Activity thing
-     */
-
-    function __construct($element = null)
-    {
-        if (empty($element)) {
-            return;
-        }
-
-        $this->element = $element;
-
-        $this->geopoint = $this->_childContent(
-            $element,
-            ActivityContext::POINT,
-            ActivityContext::GEORSS
-        );
-
-        if ($element->tagName == 'author') {
-
-            $this->type  = self::PERSON; // XXX: is this fair?
-            $this->title = $this->_childContent($element, self::NAME);
-            $this->id    = $this->_childContent($element, self::URI);
-
-            if (empty($this->id)) {
-                $email = $this->_childContent($element, self::EMAIL);
-                if (!empty($email)) {
-                    // XXX: acct: ?
-                    $this->id = 'mailto:'.$email;
-                }
-            }
-
-        } else {
-
-            $this->type = $this->_childContent($element, Activity::OBJECTTYPE,
-                                               Activity::SPEC);
-
-            if (empty($this->type)) {
-                $this->type = ActivityObject::NOTE;
-            }
-
-            $this->id      = $this->_childContent($element, self::ID);
-            $this->title   = $this->_childContent($element, self::TITLE);
-            $this->summary = $this->_childContent($element, self::SUMMARY);
-
-            $this->source  = $this->_getSource($element);
-
-            $this->content = ActivityUtils::getContent($element);
-
-            $this->link = ActivityUtils::getPermalink($element);
-
-        }
-
-        // Some per-type attributes...
-        if ($this->type == self::PERSON || $this->type == self::GROUP) {
-            $this->displayName = $this->title;
-
-            $avatars = ActivityUtils::getLinks($element, 'avatar');
-            foreach ($avatars as $link) {
-                $this->avatarLinks[] = new AvatarLink($link);
-            }
-
-            $this->poco = new PoCo($element);
-        }
-    }
-
-    private function _childContent($element, $tag, $namespace=ActivityUtils::ATOM)
-    {
-        return ActivityUtils::childContent($element, $tag, $namespace);
-    }
-
-    // Try to get a unique id for the source feed
-
-    private function _getSource($element)
-    {
-        $sourceEl = ActivityUtils::child($element, 'source');
-
-        if (empty($sourceEl)) {
-            return null;
-        } else {
-            $href = ActivityUtils::getLink($sourceEl, 'self');
-            if (!empty($href)) {
-                return $href;
-            } else {
-                return ActivityUtils::childContent($sourceEl, 'id');
-            }
-        }
-    }
-
-    static function fromNotice($notice)
-    {
-        $object = new ActivityObject();
-
-        $object->type    = ActivityObject::NOTE;
-
-        $object->id      = $notice->uri;
-        $object->title   = $notice->content;
-        $object->content = $notice->rendered;
-        $object->link    = $notice->bestUrl();
-
-        return $object;
-    }
-
-    static function fromProfile($profile)
-    {
-        $object = new ActivityObject();
-
-        $object->type   = ActivityObject::PERSON;
-        $object->id     = $profile->getUri();
-        $object->title  = $profile->getBestName();
-        $object->link   = $profile->profileurl;
-
-        $orig = $profile->getOriginalAvatar();
-
-        if (!empty($orig)) {
-            $object->avatarLinks[] = AvatarLink::fromAvatar($orig);
-        }
-
-        $sizes = array(
-            AVATAR_PROFILE_SIZE,
-            AVATAR_STREAM_SIZE,
-            AVATAR_MINI_SIZE
-        );
-
-        foreach ($sizes as $size) {
-
-            $alink  = null;
-            $avatar = $profile->getAvatar($size);
-
-            if (!empty($avatar)) {
-                $alink = AvatarLink::fromAvatar($avatar);
-            } else {
-                $alink = new AvatarLink();
-                $alink->type   = 'image/png';
-                $alink->height = $size;
-                $alink->width  = $size;
-                $alink->url    = Avatar::defaultImage($size);
-            }
-
-            $object->avatarLinks[] = $alink;
-        }
-
-        if (isset($profile->lat) && isset($profile->lon)) {
-            $object->geopoint = (float)$profile->lat
-                . ' ' . (float)$profile->lon;
-        }
-
-        $object->poco = PoCo::fromProfile($profile);
-
-        return $object;
-    }
-
-    static function fromGroup($group)
-    {
-        $object = new ActivityObject();
-
-        $object->type   = ActivityObject::GROUP;
-        $object->id     = $group->getUri();
-        $object->title  = $group->getBestName();
-        $object->link   = $group->getUri();
-
-        $object->avatarLinks[] = AvatarLink::fromFilename(
-            $group->homepage_logo,
-            AVATAR_PROFILE_SIZE
-        );
-
-        $object->avatarLinks[] = AvatarLink::fromFilename(
-            $group->stream_logo,
-            AVATAR_STREAM_SIZE
-        );
-
-        $object->avatarLinks[] = AvatarLink::fromFilename(
-            $group->mini_logo,
-            AVATAR_MINI_SIZE
-        );
-
-        $object->poco = PoCo::fromGroup($group);
-
-        return $object;
-    }
-
-
-    function asString($tag='activity:object')
-    {
-        $xs = new XMLStringer(true);
-
-        $xs->elementStart($tag);
-
-        $xs->element('activity:object-type', null, $this->type);
-
-        $xs->element(self::ID, null, $this->id);
-
-        if (!empty($this->title)) {
-            $xs->element(self::TITLE, null, $this->title);
-        }
-
-        if (!empty($this->summary)) {
-            $xs->element(self::SUMMARY, null, $this->summary);
-        }
-
-        if (!empty($this->content)) {
-            // XXX: assuming HTML content here
-            $xs->element(ActivityUtils::CONTENT, array('type' => 'html'), $this->content);
-        }
-
-        if (!empty($this->link)) {
-            $xs->element(
-                'link',
-                array(
-                    'rel' => 'alternate',
-                    'type' => 'text/html',
-                    'href' => $this->link
-                ),
-                null
-            );
-        }
-
-        if ($this->type == ActivityObject::PERSON
-            || $this->type == ActivityObject::GROUP) {
-
-            foreach ($this->avatarLinks as $avatar) {
-                $xs->element(
-                    'link', array(
-                        'rel'  => 'avatar',
-                        'type'         => $avatar->type,
-                        'media:width'  => $avatar->width,
-                        'media:height' => $avatar->height,
-                        'href' => $avatar->url
-                    ),
-                    null
-                );
-            }
-        }
-
-        if (!empty($this->geopoint)) {
-            $xs->element(
-                'georss:point',
-                null,
-                $this->geopoint
-            );
-        }
-
-        if (!empty($this->poco)) {
-            $xs->raw($this->poco->asString());
-        }
-
-        $xs->elementEnd($tag);
-
-        return $xs->getString();
-    }
-}
-
-/**
- * Utility class to hold a bunch of constant defining default verb types
- *
- * @category  OStatus
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
- * @link      http://status.net/
- */
-
-class ActivityVerb
-{
-    const POST     = 'http://activitystrea.ms/schema/1.0/post';
-    const SHARE    = 'http://activitystrea.ms/schema/1.0/share';
-    const SAVE     = 'http://activitystrea.ms/schema/1.0/save';
-    const FAVORITE = 'http://activitystrea.ms/schema/1.0/favorite';
-    const PLAY     = 'http://activitystrea.ms/schema/1.0/play';
-    const FOLLOW   = 'http://activitystrea.ms/schema/1.0/follow';
-    const FRIEND   = 'http://activitystrea.ms/schema/1.0/make-friend';
-    const JOIN     = 'http://activitystrea.ms/schema/1.0/join';
-    const TAG      = 'http://activitystrea.ms/schema/1.0/tag';
-
-    // Custom OStatus verbs for the flipside until they're standardized
-    const DELETE     = 'http://ostatus.org/schema/1.0/unfollow';
-    const UNFAVORITE = 'http://ostatus.org/schema/1.0/unfavorite';
-    const UNFOLLOW   = 'http://ostatus.org/schema/1.0/unfollow';
-    const LEAVE      = 'http://ostatus.org/schema/1.0/leave';
-
-    // For simple profile-update pings; no content to share.
-    const UPDATE_PROFILE = 'http://ostatus.org/schema/1.0/update-profile';
-}
-
-class ActivityContext
-{
-    public $replyToID;
-    public $replyToUrl;
-    public $location;
-    public $attention = array();
-    public $conversation;
-
-    const THR     = 'http://purl.org/syndication/thread/1.0';
-    const GEORSS  = 'http://www.georss.org/georss';
-    const OSTATUS = 'http://ostatus.org/schema/1.0';
-
-    const INREPLYTO = 'in-reply-to';
-    const REF       = 'ref';
-    const HREF      = 'href';
-
-    const POINT     = 'point';
-
-    const ATTENTION    = 'ostatus:attention';
-    const CONVERSATION = 'ostatus:conversation';
-
-    function __construct($element)
-    {
-        $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR);
-
-        if (!empty($replyToEl)) {
-            $this->replyToID  = $replyToEl->getAttribute(self::REF);
-            $this->replyToUrl = $replyToEl->getAttribute(self::HREF);
-        }
-
-        $this->location = $this->getLocation($element);
-
-        $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
-
-        // Multiple attention links allowed
-
-        $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
-
-        for ($i = 0; $i < $links->length; $i++) {
-
-            $link = $links->item($i);
-
-            $linkRel = $link->getAttribute(ActivityUtils::REL);
-
-            if ($linkRel == self::ATTENTION) {
-                $this->attention[] = $link->getAttribute(self::HREF);
-            }
-        }
-    }
-
-    /**
-     * Parse location given as a GeoRSS-simple point, if provided.
-     * http://www.georss.org/simple
-     *
-     * @param feed item $entry
-     * @return mixed Location or false
-     */
-    function getLocation($dom)
-    {
-        $points = $dom->getElementsByTagNameNS(self::GEORSS, self::POINT);
-
-        for ($i = 0; $i < $points->length; $i++) {
-            $point = $points->item($i)->textContent;
-            return self::locationFromPoint($point);
-        }
-
-        return null;
-    }
-
-    // XXX: Move to ActivityUtils or Location?
-    static function locationFromPoint($point)
-    {
-        $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace"
-        $point = preg_replace('/\s+/', ' ', $point);
-        $point = trim($point);
-        $coords = explode(' ', $point);
-        if (count($coords) == 2) {
-            list($lat, $lon) = $coords;
-            if (is_numeric($lat) && is_numeric($lon)) {
-                common_log(LOG_INFO, "Looking up location for $lat $lon from georss point");
-                return Location::fromLatLon($lat, $lon);
-            }
-        }
-        common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
-        return null;
-    }
-}
-
 /**
  * An activity in the ActivityStrea.ms world
  *
@@ -1018,6 +53,7 @@ class Activity
 {
     const SPEC   = 'http://activitystrea.ms/spec/1.0/';
     const SCHEMA = 'http://activitystrea.ms/schema/1.0/';
+    const MEDIA  = 'http://purl.org/syndication/atommedia';
 
     const VERB       = 'verb';
     const OBJECT     = 'object';
@@ -1033,9 +69,24 @@ class Activity
     const PUBLISHED = 'published';
     const UPDATED   = 'updated';
 
+    const RSS = null; // no namespace!
+
+    const PUBDATE     = 'pubDate';
+    const DESCRIPTION = 'description';
+    const GUID        = 'guid';
+    const SELF        = 'self';
+    const IMAGE       = 'image';
+    const URL         = 'url';
+
+    const DC = 'http://purl.org/dc/elements/1.1/';
+
+    const CREATOR = 'creator';
+
+    const CONTENTNS = 'http://purl.org/rss/1.0/modules/content/';
+
     public $actor;   // an ActivityObject
     public $verb;    // a string (the URL)
-    public $object;  // an ActivityObject
+    public $objects = array();  // an array of ActivityObjects
     public $target;  // an ActivityObject
     public $context; // an ActivityObject
     public $time;    // Time of the activity
@@ -1063,21 +114,29 @@ class Activity
             return;
         }
 
-        $this->entry = $entry;
-
-        // @fixme Don't send in a DOMDocument
+        // Insist on a feed's root DOMElement; don't allow a DOMDocument
         if ($feed instanceof DOMDocument) {
-            common_log(
-                LOG_WARNING,
-                'Activity::__construct() - '
-                . 'DOMDocument passed in for feed by mistake. '
-                . "Expecting a 'feed' DOMElement."
+            throw new ClientException(
+                _("Expecting a root feed element but got a whole XML document.")
             );
-            $feed = $feed->getElementsByTagName('feed')->item(0);
         }
 
+        $this->entry = $entry;
         $this->feed  = $feed;
 
+        if ($entry->namespaceURI == Activity::ATOM &&
+            $entry->localName == 'entry') {
+            $this->_fromAtomEntry($entry, $feed);
+        } else if ($entry->namespaceURI == Activity::RSS &&
+                   $entry->localName == 'item') {
+            $this->_fromRssItem($entry, $feed);
+        } else {
+            throw new Exception("Unknown DOM element: {$entry->namespaceURI} {$entry->localName}");
+        }
+    }
+
+    function _fromAtomEntry($entry, $feed)
+    {
         $pubEl = $this->_child($entry, self::PUBLISHED, self::ATOM);
 
         if (!empty($pubEl)) {
@@ -1103,12 +162,15 @@ class Activity
             // XXX: do other implied stuff here
         }
 
-        $objectEl = $this->_child($entry, self::OBJECT);
+        $objectEls = $entry->getElementsByTagNameNS(self::SPEC, self::OBJECT);
 
-        if (!empty($objectEl)) {
-            $this->object = new ActivityObject($objectEl);
+        if ($objectEls->length > 0) {
+            for ($i = 0; $i < $objectEls->length; $i++) {
+                $objectEl = $objectEls->item($i);
+                $this->objects[] = new ActivityObject($objectEl);
+            }
         } else {
-            $this->object = new ActivityObject($entry);
+            $this->objects[] = new ActivityObject($entry);
         }
 
         $actorEl = $this->_child($entry, self::ACTOR);
@@ -1163,6 +225,69 @@ class Activity
         }
     }
 
+    function _fromRssItem($item, $channel)
+    {
+        $verbEl = $this->_child($item, self::VERB);
+
+        if (!empty($verbEl)) {
+            $this->verb = trim($verbEl->textContent);
+        } else {
+            $this->verb = ActivityVerb::POST;
+            // XXX: do other implied stuff here
+        }
+
+        $pubDateEl = $this->_child($item, self::PUBDATE, self::RSS);
+
+        if (!empty($pubDateEl)) {
+            $this->time = strtotime($pubDateEl->textContent);
+        }
+
+        if ($authorEl = $this->_child($item, self::AUTHOR, self::RSS)) {
+            $this->actor = ActivityObject::fromRssAuthor($authorEl);
+        } else if ($dcCreatorEl = $this->_child($item, self::CREATOR, self::DC)) {
+            $this->actor = ActivityObject::fromDcCreator($dcCreatorEl);
+        } else if ($posterousEl = $this->_child($item, ActivityObject::AUTHOR, ActivityObject::POSTEROUS)) {
+            // Special case for Posterous.com
+            $this->actor = ActivityObject::fromPosterousAuthor($posterousEl);
+        } else if (!empty($channel)) {
+            $this->actor = ActivityObject::fromRssChannel($channel);
+        } else {
+            // No actor!
+        }
+
+        $this->title = ActivityUtils::childContent($item, ActivityObject::TITLE, self::RSS);
+
+        $contentEl = ActivityUtils::child($item, ActivityUtils::CONTENT, self::CONTENTNS);
+
+        if (!empty($contentEl)) {
+            $this->content = htmlspecialchars_decode($contentEl->textContent, ENT_QUOTES);
+        } else {
+            $descriptionEl = ActivityUtils::child($item, self::DESCRIPTION, self::RSS);
+            if (!empty($descriptionEl)) {
+                $this->content = htmlspecialchars_decode($descriptionEl->textContent, ENT_QUOTES);
+            }
+        }
+
+        $this->link = ActivityUtils::childContent($item, ActivityUtils::LINK, self::RSS);
+
+        // @fixme enclosures
+        // @fixme thumbnails... maybe
+
+        $guidEl = ActivityUtils::child($item, self::GUID, self::RSS);
+
+        if (!empty($guidEl)) {
+            $this->id = $guidEl->textContent;
+
+            if ($guidEl->hasAttribute('isPermaLink') && $guidEl->getAttribute('isPermaLink') != 'false') {
+                // overwrites <link>
+                $this->link = $this->id;
+            }
+        }
+
+        $this->objects[] = new ActivityObject($item);
+        $this->context   = new ActivityContext($item);
+    }
+
     /**
      * Returns an Atom <entry> based on this activity
      *
@@ -1218,8 +343,10 @@ class Activity
 
         $xs->element('activity:verb', null, $this->verb);
 
-        if ($this->object) {
-            $xs->raw($this->object->asString());
+        if (!empty($this->objects)) {
+            foreach($this->objects as $object) {
+                $xs->raw($object->asString());
+            }
         }
 
         if ($this->target) {
@@ -1241,48 +368,3 @@ class Activity
     }
 }
 
-class AtomCategory
-{
-    public $term;
-    public $scheme;
-    public $label;
-
-    function __construct($element=null)
-    {
-        if ($element && $element->attributes) {
-            $this->term = $this->extract($element, 'term');
-            $this->scheme = $this->extract($element, 'scheme');
-            $this->label = $this->extract($element, 'label');
-        }
-    }
-
-    protected function extract($element, $attrib)
-    {
-        $node = $element->attributes->getNamedItemNS(Activity::ATOM, $attrib);
-        if ($node) {
-            return trim($node->textContent);
-        }
-        $node = $element->attributes->getNamedItem($attrib);
-        if ($node) {
-            return trim($node->textContent);
-        }
-        return null;
-    }
-
-    function asString()
-    {
-        $attribs = array();
-        if ($this->term !== null) {
-            $attribs['term'] = $this->term;
-        }
-        if ($this->scheme !== null) {
-            $attribs['scheme'] = $this->scheme;
-        }
-        if ($this->label !== null) {
-            $attribs['label'] = $this->label;
-        }
-        $xs = new XMLStringer();
-        $xs->element('category', $attribs);
-        return $xs->asString();
-    }
-}
diff --git a/lib/activitycontext.php b/lib/activitycontext.php
new file mode 100644 (file)
index 0000000..2df7613
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class ActivityContext
+{
+    public $replyToID;
+    public $replyToUrl;
+    public $location;
+    public $attention = array();
+    public $conversation;
+
+    const THR     = 'http://purl.org/syndication/thread/1.0';
+    const GEORSS  = 'http://www.georss.org/georss';
+    const OSTATUS = 'http://ostatus.org/schema/1.0';
+
+    const INREPLYTO = 'in-reply-to';
+    const REF       = 'ref';
+    const HREF      = 'href';
+
+    const POINT     = 'point';
+
+    const ATTENTION    = 'ostatus:attention';
+    const CONVERSATION = 'ostatus:conversation';
+
+    function __construct($element)
+    {
+        $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR);
+
+        if (!empty($replyToEl)) {
+            $this->replyToID  = $replyToEl->getAttribute(self::REF);
+            $this->replyToUrl = $replyToEl->getAttribute(self::HREF);
+        }
+
+        $this->location = $this->getLocation($element);
+
+        $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION);
+
+        // Multiple attention links allowed
+
+        $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
+
+        for ($i = 0; $i < $links->length; $i++) {
+
+            $link = $links->item($i);
+
+            $linkRel = $link->getAttribute(ActivityUtils::REL);
+
+            if ($linkRel == self::ATTENTION) {
+                $this->attention[] = $link->getAttribute(self::HREF);
+            }
+        }
+    }
+
+    /**
+     * Parse location given as a GeoRSS-simple point, if provided.
+     * http://www.georss.org/simple
+     *
+     * @param feed item $entry
+     * @return mixed Location or false
+     */
+    function getLocation($dom)
+    {
+        $points = $dom->getElementsByTagNameNS(self::GEORSS, self::POINT);
+
+        for ($i = 0; $i < $points->length; $i++) {
+            $point = $points->item($i)->textContent;
+            return self::locationFromPoint($point);
+        }
+
+        return null;
+    }
+
+    // XXX: Move to ActivityUtils or Location?
+    static function locationFromPoint($point)
+    {
+        $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace"
+        $point = preg_replace('/\s+/', ' ', $point);
+        $point = trim($point);
+        $coords = explode(' ', $point);
+        if (count($coords) == 2) {
+            list($lat, $lon) = $coords;
+            if (is_numeric($lat) && is_numeric($lon)) {
+                common_log(LOG_INFO, "Looking up location for $lat $lon from georss point");
+                return Location::fromLatLon($lat, $lon);
+            }
+        }
+        common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
+        return null;
+    }
+}
diff --git a/lib/activityobject.php b/lib/activityobject.php
new file mode 100644 (file)
index 0000000..34d1b91
--- /dev/null
@@ -0,0 +1,568 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * A noun-ish thing in the activity universe
+ *
+ * The activity streams spec talks about activity objects, while also having
+ * a tag activity:object, which is in fact an activity object. Aaaaaah!
+ *
+ * This is just a thing in the activity universe. Can be the subject, object,
+ * or indirect object (target!) of an activity verb. Rotten name, and I'm
+ * propagating it. *sigh*
+ *
+ * @category  OStatus
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+class ActivityObject
+{
+    const ARTICLE   = 'http://activitystrea.ms/schema/1.0/article';
+    const BLOGENTRY = 'http://activitystrea.ms/schema/1.0/blog-entry';
+    const NOTE      = 'http://activitystrea.ms/schema/1.0/note';
+    const STATUS    = 'http://activitystrea.ms/schema/1.0/status';
+    const FILE      = 'http://activitystrea.ms/schema/1.0/file';
+    const PHOTO     = 'http://activitystrea.ms/schema/1.0/photo';
+    const ALBUM     = 'http://activitystrea.ms/schema/1.0/photo-album';
+    const PLAYLIST  = 'http://activitystrea.ms/schema/1.0/playlist';
+    const VIDEO     = 'http://activitystrea.ms/schema/1.0/video';
+    const AUDIO     = 'http://activitystrea.ms/schema/1.0/audio';
+    const BOOKMARK  = 'http://activitystrea.ms/schema/1.0/bookmark';
+    const PERSON    = 'http://activitystrea.ms/schema/1.0/person';
+    const GROUP     = 'http://activitystrea.ms/schema/1.0/group';
+    const PLACE     = 'http://activitystrea.ms/schema/1.0/place';
+    const COMMENT   = 'http://activitystrea.ms/schema/1.0/comment';
+    // ^^^^^^^^^^ tea!
+
+    // Atom elements we snarf
+
+    const TITLE   = 'title';
+    const SUMMARY = 'summary';
+    const ID      = 'id';
+    const SOURCE  = 'source';
+
+    const NAME  = 'name';
+    const URI   = 'uri';
+    const EMAIL = 'email';
+
+    const POSTEROUS   = 'http://posterous.com/help/rss/1.0';
+    const AUTHOR      = 'author';
+    const USERIMAGE   = 'userImage';
+    const PROFILEURL  = 'profileUrl';
+    const NICKNAME    = 'nickName';
+    const DISPLAYNAME = 'displayName';
+
+    public $element;
+    public $type;
+    public $id;
+    public $title;
+    public $summary;
+    public $content;
+    public $link;
+    public $source;
+    public $avatarLinks = array();
+    public $geopoint;
+    public $poco;
+    public $displayName;
+
+    // @todo move this stuff to it's own PHOTO activity object
+    const MEDIA_DESCRIPTION = 'description';
+
+    public $thumbnail;
+    public $largerImage;
+    public $description;
+
+    /**
+     * Constructor
+     *
+     * This probably needs to be refactored
+     * to generate a local class (ActivityPerson, ActivityFile, ...)
+     * based on the object type.
+     *
+     * @param DOMElement $element DOM thing to turn into an Activity thing
+     */
+
+    function __construct($element = null)
+    {
+        if (empty($element)) {
+            return;
+        }
+
+        $this->element = $element;
+
+        $this->geopoint = $this->_childContent(
+            $element,
+            ActivityContext::POINT,
+            ActivityContext::GEORSS
+        );
+
+        if ($element->tagName == 'author') {
+            $this->_fromAuthor($element);
+        } else if ($element->tagName == 'item') {
+            $this->_fromRssItem($element);
+        } else {
+            $this->_fromAtomEntry($element);
+        }
+
+        // Some per-type attributes...
+        if ($this->type == self::PERSON || $this->type == self::GROUP) {
+            $this->displayName = $this->title;
+
+            $photos = ActivityUtils::getLinks($element, 'photo');
+            if (count($photos)) {
+                foreach ($photos as $link) {
+                    $this->avatarLinks[] = new AvatarLink($link);
+                }
+            } else {
+                $avatars = ActivityUtils::getLinks($element, 'avatar');
+                foreach ($avatars as $link) {
+                    $this->avatarLinks[] = new AvatarLink($link);
+                }
+            }
+
+            $this->poco = new PoCo($element);
+        }
+
+        if ($this->type == self::PHOTO) {
+
+            $this->thumbnail   = ActivityUtils::getLink($element, 'preview');
+            $this->largerImage = ActivityUtils::getLink($element, 'enclosure');
+
+            $this->description = ActivityUtils::childContent(
+                $element,
+                ActivityObject::MEDIA_DESCRIPTION,
+                Activity::MEDIA
+            );
+
+        }
+    }
+
+    private function _fromAuthor($element)
+    {
+        $this->type  = self::PERSON; // XXX: is this fair?
+        $this->title = $this->_childContent($element, self::NAME);
+
+        $id = $this->_childContent($element, self::URI);
+        if (ActivityUtils::validateUri($id)) {
+            $this->id = $id;
+        }
+
+        if (empty($this->id)) {
+            $email = $this->_childContent($element, self::EMAIL);
+            if (!empty($email)) {
+                // XXX: acct: ?
+                $this->id = 'mailto:'.$email;
+            }
+        }
+    }
+
+    private function _fromAtomEntry($element)
+    {
+        if ($element->localName == 'actor') {
+            // Old-fashioned <activity:actor>...
+            // First pull anything from <author>, then we'll add on top.
+            $author = ActivityUtils::child($element->parentNode, 'author');
+            if ($author) {
+                $this->_fromAuthor($author);
+            }
+        }
+
+        $this->type = $this->_childContent($element, Activity::OBJECTTYPE,
+                                           Activity::SPEC);
+
+        if (empty($this->type)) {
+            $this->type = ActivityObject::NOTE;
+        }
+
+        $id = $this->_childContent($element, self::ID);
+        if (ActivityUtils::validateUri($id)) {
+            $this->id = $id;
+        }
+
+        $this->summary = ActivityUtils::childHtmlContent($element, self::SUMMARY);
+        $this->content = ActivityUtils::getContent($element);
+
+        // We don't like HTML in our titles, although it's technically allowed
+
+        $title = ActivityUtils::childHtmlContent($element, self::TITLE);
+
+        $this->title = html_entity_decode(strip_tags($title));
+
+        $this->source  = $this->_getSource($element);
+
+        $this->link = ActivityUtils::getPermalink($element);
+    }
+
+    // @fixme rationalize with Activity::_fromRssItem()
+
+    private function _fromRssItem($item)
+    {
+        $this->title = ActivityUtils::childContent($item, ActivityObject::TITLE, Activity::RSS);
+
+        $contentEl = ActivityUtils::child($item, ActivityUtils::CONTENT, Activity::CONTENTNS);
+
+        if (!empty($contentEl)) {
+            $this->content = htmlspecialchars_decode($contentEl->textContent, ENT_QUOTES);
+        } else {
+            $descriptionEl = ActivityUtils::child($item, Activity::DESCRIPTION, Activity::RSS);
+            if (!empty($descriptionEl)) {
+                $this->content = htmlspecialchars_decode($descriptionEl->textContent, ENT_QUOTES);
+            }
+        }
+
+        $this->link = ActivityUtils::childContent($item, ActivityUtils::LINK, Activity::RSS);
+
+        $guidEl = ActivityUtils::child($item, Activity::GUID, Activity::RSS);
+
+        if (!empty($guidEl)) {
+            $this->id = $guidEl->textContent;
+
+            if ($guidEl->hasAttribute('isPermaLink')) {
+                // overwrites <link>
+                $this->link = $this->id;
+            }
+        }
+    }
+
+    public static function fromRssAuthor($el)
+    {
+        $text = $el->textContent;
+
+        if (preg_match('/^(.*?) \((.*)\)$/', $text, $match)) {
+            $email = $match[1];
+            $name = $match[2];
+        } else if (preg_match('/^(.*?) <(.*)>$/', $text, $match)) {
+            $name = $match[1];
+            $email = $match[2];
+        } else if (preg_match('/.*@.*/', $text)) {
+            $email = $text;
+            $name = null;
+        } else {
+            $name = $text;
+            $email = null;
+        }
+
+        // Not really enough info
+
+        $obj = new ActivityObject();
+
+        $obj->element = $el;
+
+        $obj->type  = ActivityObject::PERSON;
+        $obj->title = $name;
+
+        if (!empty($email)) {
+            $obj->id = 'mailto:'.$email;
+        }
+
+        return $obj;
+    }
+
+    public static function fromDcCreator($el)
+    {
+        // Not really enough info
+
+        $text = $el->textContent;
+
+        $obj = new ActivityObject();
+
+        $obj->element = $el;
+
+        $obj->title = $text;
+        $obj->type  = ActivityObject::PERSON;
+
+        return $obj;
+    }
+
+    public static function fromRssChannel($el)
+    {
+        $obj = new ActivityObject();
+
+        $obj->element = $el;
+
+        $obj->type = ActivityObject::PERSON; // @fixme guess better
+
+        $obj->title = ActivityUtils::childContent($el, ActivityObject::TITLE, Activity::RSS);
+        $obj->link  = ActivityUtils::childContent($el, ActivityUtils::LINK, Activity::RSS);
+        $obj->id    = ActivityUtils::getLink($el, Activity::SELF);
+
+        if (empty($obj->id)) {
+            $obj->id = $obj->link;
+        }
+
+        $desc = ActivityUtils::childContent($el, Activity::DESCRIPTION, Activity::RSS);
+
+        if (!empty($desc)) {
+            $obj->content = htmlspecialchars_decode($desc, ENT_QUOTES);
+        }
+
+        $imageEl = ActivityUtils::child($el, Activity::IMAGE, Activity::RSS);
+
+        if (!empty($imageEl)) {
+            $url = ActivityUtils::childContent($imageEl, Activity::URL, Activity::RSS);
+            $al = new AvatarLink();
+            $al->url = $url;
+            $obj->avatarLinks[] = $al;
+        }
+
+        return $obj;
+    }
+
+    public static function fromPosterousAuthor($el)
+    {
+        $obj = new ActivityObject();
+
+        $obj->type = ActivityObject::PERSON; // @fixme any others...?
+
+        $userImage = ActivityUtils::childContent($el, self::USERIMAGE, self::POSTEROUS);
+
+        if (!empty($userImage)) {
+            $al = new AvatarLink();
+            $al->url = $userImage;
+            $obj->avatarLinks[] = $al;
+        }
+
+        $obj->link = ActivityUtils::childContent($el, self::PROFILEURL, self::POSTEROUS);
+        $obj->id   = $obj->link;
+
+        $obj->poco = new PoCo();
+
+        $obj->poco->preferredUsername = ActivityUtils::childContent($el, self::NICKNAME, self::POSTEROUS);
+        $obj->poco->displayName       = ActivityUtils::childContent($el, self::DISPLAYNAME, self::POSTEROUS);
+
+        $obj->title = $obj->poco->displayName;
+
+        return $obj;
+    }
+
+    private function _childContent($element, $tag, $namespace=ActivityUtils::ATOM)
+    {
+        return ActivityUtils::childContent($element, $tag, $namespace);
+    }
+
+    // Try to get a unique id for the source feed
+
+    private function _getSource($element)
+    {
+        $sourceEl = ActivityUtils::child($element, 'source');
+
+        if (empty($sourceEl)) {
+            return null;
+        } else {
+            $href = ActivityUtils::getLink($sourceEl, 'self');
+            if (!empty($href)) {
+                return $href;
+            } else {
+                return ActivityUtils::childContent($sourceEl, 'id');
+            }
+        }
+    }
+
+    static function fromNotice(Notice $notice)
+    {
+        $object = new ActivityObject();
+
+        $object->type    = ActivityObject::NOTE;
+
+        $object->id      = $notice->uri;
+        $object->title   = $notice->content;
+        $object->content = $notice->rendered;
+        $object->link    = $notice->bestUrl();
+
+        return $object;
+    }
+
+    static function fromProfile(Profile $profile)
+    {
+        $object = new ActivityObject();
+
+        $object->type   = ActivityObject::PERSON;
+        $object->id     = $profile->getUri();
+        $object->title  = $profile->getBestName();
+        $object->link   = $profile->profileurl;
+
+        $orig = $profile->getOriginalAvatar();
+
+        if (!empty($orig)) {
+            $object->avatarLinks[] = AvatarLink::fromAvatar($orig);
+        }
+
+        $sizes = array(
+            AVATAR_PROFILE_SIZE,
+            AVATAR_STREAM_SIZE,
+            AVATAR_MINI_SIZE
+        );
+
+        foreach ($sizes as $size) {
+
+            $alink  = null;
+            $avatar = $profile->getAvatar($size);
+
+            if (!empty($avatar)) {
+                $alink = AvatarLink::fromAvatar($avatar);
+            } else {
+                $alink = new AvatarLink();
+                $alink->type   = 'image/png';
+                $alink->height = $size;
+                $alink->width  = $size;
+                $alink->url    = Avatar::defaultImage($size);
+            }
+
+            $object->avatarLinks[] = $alink;
+        }
+
+        if (isset($profile->lat) && isset($profile->lon)) {
+            $object->geopoint = (float)$profile->lat
+                . ' ' . (float)$profile->lon;
+        }
+
+        $object->poco = PoCo::fromProfile($profile);
+
+        return $object;
+    }
+
+    static function fromGroup($group)
+    {
+        $object = new ActivityObject();
+
+        $object->type   = ActivityObject::GROUP;
+        $object->id     = $group->getUri();
+        $object->title  = $group->getBestName();
+        $object->link   = $group->getUri();
+
+        $object->avatarLinks[] = AvatarLink::fromFilename(
+            $group->homepage_logo,
+            AVATAR_PROFILE_SIZE
+        );
+
+        $object->avatarLinks[] = AvatarLink::fromFilename(
+            $group->stream_logo,
+            AVATAR_STREAM_SIZE
+        );
+
+        $object->avatarLinks[] = AvatarLink::fromFilename(
+            $group->mini_logo,
+            AVATAR_MINI_SIZE
+        );
+
+        $object->poco = PoCo::fromGroup($group);
+
+        return $object;
+    }
+
+    function asString($tag='activity:object')
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart($tag);
+
+        $xs->element('activity:object-type', null, $this->type);
+
+        $xs->element(self::ID, null, $this->id);
+
+        if (!empty($this->title)) {
+            $xs->element(
+                self::TITLE,
+                null,
+                common_xml_safe_str($this->title)
+            );
+        }
+
+        if (!empty($this->summary)) {
+            $xs->element(
+                self::SUMMARY,
+                null,
+                common_xml_safe_str($this->summary)
+            );
+        }
+
+        if (!empty($this->content)) {
+            // XXX: assuming HTML content here
+            $xs->element(
+                ActivityUtils::CONTENT,
+                array('type' => 'html'),
+                common_xml_safe_str($this->content)
+            );
+        }
+
+        if (!empty($this->link)) {
+            $xs->element(
+                'link',
+                array(
+                    'rel' => 'alternate',
+                    'type' => 'text/html',
+                    'href' => $this->link
+                ),
+                null
+            );
+        }
+
+        if ($this->type == ActivityObject::PERSON
+            || $this->type == ActivityObject::GROUP) {
+
+            foreach ($this->avatarLinks as $avatar) {
+                $xs->element(
+                    'link', array(
+                        'rel'  => 'avatar',
+                        'type'         => $avatar->type,
+                        'media:width'  => $avatar->width,
+                        'media:height' => $avatar->height,
+                        'href' => $avatar->url
+                    ),
+                    null
+                );
+            }
+        }
+
+        if (!empty($this->geopoint)) {
+            $xs->element(
+                'georss:point',
+                null,
+                $this->geopoint
+            );
+        }
+
+        if (!empty($this->poco)) {
+            $xs->raw($this->poco->asString());
+        }
+
+        $xs->elementEnd($tag);
+
+        return $xs->getString();
+    }
+}
diff --git a/lib/activityutils.php b/lib/activityutils.php
new file mode 100644 (file)
index 0000000..a7e99fb
--- /dev/null
@@ -0,0 +1,265 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Utilities for turning DOMish things into Activityish things
+ *
+ * Some common functions that I didn't have the bandwidth to try to factor
+ * into some kind of reasonable superclass, so just dumped here. Might
+ * be useful to have an ActivityObject parent class or something.
+ *
+ * @category  OStatus
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+class ActivityUtils
+{
+    const ATOM = 'http://www.w3.org/2005/Atom';
+
+    const LINK = 'link';
+    const REL  = 'rel';
+    const TYPE = 'type';
+    const HREF = 'href';
+
+    const CONTENT = 'content';
+    const SRC     = 'src';
+
+    /**
+     * Get the permalink for an Activity object
+     *
+     * @param DOMElement $element A DOM element
+     *
+     * @return string related link, if any
+     */
+
+    static function getPermalink($element)
+    {
+        return self::getLink($element, 'alternate', 'text/html');
+    }
+
+    /**
+     * Get the permalink for an Activity object
+     *
+     * @param DOMElement $element A DOM element
+     *
+     * @return string related link, if any
+     */
+
+    static function getLink(DOMNode $element, $rel, $type=null)
+    {
+        $els = $element->childNodes;
+
+        foreach ($els as $link) {
+
+            if (!($link instanceof DOMElement)) {
+                continue;
+            }
+
+            if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) {
+
+                $linkRel = $link->getAttribute(self::REL);
+                $linkType = $link->getAttribute(self::TYPE);
+
+                if ($linkRel == $rel &&
+                    (is_null($type) || $linkType == $type)) {
+                    return $link->getAttribute(self::HREF);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    static function getLinks(DOMNode $element, $rel, $type=null)
+    {
+        $els = $element->childNodes;
+        $out = array();
+
+        foreach ($els as $link) {
+            if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) {
+
+                $linkRel = $link->getAttribute(self::REL);
+                $linkType = $link->getAttribute(self::TYPE);
+
+                if ($linkRel == $rel &&
+                    (is_null($type) || $linkType == $type)) {
+                    $out[] = $link;
+                }
+            }
+        }
+
+        return $out;
+    }
+
+    /**
+     * Gets the first child element with the given tag
+     *
+     * @param DOMElement $element   element to pick at
+     * @param string     $tag       tag to look for
+     * @param string     $namespace Namespace to look under
+     *
+     * @return DOMElement found element or null
+     */
+
+    static function child(DOMNode $element, $tag, $namespace=self::ATOM)
+    {
+        $els = $element->childNodes;
+        if (empty($els) || $els->length == 0) {
+            return null;
+        } else {
+            for ($i = 0; $i < $els->length; $i++) {
+                $el = $els->item($i);
+                if ($el->localName == $tag && $el->namespaceURI == $namespace) {
+                    return $el;
+                }
+            }
+        }
+    }
+
+    /**
+     * Grab the text content of a DOM element child of the current element
+     *
+     * @param DOMElement $element   Element whose children we examine
+     * @param string     $tag       Tag to look up
+     * @param string     $namespace Namespace to use, defaults to Atom
+     *
+     * @return string content of the child
+     */
+
+    static function childContent(DOMNode $element, $tag, $namespace=self::ATOM)
+    {
+        $el = self::child($element, $tag, $namespace);
+
+        if (empty($el)) {
+            return null;
+        } else {
+            return $el->textContent;
+        }
+    }
+
+    static function childHtmlContent(DOMNode $element, $tag, $namespace=self::ATOM)
+    {
+        $el = self::child($element, $tag, $namespace);
+
+        if (empty($el)) {
+            return null;
+        } else {
+            return self::textConstruct($el);
+        }
+    }
+
+    /**
+     * Get the content of an atom:entry-like object
+     *
+     * @param DOMElement $element The element to examine.
+     *
+     * @return string unencoded HTML content of the element, like "This -&lt; is <b>HTML</b>."
+     *
+     * @todo handle remote content
+     * @todo handle embedded XML mime types
+     * @todo handle base64-encoded non-XML and non-text mime types
+     */
+
+    static function getContent($element)
+    {
+        return self::childHtmlContent($element, self::CONTENT, self::ATOM);
+    }
+
+    static function textConstruct($el)
+    {
+        $src  = $el->getAttribute(self::SRC);
+
+        if (!empty($src)) {
+            throw new ClientException(_("Can't handle remote content yet."));
+        }
+
+        $type = $el->getAttribute(self::TYPE);
+
+        // slavishly following http://atompub.org/rfc4287.html#rfc.section.4.1.3.3
+
+        if (empty($type) || $type == 'text') {
+            return $el->textContent;
+        } else if ($type == 'html') {
+            $text = $el->textContent;
+            return htmlspecialchars_decode($text, ENT_QUOTES);
+        } else if ($type == 'xhtml') {
+            $divEl = ActivityUtils::child($el, 'div', 'http://www.w3.org/1999/xhtml');
+            if (empty($divEl)) {
+                return null;
+            }
+            $doc = $divEl->ownerDocument;
+            $text = '';
+            $children = $divEl->childNodes;
+
+            for ($i = 0; $i < $children->length; $i++) {
+                $child = $children->item($i);
+                $text .= $doc->saveXML($child);
+            }
+            return trim($text);
+        } else if (in_array($type, array('text/xml', 'application/xml')) ||
+                   preg_match('#(+|/)xml$#', $type)) {
+            throw new ClientException(_("Can't handle embedded XML content yet."));
+        } else if (strncasecmp($type, 'text/', 5)) {
+            return $el->textContent;
+        } else {
+            throw new ClientException(_("Can't handle embedded Base64 content yet."));
+        }
+    }
+
+    /**
+     * Is this a valid URI for remote profile/notice identification?
+     * Does not have to be a resolvable URL.
+     * @param string $uri
+     * @return boolean
+     */
+    static function validateUri($uri)
+    {
+        if (Validate::uri($uri)) {
+            return true;
+        }
+
+        // Possibly an upstream bug; tag: URIs aren't validated properly
+        // unless you explicitly ask for them. All other schemes are accepted
+        // for basic URI validation without asking.
+        if (Validate::uri($uri, array('allowed_scheme' => array('tag')))) {
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/lib/activityverb.php b/lib/activityverb.php
new file mode 100644 (file)
index 0000000..76f2b84
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Utility class to hold a bunch of constant defining default verb types
+ *
+ * @category  OStatus
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+class ActivityVerb
+{
+    const POST     = 'http://activitystrea.ms/schema/1.0/post';
+    const SHARE    = 'http://activitystrea.ms/schema/1.0/share';
+    const SAVE     = 'http://activitystrea.ms/schema/1.0/save';
+    const FAVORITE = 'http://activitystrea.ms/schema/1.0/favorite';
+    const PLAY     = 'http://activitystrea.ms/schema/1.0/play';
+    const FOLLOW   = 'http://activitystrea.ms/schema/1.0/follow';
+    const FRIEND   = 'http://activitystrea.ms/schema/1.0/make-friend';
+    const JOIN     = 'http://activitystrea.ms/schema/1.0/join';
+    const TAG      = 'http://activitystrea.ms/schema/1.0/tag';
+
+    // Custom OStatus verbs for the flipside until they're standardized
+    const DELETE     = 'http://ostatus.org/schema/1.0/unfollow';
+    const UNFAVORITE = 'http://ostatus.org/schema/1.0/unfavorite';
+    const UNFOLLOW   = 'http://ostatus.org/schema/1.0/unfollow';
+    const LEAVE      = 'http://ostatus.org/schema/1.0/leave';
+
+    // For simple profile-update pings; no content to share.
+    const UPDATE_PROFILE = 'http://ostatus.org/schema/1.0/update-profile';
+}
index d43ea76984df4eb9f651a920638c28603a1f087a..a927e23336f73b80ab78bc0a98aafbf95778e286 100644 (file)
@@ -69,6 +69,7 @@ class AdminPanelAction extends Action
         // User must be logged in.
 
         if (!common_logged_in()) {
+            // TRANS: Client error message
             $this->clientError(_('Not logged in.'));
             return false;
         }
@@ -93,6 +94,7 @@ class AdminPanelAction extends Action
         // User must have the right to change admin settings
 
         if (!$user->hasRight(Right::CONFIGURESITE)) {
+            // TRANS: Client error message
             $this->clientError(_('You cannot make changes to this site.'));
             return false;
         }
@@ -104,6 +106,7 @@ class AdminPanelAction extends Action
         $name = mb_substr($name, 0, -10);
 
         if (!self::canAdmin($name)) {
+            // TRANS: Client error message
             $this->clientError(_('Changes to that panel are not allowed.'), 403);
             return false;
         }
@@ -134,6 +137,7 @@ class AdminPanelAction extends Action
                 Config::loadSettings();
 
                 $this->success = true;
+                // TRANS: Message after successful saving of administrative settings.
                 $this->msg     = _('Settings saved.');
             } catch (Exception $e) {
                 $this->success = false;
@@ -221,6 +225,7 @@ class AdminPanelAction extends Action
 
     function showForm()
     {
+        // TRANS: Client error message
         $this->clientError(_('showForm() not implemented.'));
         return;
     }
@@ -250,6 +255,7 @@ class AdminPanelAction extends Action
 
     function saveSettings()
     {
+        // TRANS: Client error message
         $this->clientError(_('saveSettings() not implemented.'));
         return;
     }
@@ -273,6 +279,7 @@ class AdminPanelAction extends Action
             $result = $config->delete();
             if (!$result) {
                 common_log_db_error($config, 'DELETE', __FILE__);
+                // TRANS: Client error message
                 $this->clientError(_("Unable to delete design setting."));
                 return null;
             }
@@ -337,43 +344,67 @@ class AdminPanelNav extends Widget
         if (Event::handle('StartAdminPanelNav', array($this))) {
 
             if (AdminPanelAction::canAdmin('site')) {
-                $this->out->menuItem(common_local_url('siteadminpanel'), _('Site'),
-                                     _('Basic site configuration'), $action_name == 'siteadminpanel', 'nav_site_admin_panel');
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Basic site configuration');
+                // TRANS: Menu item for site administration
+                $this->out->menuItem(common_local_url('siteadminpanel'), _m('MENU', 'Site'),
+                                     $menu_title, $action_name == 'siteadminpanel', 'nav_site_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('design')) {
-                $this->out->menuItem(common_local_url('designadminpanel'), _('Design'),
-                                     _('Design configuration'), $action_name == 'designadminpanel', 'nav_design_admin_panel');
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Design configuration');
+                // TRANS: Menu item for site administration
+                $this->out->menuItem(common_local_url('designadminpanel'), _m('MENU', 'Design'),
+                                     $menu_title, $action_name == 'designadminpanel', 'nav_design_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('user')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('User configuration');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('useradminpanel'), _('User'),
-                                     _('User configuration'), $action_name == 'useradminpanel', 'nav_user_admin_panel');
+                                     $menu_title, $action_name == 'useradminpanel', 'nav_user_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('access')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Access configuration');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('accessadminpanel'), _('Access'),
-                                     _('Access configuration'), $action_name == 'accessadminpanel', 'nav_access_admin_panel');
+                                     $menu_title, $action_name == 'accessadminpanel', 'nav_access_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('paths')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Paths configuration');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('pathsadminpanel'), _('Paths'),
-                                    _('Paths configuration'), $action_name == 'pathsadminpanel', 'nav_paths_admin_panel');
+                                    $menu_title, $action_name == 'pathsadminpanel', 'nav_paths_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('sessions')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Sessions configuration');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('sessionsadminpanel'), _('Sessions'),
-                                     _('Sessions configuration'), $action_name == 'sessionsadminpanel', 'nav_sessions_admin_panel');
+                                     $menu_title, $action_name == 'sessionsadminpanel', 'nav_sessions_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('sitenotice')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Edit site notice');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('sitenoticeadminpanel'), _('Site notice'),
-                                     _('Edit site notice'), $action_name == 'sitenoticeadminpanel', 'nav_sitenotice_admin_panel');
+                                     $menu_title, $action_name == 'sitenoticeadminpanel', 'nav_sitenotice_admin_panel');
             }
 
             if (AdminPanelAction::canAdmin('snapshot')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Snapshots configuration');
+                // TRANS: Menu item for site administration
                 $this->out->menuItem(common_local_url('snapshotadminpanel'), _('Snapshots'),
-                                     _('Snapshots configuration'), $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel');
+                                     $menu_title, $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel');
             }
 
             Event::handle('EndAdminPanelNav', array($this));
index e4a1df3d198400fd3aa64b03c2a8d36cf5af425e..e6aaf931618ec48ff037465b27faa5cd207ae2fb 100644 (file)
@@ -491,7 +491,7 @@ class ApiAction extends Action
                 $this->showXmlAttachments($twitter_status['attachments']);
                 break;
             case 'geo':
-                $this->showGeoRSS($value);
+                $this->showGeoXML($value);
                 break;
             case 'retweeted_status':
                 $this->showTwitterXmlStatus($value, 'retweeted_status');
@@ -539,7 +539,7 @@ class ApiAction extends Action
         }
     }
 
-    function showGeoRSS($geo)
+    function showGeoXML($geo)
     {
         if (empty($geo)) {
             // empty geo element
@@ -551,6 +551,17 @@ class ApiAction extends Action
         }
     }
 
+    function showGeoRSS($geo)
+    {
+        if (!empty($geo)) {
+            $this->element(
+                'georss:point',
+                null,
+                $geo['coordinates'][0] . ' ' . $geo['coordinates'][1]
+            );
+        }
+    }
+
     function showTwitterRssItem($entry)
     {
         $this->elementStart('item');
@@ -619,13 +630,25 @@ class ApiAction extends Action
         $this->endDocument('xml');
     }
 
-    function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null, $logo=null)
+    function showRssTimeline($notice, $title, $link, $subtitle, $suplink = null, $logo = null, $self = null)
     {
 
         $this->initDocument('rss');
 
         $this->element('title', null, $title);
         $this->element('link', null, $link);
+
+        if (!is_null($self)) {
+            $this->element(
+                'atom:link',
+                array(
+                    'type' => 'application/rss+xml',
+                    'href' => $self,
+                    'rel'  => 'self'
+                )
+           );
+        }
+
         if (!is_null($suplink)) {
             // For FriendFeed's SUP protocol
             $this->element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
@@ -732,8 +755,12 @@ class ApiAction extends Action
     function showTwitterAtomEntry($entry)
     {
         $this->elementStart('entry');
-        $this->element('title', null, $entry['title']);
-        $this->element('content', array('type' => 'html'), $entry['content']);
+        $this->element('title', null, common_xml_safe_str($entry['title']));
+        $this->element(
+            'content',
+            array('type' => 'html'),
+            common_xml_safe_str($entry['content'])
+        );
         $this->element('id', null, $entry['id']);
         $this->element('published', null, $entry['published']);
         $this->element('updated', null, $entry['updated']);
@@ -848,7 +875,7 @@ class ApiAction extends Action
 
         $this->initDocument('atom');
 
-        $this->element('title', null, $title);
+        $this->element('title', null, common_xml_safe_str($title));
         $this->element('id', null, $id);
         $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
 
@@ -858,7 +885,7 @@ class ApiAction extends Action
         }
 
         $this->element('updated', null, common_date_iso8601('now'));
-        $this->element('subtitle', null, $subtitle);
+        $this->element('subtitle', null, common_xml_safe_str($subtitle));
 
         if (is_array($group)) {
             foreach ($group as $g) {
@@ -1138,7 +1165,14 @@ class ApiAction extends Action
     function initTwitterRss()
     {
         $this->startXML();
-        $this->elementStart('rss', array('version' => '2.0', 'xmlns:atom'=>'http://www.w3.org/2005/Atom'));
+        $this->elementStart(
+            'rss',
+            array(
+                'version'      => '2.0',
+                'xmlns:atom'   => 'http://www.w3.org/2005/Atom',
+                'xmlns:georss' => 'http://www.georss.org/georss'
+            )
+        );
         $this->elementStart('channel');
         Event::handle('StartApiRss', array($this));
     }
@@ -1336,8 +1370,27 @@ class ApiAction extends Action
         }
     }
 
-    function getSelfUri($action, $aargs)
+    /**
+     * Calculate the complete URI that called up this action.  Used for
+     * Atom rel="self" links.  Warning: this is funky.
+     *
+     * @return string URL    a URL suitable for rel="self" Atom links
+     */
+    function getSelfUri()
     {
+        $action = mb_substr(get_class($this), 0, -6); // remove 'Action'
+
+        $id = $this->arg('id');
+        $aargs = array('format' => $this->format);
+        if (!empty($id)) {
+            $aargs['id'] = $id;
+        }
+
+        $tag = $this->arg('tag');
+        if (!empty($tag)) {
+            $aargs['tag'] = $tag;
+        }
+
         parse_str($_SERVER['QUERY_STRING'], $params);
         $pstring = '';
         if (!empty($params)) {
index 32502399f9f836bbd2d0607440a72200e14f4cd1..17f803a1ca9948bf7ac64fd4623b05d300dcf776 100644 (file)
@@ -294,11 +294,15 @@ class ApiAuthAction extends ApiAction
 
     function basicAuthProcessHeader()
     {
-        if (isset($_SERVER['AUTHORIZATION'])
-            || isset($_SERVER['HTTP_AUTHORIZATION'])
-            ) {
-            $authorization_header = isset($_SERVER['HTTP_AUTHORIZATION'])
-              ? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['AUTHORIZATION'];
+        $authHeaders = array('AUTHORIZATION',
+                             'HTTP_AUTHORIZATION',
+                             'REDIRECT_HTTP_AUTHORIZATION'); // rewrite for CGI
+        $authorization_header = null;
+        foreach ($authHeaders as $header) {
+            if (isset($_SERVER[$header])) {
+                $authorization_header = $_SERVER[$header];
+                break;
+            }
         }
 
         if (isset($_SERVER['PHP_AUTH_USER'])) {
index 2d342e7854a8b56d29fa9e53405ff84f68c71a48..a46d49f3509518ff0c7a4a89fa6a403da0f4e59e 100644 (file)
@@ -178,7 +178,7 @@ class Atom10Feed extends XMLStringer
 
         $this->element(
             'generator', array(
-                'url'     => 'http://status.net',
+                'uri'     => 'http://status.net',
                 'version' => STATUSNET_VERSION
             ),
             'StatusNet'
diff --git a/lib/atomcategory.php b/lib/atomcategory.php
new file mode 100644 (file)
index 0000000..4cc3b4f
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class AtomCategory
+{
+    public $term;
+    public $scheme;
+    public $label;
+
+    function __construct($element=null)
+    {
+        if ($element && $element->attributes) {
+            $this->term = $this->extract($element, 'term');
+            $this->scheme = $this->extract($element, 'scheme');
+            $this->label = $this->extract($element, 'label');
+        }
+    }
+
+    protected function extract($element, $attrib)
+    {
+        $node = $element->attributes->getNamedItemNS(Activity::ATOM, $attrib);
+        if ($node) {
+            return trim($node->textContent);
+        }
+        $node = $element->attributes->getNamedItem($attrib);
+        if ($node) {
+            return trim($node->textContent);
+        }
+        return null;
+    }
+
+    function asString()
+    {
+        $attribs = array();
+        if ($this->term !== null) {
+            $attribs['term'] = $this->term;
+        }
+        if ($this->scheme !== null) {
+            $attribs['scheme'] = $this->scheme;
+        }
+        if ($this->label !== null) {
+            $attribs['label'] = $this->label;
+        }
+        $xs = new XMLStringer();
+        $xs->element('category', $attribs);
+        return $xs->asString();
+    }
+}
index de479a5768081b42648b60c219b6c1d1be51c3dc..0a3763e2e4644d895095876acf13934393559f42 100644 (file)
@@ -69,13 +69,17 @@ abstract class AuthenticationPlugin extends Plugin
     /**
     * Automatically register a user when they attempt to login with valid credentials.
     * User::register($data) is a very useful method for this implementation
-    * @param username
+    * @param username username (that is used to login and find the user in the authentication provider) of the user to be registered
+    * @param nickname nickname of the user in the SN system. If nickname is null, then set nickname = username
     * @return mixed instance of User, or false (if user couldn't be created)
     */
-    function autoRegister($username)
+    function autoRegister($username, $nickname = null)
     {
+        if(is_null($nickname)){
+            $nickname = $username;
+        }
         $registration_data = array();
-        $registration_data['nickname'] = $username ;
+        $registration_data['nickname'] = $nickname;
         return User::register($registration_data);
     }
 
@@ -92,6 +96,21 @@ abstract class AuthenticationPlugin extends Plugin
         return false;
     }
 
+    /**
+    * Given a username, suggest what the nickname should be
+    * Used during autoregistration
+    * Useful if your usernames are ugly, and you want to suggest
+    * nice looking nicknames when users initially sign on
+    * All nicknames returned by this function should be valid
+    *  implementations may want to use common_nicknamize() to ensure validity
+    * @param username
+    * @return string nickname
+    */
+    function suggestNicknameForUsername($username)
+    {
+        return common_nicknamize($username);
+    }
+
     //------------Below are the methods that connect StatusNet to the implementing Auth plugin------------\\
     function onInitializePlugin(){
         if(!isset($this->provider_name)){
@@ -108,10 +127,22 @@ abstract class AuthenticationPlugin extends Plugin
     function onAutoRegister($nickname, $provider_name, &$user)
     {
         if($provider_name == $this->provider_name && $this->autoregistration){
-            $user = $this->autoregister($nickname);
-            if($user){
-                User_username::register($user,$nickname,$this->provider_name);
-                return false;
+            $suggested_nickname = $this->suggestNicknameForUsername($nickname);
+            $test_user = User::staticGet('nickname', $suggested_nickname);
+            if($test_user) {
+                //someone already exists with the suggested nickname, so used the passed nickname
+                $suggested_nickname = common_nicknamize($nickname);
+            }
+            $test_user = User::staticGet('nickname', $suggested_nickname);
+            if($test_user) {
+                //someone already exists with the suggested nickname
+                //not much else we can do
+            }else{
+                $user = $this->autoRegister($nickname, $suggested_nickname);
+                if($user){
+                    User_username::register($user,$nickname,$this->provider_name);
+                    return false;
+                }
             }
         }
     }
@@ -122,23 +153,30 @@ abstract class AuthenticationPlugin extends Plugin
         $user_username->username=$nickname;
         $user_username->provider_name=$this->provider_name;
         if($user_username->find() && $user_username->fetch()){
-            $username = $user_username->username;
-            $authenticated = $this->checkPassword($username, $password);
+            $authenticated = $this->checkPassword($user_username->username, $password);
             if($authenticated){
                 $authenticatedUser = User::staticGet('id', $user_username->user_id);
                 return false;
             }
         }else{
-            $user = User::staticGet('nickname', $nickname);
+            //$nickname is the username used to login
+            //$suggested_nickname is the nickname the auth provider suggests for that username
+            $suggested_nickname = $this->suggestNicknameForUsername($nickname);
+            $user = User::staticGet('nickname', $suggested_nickname);
             if($user){
-                //make sure a different provider isn't handling this nickname
+                //make sure this user isn't claimed
                 $user_username = new User_username();
-                $user_username->username=$nickname;
-                if(!$user_username->find()){
-                    //no other provider claims this username, so it's safe for us to handle it
+                $user_username->user_id=$user->id;
+                $we_can_handle = false;
+                if($user_username->find()){
+                    //either this provider, or another one, has already claimed this user
+                    //so we cannot. Let another plugin try.
+                    return;
+                }else{
+                    //no other provider claims this user, so it's safe for us to handle it
                     $authenticated = $this->checkPassword($nickname, $password);
                     if($authenticated){
-                        $authenticatedUser = User::staticGet('nickname', $nickname);
+                        $authenticatedUser = $user;
                         User_username::register($authenticatedUser,$nickname,$this->provider_name);
                         return false;
                     }
index 733b0c065652a608c0670f38c84a20f54ee82b7d..07da9b2d12c785d57cf3a903bf7aa766341f1b37 100644 (file)
@@ -85,7 +85,7 @@ abstract class AuthorizationPlugin extends Plugin
     }
 
     function onStartSetApiUser(&$user) {
-        return $this->onStartSetUser(&$user);
+        return $this->onStartSetUser($user);
     }
 
     function onStartHasRole($profile, $name, &$has_role) {
diff --git a/lib/avatarlink.php b/lib/avatarlink.php
new file mode 100644 (file)
index 0000000..e67799e
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+// XXX: Arg! This wouldn't be necessary if we used Avatars conistently
+class AvatarLink
+{
+    public $url;
+    public $type;
+    public $size;
+    public $width;
+    public $height;
+
+    function __construct($element=null)
+    {
+        if ($element) {
+            // @fixme use correct namespaces
+            $this->url = $element->getAttribute('href');
+            $this->type = $element->getAttribute('type');
+            $width = $element->getAttribute('media:width');
+            if ($width != null) {
+                $this->width = intval($width);
+            }
+            $height = $element->getAttribute('media:height');
+            if ($height != null) {
+                $this->height = intval($height);
+            }
+        }
+    }
+
+    static function fromAvatar($avatar)
+    {
+        if (empty($avatar)) {
+            return null;
+        }
+        $alink = new AvatarLink();
+        $alink->type   = $avatar->mediatype;
+        $alink->height = $avatar->height;
+        $alink->width  = $avatar->width;
+        $alink->url    = $avatar->displayUrl();
+        return $alink;
+    }
+
+    static function fromFilename($filename, $size)
+    {
+        $alink = new AvatarLink();
+        $alink->url    = $filename;
+        $alink->height = $size;
+        if (!empty($filename)) {
+            $alink->width  = $size;
+            $alink->type   = self::mediatype($filename);
+        } else {
+            $alink->url    = User_group::defaultLogo($size);
+            $alink->type   = 'image/png';
+        }
+        return $alink;
+    }
+
+    // yuck!
+    static function mediatype($filename) {
+        $ext = strtolower(end(explode('.', $filename)));
+        if ($ext == 'jpeg') {
+            $ext = 'jpg';
+        }
+        // hope we don't support any others
+        $types = array('png', 'gif', 'jpg', 'jpeg');
+        if (in_array($ext, $types)) {
+            return 'image/' . $ext;
+        }
+        return null;
+    }
+}
index 8080fb8bc0071de9f4a4b991d1fb7f6a524ea69b..216f9e649a33af4660bdc4fcaa2965571d0b1d0c 100644 (file)
@@ -711,6 +711,34 @@ class LoginCommand extends Command
     }
 }
 
+class LoseCommand extends Command
+{
+
+    var $other = null;
+
+    function __construct($user, $other)
+    {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+
+    function execute($channel)
+    {
+        if(!$this->other) {
+            $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
+            return;
+        }
+
+        $result = Subscription::cancel($this->getProfile($this->other), $this->user->getProfile());
+
+        if ($result) {
+            $channel->output($this->user, sprintf(_('Unsubscribed  %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
+}
+
 class SubscriptionsCommand extends Command
 {
     function handle($channel)
@@ -793,6 +821,7 @@ class HelpCommand extends Command
                            "d <nickname> <text> - direct message to user\n".
                            "get <nickname> - get last notice from user\n".
                            "whois <nickname> - get profile info on user\n".
+                           "lose <nickname> - force user to stop following you\n".
                            "fav <nickname> - add user's last notice as a 'fave'\n".
                            "fav #<notice_id> - add notice with the given id as a 'fave'\n".
                            "repeat #<notice_id> - repeat a notice with a given id\n".
index c2add7299e7330287303374944d912caa753dc09..fbc6174bbfab1b95a2d9573df2043e3688cf9a0f 100644 (file)
@@ -47,6 +47,17 @@ class CommandInterpreter
             } else {
                 return new LoginCommand($user);
             }
+         case 'lose':
+            if ($arg) {
+                list($other, $extra) = $this->split_arg($arg);
+                if ($extra) {
+                    return null;
+                } else {
+                    return new LoseCommand($user, $other);
+                }
+            } else {
+              return null;
+            }
          case 'subscribers':
             if ($arg) {
                 return null;
index 5d53270e30b85ac97682d1e0a5438ca43891ecf9..334a88ffd560f87ca6d2978e07ef06209068f8d9 100644 (file)
@@ -123,7 +123,6 @@ require_once INSTALLDIR.'/lib/util.php';
 require_once INSTALLDIR.'/lib/action.php';
 require_once INSTALLDIR.'/lib/mail.php';
 require_once INSTALLDIR.'/lib/subs.php';
-require_once INSTALLDIR.'/lib/activity.php';
 
 require_once INSTALLDIR.'/lib/clientexception.php';
 require_once INSTALLDIR.'/lib/serverexception.php';
index 46d3d4774ff6dcb2453baa23c146d877f3e76c58..10f3f1a97e7355ac6d724f167121a8a25e8b06eb 100644 (file)
@@ -282,6 +282,7 @@ $default =
                                  'Mapstraction' => null,
                                  'OStatus' => null,
                                  'WikiHashtags' => null,
+                                 'RSSCloud' => null,
                                  'OpenID' => null),
               ),
         'admin' =>
diff --git a/lib/deluserqueuehandler.php b/lib/deluserqueuehandler.php
new file mode 100644 (file)
index 0000000..4a1233a
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/*
+ * 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/>.
+ */
+
+/**
+ * Background job to delete prolific users without disrupting front-end too much.
+ *
+ * Up to 50 messages are deleted on each run through; when all messages are gone,
+ * the actual account is deleted.
+ *
+ * @package QueueHandler
+ * @maintainer Brion Vibber <brion@status.net>
+ */
+
+class DelUserQueueHandler extends QueueHandler
+{
+    const DELETION_WINDOW = 50;
+
+    public function transport()
+    {
+        return 'deluser';
+    }
+
+    public function handle($user)
+    {
+        if (!($user instanceof User)) {
+            common_log(LOG_ERR, "Got a bogus user, not deleting");
+            return true;
+        }
+
+        $user = User::staticGet('id', $user->id);
+        if (!$user) {
+            common_log(LOG_INFO, "User {$user->nickname} was deleted before we got here.");
+            return true;
+        }
+
+        if (!$user->hasRole(Profile_role::DELETED)) {
+            common_log(LOG_INFO, "User {$user->nickname} is not pending deletion; aborting.");
+            return true;
+        }
+
+        $notice = $this->getNextBatch($user);
+        if ($notice->N) {
+            common_log(LOG_INFO, "Deleting next {$notice->N} notices by {$user->nickname}");
+            while ($notice->fetch()) {
+                $del = clone($notice);
+                $del->delete();
+            }
+
+            // @todo improve reliability in case we died during the above deletions
+            // with a fatal error. If the job is lost, we should perform some kind
+            // of garbage collection later.
+
+            // Queue up the next batch.
+            $qm = QueueManager::get();
+            $qm->enqueue($user, 'deluser');
+        } else {
+            // Out of notices? Let's finish deleting this guy!
+            $user->delete();
+            common_log(LOG_INFO, "User $user->id $user->nickname deleted.");
+            return true;
+        }
+
+        return true;
+    }
+
+    /**
+     * Fetch the next self::DELETION_WINDOW messages for this user.
+     * @return Notice
+     */
+    protected function getNextBatch(User $user)
+    {
+        $notice = new Notice();
+        $notice->profile_id = $user->id;
+        $notice->limit(self::DELETION_WINDOW);
+        $notice->find();
+        return $notice;
+    }
+
+}
index 7315fe2ad44d34c43c107af91da9bbaa6e6c595e..7786b5941e25ba770d3f11c029f360af5b322f50 100644 (file)
@@ -356,40 +356,47 @@ class HTMLOutputter extends XMLOutputter
 
             if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
             {
-                $path = common_config('javascript', 'path');
+                if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
 
-                if (empty($path)) {
-                    $path = common_config('site', 'path') . '/js/';
-                }
+                    $src = common_path($src) . '?version=' . STATUSNET_VERSION;
 
-                if ($path[strlen($path)-1] != '/') {
-                    $path .= '/';
-                }
+                }else{
 
-                if ($path[0] != '/') {
-                    $path = '/'.$path;
-                }
+                    $path = common_config('javascript', 'path');
 
-                $server = common_config('javascript', 'server');
+                    if (empty($path)) {
+                        $path = common_config('site', 'path') . '/js/';
+                    }
 
-                if (empty($server)) {
-                    $server = common_config('site', 'server');
-                }
+                    if ($path[strlen($path)-1] != '/') {
+                        $path .= '/';
+                    }
 
-                $ssl = common_config('javascript', 'ssl');
+                    if ($path[0] != '/') {
+                        $path = '/'.$path;
+                    }
+
+                    $server = common_config('javascript', 'server');
 
-                if (is_null($ssl)) { // null -> guess
-                    if (common_config('site', 'ssl') == 'always' &&
-                        !common_config('javascript', 'server')) {
-                        $ssl = true;
-                    } else {
-                        $ssl = false;
+                    if (empty($server)) {
+                        $server = common_config('site', 'server');
                     }
-                }
 
-                $protocol = ($ssl) ? 'https' : 'http';
+                    $ssl = common_config('javascript', 'ssl');
 
-                $src = $protocol.'://'.$server.$path.$src . '?version=' . STATUSNET_VERSION;
+                    if (is_null($ssl)) { // null -> guess
+                        if (common_config('site', 'ssl') == 'always' &&
+                            !common_config('javascript', 'server')) {
+                            $ssl = true;
+                        } else {
+                            $ssl = false;
+                        }
+                    }
+
+                    $protocol = ($ssl) ? 'https' : 'http';
+
+                    $src = $protocol.'://'.$server.$path.$src . '?version=' . STATUSNET_VERSION;
+                }
             }
 
             $this->element('script', array('type' => $type,
index 6bc8e599b3022f7aa29d9c80045157989f627293..e4728774103860c9cbc6034f2850d7d86ca2216c 100644 (file)
@@ -60,6 +60,19 @@ class ImageFile
         $this->filepath = $filepath;
 
         $info = @getimagesize($this->filepath);
+
+        if (!(
+            ($info[2] == IMAGETYPE_GIF && function_exists('imagecreatefromgif')) ||
+            ($info[2] == IMAGETYPE_JPEG && function_exists('imagecreatefromjpeg')) ||
+            $info[2] == IMAGETYPE_BMP ||
+            ($info[2] == IMAGETYPE_WBMP && function_exists('imagecreatefromwbmp')) ||
+            ($info[2] == IMAGETYPE_XBM && function_exists('imagecreatefromxbm')) ||
+            ($info[2] == IMAGETYPE_PNG && function_exists('imagecreatefrompng')))) {
+
+            throw new Exception(_('Unsupported image file format.'));
+            return;
+        }
+
         $this->type = ($info) ? $info[2]:$type;
         $this->width = ($info) ? $info[0]:$width;
         $this->height = ($info) ? $info[1]:$height;
@@ -97,15 +110,6 @@ class ImageFile
             return;
         }
 
-        if ($info[2] !== IMAGETYPE_GIF &&
-            $info[2] !== IMAGETYPE_JPEG &&
-            $info[2] !== IMAGETYPE_PNG) {
-
-            @unlink($_FILES[$param]['tmp_name']);
-            throw new Exception(_('Unsupported image file format.'));
-            return;
-        }
-
         return new ImageFile(null, $_FILES[$param]['tmp_name']);
     }
 
@@ -146,6 +150,15 @@ class ImageFile
          case IMAGETYPE_PNG:
             $image_src = imagecreatefrompng($this->filepath);
             break;
+         case IMAGETYPE_BMP:
+            $image_src = imagecreatefrombmp($this->filepath);
+            break;
+         case IMAGETYPE_WBMP:
+            $image_src = imagecreatefromwbmp($this->filepath);
+            break;
+         case IMAGETYPE_XBM:
+            $image_src = imagecreatefromxbm($this->filepath);
+            break;
          default:
             throw new Exception(_('Unknown file type'));
             return;
@@ -153,7 +166,7 @@ class ImageFile
 
         $image_dest = imagecreatetruecolor($size, $size);
 
-        if ($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) {
+        if ($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG || $this->type == IMAGETYPE_BMP) {
 
             $transparent_idx = imagecolortransparent($image_src);
 
@@ -176,6 +189,20 @@ class ImageFile
 
         imagecopyresampled($image_dest, $image_src, 0, 0, $x, $y, $size, $size, $w, $h);
 
+        if($this->type == IMAGETYPE_BMP) {
+            //we don't want to save BMP... it's an inefficient, rare, antiquated format
+            //save png instead
+            $this->type = IMAGETYPE_PNG;
+        } else if($this->type == IMAGETYPE_WBMP) {
+            //we don't want to save WBMP... it's a rare format that we can't guarantee clients will support
+            //save png instead
+            $this->type = IMAGETYPE_PNG;
+        } else if($this->type == IMAGETYPE_XBM) {
+            //we don't want to save XBM... it's a rare format that we can't guarantee clients will support
+            //save png instead
+            $this->type = IMAGETYPE_PNG;
+        }
+
         $outname = Avatar::filename($this->id,
                                     image_type_to_extension($this->type),
                                     $size,
@@ -245,4 +272,101 @@ class ImageFile
 
         return $num;
     }
-}
\ No newline at end of file
+}
+
+//PHP doesn't (as of 2/24/2010) have an imagecreatefrombmp so conditionally define one
+if(!function_exists('imagecreatefrombmp')){
+    //taken shamelessly from http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214
+    function imagecreatefrombmp($p_sFile)
+    {
+        //    Load the image into a string
+        $file    =    fopen($p_sFile,"rb");
+        $read    =    fread($file,10);
+        while(!feof($file)&&($read<>""))
+            $read    .=    fread($file,1024);
+
+        $temp    =    unpack("H*",$read);
+        $hex    =    $temp[1];
+        $header    =    substr($hex,0,108);
+
+        //    Process the header
+        //    Structure: http://www.fastgraph.com/help/bmp_header_format.html
+        if (substr($header,0,4)=="424d")
+        {
+            //    Cut it in parts of 2 bytes
+            $header_parts    =    str_split($header,2);
+
+            //    Get the width        4 bytes
+            $width            =    hexdec($header_parts[19].$header_parts[18]);
+
+            //    Get the height        4 bytes
+            $height            =    hexdec($header_parts[23].$header_parts[22]);
+
+            //    Unset the header params
+            unset($header_parts);
+        }
+
+        //    Define starting X and Y
+        $x                =    0;
+        $y                =    1;
+
+        //    Create newimage
+        $image            =    imagecreatetruecolor($width,$height);
+
+        //    Grab the body from the image
+        $body            =    substr($hex,108);
+
+        //    Calculate if padding at the end-line is needed
+        //    Divided by two to keep overview.
+        //    1 byte = 2 HEX-chars
+        $body_size        =    (strlen($body)/2);
+        $header_size    =    ($width*$height);
+
+        //    Use end-line padding? Only when needed
+        $usePadding        =    ($body_size>($header_size*3)+4);
+
+        //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
+        //    Calculate the next DWORD-position in the body
+        for ($i=0;$i<$body_size;$i+=3)
+        {
+            //    Calculate line-ending and padding
+            if ($x>=$width)
+            {
+                //    If padding needed, ignore image-padding
+                //    Shift i to the ending of the current 32-bit-block
+                if ($usePadding)
+                    $i    +=    $width%4;
+
+                //    Reset horizontal position
+                $x    =    0;
+
+                //    Raise the height-position (bottom-up)
+                $y++;
+
+                //    Reached the image-height? Break the for-loop
+                if ($y>$height)
+                    break;
+            }
+
+            //    Calculation of the RGB-pixel (defined as BGR in image-data)
+            //    Define $i_pos as absolute position in the body
+            $i_pos    =    $i*2;
+            $r        =    hexdec($body[$i_pos+4].$body[$i_pos+5]);
+            $g        =    hexdec($body[$i_pos+2].$body[$i_pos+3]);
+            $b        =    hexdec($body[$i_pos].$body[$i_pos+1]);
+
+            //    Calculate and draw the pixel
+            $color    =    imagecolorallocate($image,$r,$g,$b);
+            imagesetpixel($image,$x,$height-$y,$color);
+
+            //    Raise the horizontal position
+            $x++;
+        }
+
+        //    Unset the body / free the memory
+        unset($body);
+
+        //    Return image-object
+        return $image;
+    }
+}
index d20837ba54a3dac70e5731a2eb1b705912beb8ac..7cfb2c9a0ff18c59039cfdae634c728ec9fc8282 100644 (file)
@@ -330,7 +330,7 @@ abstract class IoMaster
      * for per-queue and per-site records.
      *
      * @param string $key counter name
-     * @param array $owners list of owner keys like 'queue:jabber' or 'site:stat01'
+     * @param array $owners list of owner keys like 'queue:xmpp' or 'site:stat01'
      */
     public function stats($key, $owners=array())
     {
index f5ee7fac5ed142239ffa3683de992cd9e8e50683..64b59e73966e61b9894e85efbd57eadd4e6a2f9b 100644 (file)
@@ -289,6 +289,7 @@ function get_all_languages() {
         'ar'      => array('q' => 0.8, 'lang' => 'ar', 'name' => 'Arabic', 'direction' => 'rtl'),
         'arz'     => array('q' => 0.8, 'lang' => 'arz', 'name' => 'Egyptian Spoken Arabic', 'direction' => 'rtl'),
         'bg'      => array('q' => 0.8, 'lang' => 'bg', 'name' => 'Bulgarian', 'direction' => 'ltr'),
+        'br'      => array('q' => 0.8, 'lang' => 'br', 'name' => 'Breton', 'direction' => 'ltr'),
         'ca'      => array('q' => 0.5, 'lang' => 'ca', 'name' => 'Catalan', 'direction' => 'ltr'),
         'cs'      => array('q' => 0.5, 'lang' => 'cs', 'name' => 'Czech', 'direction' => 'ltr'),
         'de'      => array('q' => 0.8, 'lang' => 'de', 'name' => 'German', 'direction' => 'ltr'),
index c724764cc8fc5f28cc35ca78bc6ebbc0e5a2e711..807b6a36339a8b7fabd4d4468e1f672f4e109c1b 100644 (file)
@@ -133,12 +133,13 @@ function mail_notify_from()
  * @param User   &$user   user to send email to
  * @param string $subject subject of the email
  * @param string $body    body of the email
+ * @param array  $headers optional list of email headers
  * @param string $address optional specification of email address
  *
  * @return boolean success flag
  */
 
-function mail_to_user(&$user, $subject, $body, $address=null)
+function mail_to_user(&$user, $subject, $body, $headers=array(), $address=null)
 {
     if (!$address) {
         $address = $user->email;
@@ -180,7 +181,9 @@ function mail_confirm_address($user, $code, $nickname, $address)
                     $nickname, common_config('site', 'name'),
                     common_local_url('confirmaddress', array('code' => $code)),
                     common_config('site', 'name'));
-    return mail_to_user($user, $subject, $body, $address);
+    $headers = array();
+
+    return mail_to_user($user, $subject, $body, $headers, $address);
 }
 
 /**
@@ -231,6 +234,7 @@ function mail_subscribe_notify_profile($listenee, $other)
 
         $recipients = $listenee->email;
 
+        $headers = _mail_prepare_headers('subscribe', $listenee->nickname, $other->nickname);
         $headers['From']    = mail_notify_from();
         $headers['To']      = $name . ' <' . $listenee->email . '>';
         $headers['Subject'] = sprintf(_('%1$s is now listening to '.
@@ -476,7 +480,10 @@ function mail_notify_nudge($from, $to)
                     common_local_url('all', array('nickname' => $to->nickname)),
                     common_config('site', 'name'));
     common_init_locale();
-    return mail_to_user($to, $subject, $body);
+
+    $headers = _mail_prepare_headers('nudge', $to->nickname, $from->nickname);
+
+    return mail_to_user($to, $subject, $body, $headers);
 }
 
 /**
@@ -526,8 +533,10 @@ function mail_notify_message($message, $from=null, $to=null)
                     common_local_url('newmessage', array('to' => $from->id)),
                     common_config('site', 'name'));
 
+    $headers = _mail_prepare_headers('message', $to->nickname, $from->nickname);
+
     common_init_locale();
-    return mail_to_user($to, $subject, $body);
+    return mail_to_user($to, $subject, $body, $headers);
 }
 
 /**
@@ -578,8 +587,10 @@ function mail_notify_fave($other, $user, $notice)
                     common_config('site', 'name'),
                     $user->nickname);
 
+    $headers = _mail_prepare_headers('fave', $other->nickname, $user->nickname);
+
     common_init_locale();
-    mail_to_user($other, $subject, $body);
+    mail_to_user($other, $subject, $body, $headers);
 }
 
 /**
@@ -611,19 +622,19 @@ function mail_notify_attn($user, $notice)
 
     common_init_locale($user->language);
 
-       if ($notice->conversation != $notice->id) {
-               $conversationEmailText = "The full conversation can be read here:\n\n".
-                                                                "\t%5\$s\n\n ";
-               $conversationUrl           = common_local_url('conversation',
+        if ($notice->conversation != $notice->id) {
+                $conversationEmailText = "The full conversation can be read here:\n\n".
+                                                                 "\t%5\$s\n\n ";
+                $conversationUrl            = common_local_url('conversation',
                                  array('id' => $notice->conversation)).'#notice-'.$notice->id;
-       } else {
-               $conversationEmailText = "%5\$s";
-               $conversationUrl = null;
-       }
+        } else {
+                $conversationEmailText = "%5\$s";
+                $conversationUrl = null;
+        }
 
     $subject = sprintf(_('%s (@%s) sent a notice to your attention'), $bestname, $sender->nickname);
 
-       $body = sprintf(_("%1\$s (@%9\$s) just sent a notice to your attention (an '@-reply') on %2\$s.\n\n".
+        $body = sprintf(_("%1\$s (@%9\$s) just sent a notice to your attention (an '@-reply') on %2\$s.\n\n".
                       "The notice is here:\n\n".
                       "\t%3\$s\n\n" .
                       "It reads:\n\n".
@@ -641,7 +652,7 @@ function mail_notify_attn($user, $notice)
                     common_local_url('shownotice',
                                      array('notice' => $notice->id)),//%3
                     $notice->content,//%4
-                                       $conversationUrl,//%5
+                                        $conversationUrl,//%5
                     common_local_url('newnotice',
                                      array('replyto' => $sender->nickname, 'inreplyto' => $notice->id)),//%6
                     common_local_url('replies',
@@ -649,6 +660,30 @@ function mail_notify_attn($user, $notice)
                     common_local_url('emailsettings'), //%8
                     $sender->nickname); //%9
 
+    $headers = _mail_prepare_headers('mention', $user->nickname, $sender->nickname);
+
     common_init_locale();
-    mail_to_user($user, $subject, $body);
+    mail_to_user($user, $subject, $body, $headers);
 }
+
+/**
+ * Prepare the common mail headers used in notification emails
+ *
+ * @param string $msg_type type of message being sent to the user
+ * @param string $to       nickname of the receipient
+ * @param string $from     nickname of the user triggering the notification
+ *
+ * @return array list of mail headers to include in the message
+ */
+function _mail_prepare_headers($msg_type, $to, $from)
+{
+    $headers = array(
+        'X-StatusNet-MessageType' => $msg_type,
+        'X-StatusNet-TargetUser'  => $to,
+        'X-StatusNet-SourceUser'  => $from,
+        'X-StatusNet-Domain'      => common_config('site', 'server')
+    );
+
+    return $headers;
+}
+
index e3d5b1dbcc40a1a7cbf58af5d4c316ff221f5af9..10d90d0081e877f5742194387a7019b5cad5f084 100644 (file)
@@ -262,7 +262,7 @@ class MediaFile
             $filetype = MIME_Type::autoDetect($stream['uri']);
         }
 
-        if (in_array($filetype, common_config('attachments', 'supported'))) {
+        if (common_config('attachments', 'supported') === true || in_array($filetype, common_config('attachments', 'supported'))) {
             return $filetype;
         }
         $media = MIME_Type::getMedia($filetype);
index 0c568e1bd8e12983f94904e2b9d8408926585359..b116964da9d95e9200466f45f4674eeb6579787f 100644 (file)
@@ -175,6 +175,6 @@ class MessageForm extends Form
                                            'class' => 'submit',
                                            'name' => 'message_send',
                                            'type' => 'submit',
-                                           'value' => _('Send')));
+                                           'value' => _m('Send button for sending notice', 'Send')));
     }
 }
index 485096ac425d4dea1dc48f7ab3d5cfb3040d1a83..4556953667d83c0586e1c2b34ce4f34c60dd605f 100644 (file)
@@ -90,15 +90,24 @@ class MysqlSchema extends Schema
      * @param string $name Name of the table to get
      *
      * @return TableDef tabledef for that table.
+     * @throws SchemaTableMissingException
      */
 
     public function getTableDef($name)
     {
-        $res = $this->conn->query('DESCRIBE ' . $name);
+        $query = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS " .
+                 "WHERE TABLE_SCHEMA='%s' AND TABLE_NAME='%s'";
+        $schema = $this->conn->dsn['database'];
+        $sql = sprintf($query, $schema, $name);
+        $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
         }
+        if ($res->numRows() == 0) {
+            $res->free();
+            throw new SchemaTableMissingException("No such table: $name");
+        }
 
         $td = new TableDef();
 
@@ -111,9 +120,9 @@ class MysqlSchema extends Schema
 
             $cd = new ColumnDef();
 
-            $cd->name = $row['Field'];
+            $cd->name = $row['COLUMN_NAME'];
 
-            $packed = $row['Type'];
+            $packed = $row['COLUMN_TYPE'];
 
             if (preg_match('/^(\w+)\((\d+)\)$/', $packed, $match)) {
                 $cd->type = $match[1];
@@ -122,17 +131,57 @@ class MysqlSchema extends Schema
                 $cd->type = $packed;
             }
 
-            $cd->nullable = ($row['Null'] == 'YES') ? true : false;
-            $cd->key      = $row['Key'];
-            $cd->default  = $row['Default'];
-            $cd->extra    = $row['Extra'];
+            $cd->nullable = ($row['IS_NULLABLE'] == 'YES') ? true : false;
+            $cd->key      = $row['COLUMN_KEY'];
+            $cd->default  = $row['COLUMN_DEFAULT'];
+            $cd->extra    = $row['EXTRA'];
+
+            // Autoincrement is stuck into the extra column.
+            // Pull it out so we don't accidentally mod it every time...
+            $extra = preg_replace('/(^|\s)auto_increment(\s|$)/i', '$1$2', $cd->extra);
+            if ($extra != $cd->extra) {
+                $cd->extra = trim($extra);
+                $cd->auto_increment = true;
+            }
+
+            // mysql extensions -- not (yet) used by base class
+            $cd->charset  = $row['CHARACTER_SET_NAME'];
+            $cd->collate  = $row['COLLATION_NAME'];
 
             $td->columns[] = $cd;
         }
+        $res->free();
 
         return $td;
     }
 
+    /**
+     * Pull the given table properties from INFORMATION_SCHEMA.
+     * Most of the good stuff is MySQL extensions.
+     *
+     * @return array
+     * @throws Exception if table info can't be looked up
+     */
+
+    function getTableProperties($table, $props)
+    {
+        $query = "SELECT %s FROM INFORMATION_SCHEMA.TABLES " .
+                 "WHERE TABLE_SCHEMA='%s' AND TABLE_NAME='%s'";
+        $schema = $this->conn->dsn['database'];
+        $sql = sprintf($query, implode(',', $props), $schema, $table);
+        $res = $this->conn->query($sql);
+
+        $row = array();
+        $ok = $res->fetchInto($row, DB_FETCHMODE_ASSOC);
+        $res->free();
+        
+        if ($ok) {
+            return $row;
+        } else {
+            throw new SchemaTableMissingException("No such table: $table");
+        }
+    }
+
     /**
      * Gets a ColumnDef object for a single column.
      *
@@ -185,35 +234,26 @@ class MysqlSchema extends Schema
             }
 
             $sql .= $this->_columnSql($cd);
-
-            switch ($cd->key) {
-            case 'UNI':
-                $uniques[] = $cd->name;
-                break;
-            case 'PRI':
-                $primary[] = $cd->name;
-                break;
-            case 'MUL':
-                $indices[] = $cd->name;
-                break;
-            }
         }
 
-        if (count($primary) > 0) { // it really should be...
-            $sql .= ",\nconstraint primary key (" . implode(',', $primary) . ")";
+        $idx = $this->_indexList($columns);
+
+        if ($idx['primary']) {
+            $sql .= ",\nconstraint primary key (" . implode(',', $idx['primary']) . ")";
         }
 
-        foreach ($uniques as $u) {
-            $sql .= ",\nunique index {$name}_{$u}_idx ($u)";
+        foreach ($idx['uniques'] as $u) {
+            $key = $this->_uniqueKey($name, $u);
+            $sql .= ",\nunique index $key ($u)";
         }
 
-        foreach ($indices as $i) {
-            $sql .= ",\nindex {$name}_{$i}_idx ($i)";
+        foreach ($idx['indices'] as $i) {
+            $key = $this->_key($name, $i);
+            $sql .= ",\nindex $key ($i)";
         }
 
-        $sql .= "); ";
+        $sql .= ") ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; ";
 
-        common_log(LOG_INFO, $sql);
         $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
@@ -223,6 +263,47 @@ class MysqlSchema extends Schema
         return true;
     }
 
+    /**
+     * Look over a list of column definitions and list up which
+     * indices will be present
+     */
+    private function _indexList(array $columns)
+    {
+        $list = array('uniques' => array(),
+                      'primary' => array(),
+                      'indices' => array());
+        foreach ($columns as $cd) {
+            switch ($cd->key) {
+            case 'UNI':
+                $list['uniques'][] = $cd->name;
+                break;
+            case 'PRI':
+                $list['primary'][] = $cd->name;
+                break;
+            case 'MUL':
+                $list['indices'][] = $cd->name;
+                break;
+            }
+        }
+        return $list;
+    }
+
+    /**
+     * Get the unique index key name for a given column on this table
+     */
+    function _uniqueKey($tableName, $columnName)
+    {
+        return $this->_key($tableName, $columnName);
+    }
+
+    /**
+     * Get the index key name for a given column on this table
+     */
+    function _key($tableName, $columnName)
+    {
+        return "{$tableName}_{$columnName}_idx";
+    }
+
     /**
      * Drops a table from the schema
      *
@@ -394,21 +475,20 @@ class MysqlSchema extends Schema
 
         try {
             $td = $this->getTableDef($tableName);
-        } catch (Exception $e) {
-            if (preg_match('/no such table/', $e->getMessage())) {
-                return $this->createTable($tableName, $columns);
-            } else {
-                throw $e;
-            }
+        } catch (SchemaTableMissingException $e) {
+            return $this->createTable($tableName, $columns);
         }
 
         $cur = $this->_names($td->columns);
         $new = $this->_names($columns);
 
-        $toadd  = array_diff($new, $cur);
-        $todrop = array_diff($cur, $new);
-        $same   = array_intersect($new, $cur);
-        $tomod  = array();
+        $dropIndex  = array();
+        $toadd      = array_diff($new, $cur);
+        $todrop     = array_diff($cur, $new);
+        $same       = array_intersect($new, $cur);
+        $tomod      = array();
+        $addIndex   = array();
+        $tableProps = array();
 
         foreach ($same as $m) {
             $curCol = $this->_byName($td->columns, $m);
@@ -416,10 +496,64 @@ class MysqlSchema extends Schema
 
             if (!$newCol->equals($curCol)) {
                 $tomod[] = $newCol->name;
+                continue;
+            }
+
+            // Earlier versions may have accidentally left tables at default
+            // charsets which might be latin1 or other freakish things.
+            if ($this->_isString($curCol)) {
+                if ($curCol->charset != 'utf8') {
+                    $tomod[] = $newCol->name;
+                    continue;
+                }
+            }
+        }
+
+        // Find any indices we have to change...
+        $curIdx = $this->_indexList($td->columns);
+        $newIdx = $this->_indexList($columns);
+
+        if ($curIdx['primary'] != $newIdx['primary']) {
+            if ($curIdx['primary']) {
+                $dropIndex[] = 'drop primary key';
+            }
+            if ($newIdx['primary']) {
+                $keys = implode(',', $newIdx['primary']);
+                $addIndex[] = "add constraint primary key ($keys)";
             }
         }
 
-        if (count($toadd) + count($todrop) + count($tomod) == 0) {
+        $dropUnique = array_diff($curIdx['uniques'], $newIdx['uniques']);
+        $addUnique = array_diff($newIdx['uniques'], $curIdx['uniques']);
+        foreach ($dropUnique as $columnName) {
+            $dropIndex[] = 'drop key ' . $this->_uniqueKey($tableName, $columnName);
+        }
+        foreach ($addUnique as $columnName) {
+            $addIndex[] = 'add constraint unique key ' . $this->_uniqueKey($tableName, $columnName) . " ($columnName)";;
+        }
+
+        $dropMultiple = array_diff($curIdx['indices'], $newIdx['indices']);
+        $addMultiple = array_diff($newIdx['indices'], $curIdx['indices']);
+        foreach ($dropMultiple as $columnName) {
+            $dropIndex[] = 'drop key ' . $this->_key($tableName, $columnName);
+        }
+        foreach ($addMultiple as $columnName) {
+            $addIndex[] = 'add key ' . $this->_key($tableName, $columnName) . " ($columnName)";
+        }
+
+        // Check for table properties: make sure we're using a sane
+        // engine type and charset/collation.
+        // @fixme make the default engine configurable?
+        $oldProps = $this->getTableProperties($tableName, array('ENGINE', 'TABLE_COLLATION'));
+        if (strtolower($oldProps['ENGINE']) != 'innodb') {
+            $tableProps['ENGINE'] = 'InnoDB';
+        }
+        if (strtolower($oldProps['TABLE_COLLATION']) != 'utf8_bin') {
+            $tableProps['DEFAULT CHARSET'] = 'utf8';
+            $tableProps['COLLATE'] = 'utf8_bin';
+        }
+
+        if (count($dropIndex) + count($toadd) + count($todrop) + count($tomod) + count($addIndex) + count($tableProps) == 0) {
             // nothing to do
             return true;
         }
@@ -429,6 +563,10 @@ class MysqlSchema extends Schema
 
         $phrase = array();
 
+        foreach ($dropIndex as $indexSql) {
+            $phrase[] = $indexSql;
+        }
+
         foreach ($toadd as $columnName) {
             $cd = $this->_byName($columns, $columnName);
 
@@ -445,8 +583,17 @@ class MysqlSchema extends Schema
             $phrase[] = 'MODIFY COLUMN ' . $this->_columnSql($cd);
         }
 
+        foreach ($addIndex as $indexSql) {
+            $phrase[] = $indexSql;
+        }
+
+        foreach ($tableProps as $key => $val) {
+            $phrase[] = "$key=$val";
+        }
+
         $sql = 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $phrase);
 
+        common_log(LOG_DEBUG, __METHOD__ . ': ' . $sql);
         $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
@@ -519,6 +666,10 @@ class MysqlSchema extends Schema
             $sql .= "{$cd->type} ";
         }
 
+        if ($this->_isString($cd)) {
+            $sql .= " CHARACTER SET utf8 ";
+        }
+
         if (!empty($cd->default)) {
             $sql .= "default {$cd->default} ";
         } else {
@@ -535,4 +686,13 @@ class MysqlSchema extends Schema
 
         return $sql;
     }
+
+    /**
+     * Is this column a string type?
+     */
+    private function _isString(ColumnDef $cd)
+    {
+        $strings = array('char', 'varchar', 'text');
+        return in_array(strtolower($cd->type), $strings);
+    }
 }
index 62df5c94100c6b2db4b7d1a2a7386b5653f86e74..7278c41a9cf2640323e34430c79c7118d3e6b8e7 100644 (file)
@@ -233,6 +233,6 @@ class NoticeForm extends Form
                                            'class' => 'submit',
                                            'name' => 'status_submit',
                                            'type' => 'submit',
-                                           'value' => _('Send')));
+                                           'value' => _m('Send button for sending notice', 'Send')));
     }
 }
index 88a9252414325ba8d38cb2f0f327770ff186133a..811b7e4f1070e283151bb678f0c77c4de34d6e9b 100644 (file)
@@ -442,11 +442,13 @@ class NoticeListItem extends Widget
                                               'title' => $latlon),
                                 $name);
         } else {
-            $this->out->elementStart('a', array('href' => $url));
-            $this->out->element('abbr', array('class' => 'geo',
-                                              'title' => $latlon),
-                                $name);
-            $this->out->elementEnd('a');
+            $xstr = new XMLStringer(false);
+            $xstr->elementStart('a', array('href' => $url));
+            $xstr->element('abbr', array('class' => 'geo',
+                                         'title' => $latlon),
+                           $name);
+            $xstr->elementEnd('a');
+            $this->out->raw($xstr->getString());
         }
         $this->out->elementEnd('span');
     }
index 91bc09667c0976d78ed7026aef14b00e3a9d770f..715065d774b977f5018a92f90955c00744e050ea 100644 (file)
@@ -61,7 +61,8 @@ class PgsqlSchema extends Schema
 
     public function getTableDef($name)
     {
-        $res = $this->conn->query("select *, column_default as default, is_nullable as Null, udt_name as Type, column_name AS Field from INFORMATION_SCHEMA.COLUMNS where table_name = '$name'");
+        $res = $this->conn->query("SELECT *, column_default as default, is_nullable as Null,
+        udt_name as Type, column_name AS Field from INFORMATION_SCHEMA.COLUMNS where table_name = '$name'");
 
         if (PEAR::isError($res)) {
             throw new Exception($res->getMessage());
@@ -72,6 +73,9 @@ class PgsqlSchema extends Schema
         $td->name    = $name;
         $td->columns = array();
 
+        if ($res->numRows() == 0 ) {
+          throw new Exception('no such table'); //pretend to be the msyql error. yeah, this sucks.
+        }
         $row = array();
 
         while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
@@ -166,12 +170,10 @@ class PgsqlSchema extends Schema
         }
 
         if (count($primary) > 0) { // it really should be...
-            $sql .= ",\nconstraint primary key (" . implode(',', $primary) . ")";
+            $sql .= ",\n primary key (" . implode(',', $primary) . ")";
         }
 
-        foreach ($uniques as $u) {
-            $sql .= ",\nunique index {$name}_{$u}_idx ($u)";
-        }
+
 
         foreach ($indices as $i) {
             $sql .= ",\nindex {$name}_{$i}_idx ($i)";
@@ -179,6 +181,10 @@ class PgsqlSchema extends Schema
 
         $sql .= "); ";
 
+
+        foreach ($uniques as $u) {
+            $sql .= "\n CREATE index {$name}_{$u}_idx ON {$name} ($u); ";
+        }
         $res = $this->conn->query($sql);
 
         if (PEAR::isError($res)) {
@@ -209,6 +215,22 @@ class PgsqlSchema extends Schema
         return true;
     }
 
+    /**
+     * Translate the (mostly) mysql-ish column types into somethings more standard
+     * @param string column type
+     *
+     * @return string postgres happy column type
+     */
+    private function _columnTypeTranslation($type) {
+      $map = array(
+      'datetime' => 'timestamp'
+      );
+      if(!empty($map[$type])) {
+        return $map[$type];
+      }
+      return $type;
+    }
+
     /**
      * Adds an index to a table.
      *
@@ -359,6 +381,7 @@ class PgsqlSchema extends Schema
 
         try {
             $td = $this->getTableDef($tableName);
+            
         } catch (Exception $e) {
             if (preg_match('/no such table/', $e->getMessage())) {
                 return $this->createTable($tableName, $columns);
@@ -477,11 +500,12 @@ class PgsqlSchema extends Schema
     private function _columnSql($cd)
     {
         $sql = "{$cd->name} ";
+        $type = $this->_columnTypeTranslation($cd->type);
 
         if (!empty($cd->size)) {
-            $sql .= "{$cd->type}({$cd->size}) ";
+            $sql .= "{$type}({$cd->size}) ";
         } else {
-            $sql .= "{$cd->type} ";
+            $sql .= "{$type} ";
         }
 
         if (!empty($cd->default)) {
diff --git a/lib/poco.php b/lib/poco.php
new file mode 100644 (file)
index 0000000..2157062
--- /dev/null
@@ -0,0 +1,240 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class PoCo
+{
+    const NS = 'http://portablecontacts.net/spec/1.0';
+
+    const USERNAME     = 'preferredUsername';
+    const DISPLAYNAME  = 'displayName';
+    const NOTE         = 'note';
+
+    public $preferredUsername;
+    public $displayName;
+    public $note;
+    public $address;
+    public $urls = array();
+
+    function __construct($element = null)
+    {
+        if (empty($element)) {
+            return;
+        }
+
+        $this->preferredUsername = ActivityUtils::childContent(
+            $element,
+            self::USERNAME,
+            self::NS
+        );
+
+        $this->displayName = ActivityUtils::childContent(
+            $element,
+            self::DISPLAYNAME,
+            self::NS
+        );
+
+        $this->note = ActivityUtils::childContent(
+            $element,
+            self::NOTE,
+            self::NS
+        );
+
+        $this->address = $this->_getAddress($element);
+        $this->urls = $this->_getURLs($element);
+    }
+
+    private function _getURLs($element)
+    {
+        $urlEls = $element->getElementsByTagnameNS(self::NS, PoCoURL::URLS);
+        $urls = array();
+
+        foreach ($urlEls as $urlEl) {
+
+            $type = ActivityUtils::childContent(
+                $urlEl,
+                PoCoURL::TYPE,
+                PoCo::NS
+            );
+
+            $value = ActivityUtils::childContent(
+                $urlEl,
+                PoCoURL::VALUE,
+                PoCo::NS
+            );
+
+            $primary = ActivityUtils::childContent(
+                $urlEl,
+                PoCoURL::PRIMARY,
+                PoCo::NS
+            );
+
+            $isPrimary = false;
+
+            if (isset($primary) && $primary == 'true') {
+                $isPrimary = true;
+            }
+
+            // @todo check to make sure a primary hasn't already been added
+
+            array_push($urls, new PoCoURL($type, $value, $isPrimary));
+        }
+        return $urls;
+    }
+
+    private function _getAddress($element)
+    {
+        $addressEl = ActivityUtils::child(
+            $element,
+            PoCoAddress::ADDRESS,
+            PoCo::NS
+        );
+
+        if (!empty($addressEl)) {
+            $formatted = ActivityUtils::childContent(
+                $addressEl,
+                PoCoAddress::FORMATTED,
+                self::NS
+            );
+
+            if (!empty($formatted)) {
+                $address = new PoCoAddress();
+                $address->formatted = $formatted;
+                return $address;
+            }
+        }
+
+        return null;
+    }
+
+    function fromProfile($profile)
+    {
+        if (empty($profile)) {
+            return null;
+        }
+
+        $poco = new PoCo();
+
+        $poco->preferredUsername = $profile->nickname;
+        $poco->displayName       = $profile->getBestName();
+
+        $poco->note = $profile->bio;
+
+        $paddy = new PoCoAddress();
+        $paddy->formatted = $profile->location;
+        $poco->address = $paddy;
+
+        if (!empty($profile->homepage)) {
+            array_push(
+                $poco->urls,
+                new PoCoURL(
+                    'homepage',
+                    $profile->homepage,
+                    true
+                )
+            );
+        }
+
+        return $poco;
+    }
+
+    function fromGroup($group)
+    {
+        if (empty($group)) {
+            return null;
+        }
+
+        $poco = new PoCo();
+
+        $poco->preferredUsername = $group->nickname;
+        $poco->displayName       = $group->getBestName();
+
+        $poco->note = $group->description;
+
+        $paddy = new PoCoAddress();
+        $paddy->formatted = $group->location;
+        $poco->address = $paddy;
+
+        if (!empty($group->homepage)) {
+            array_push(
+                $poco->urls,
+                new PoCoURL(
+                    'homepage',
+                    $group->homepage,
+                    true
+                )
+            );
+        }
+
+        return $poco;
+    }
+
+    function getPrimaryURL()
+    {
+        foreach ($this->urls as $url) {
+            if ($url->primary) {
+                return $url;
+            }
+        }
+    }
+
+    function asString()
+    {
+        $xs = new XMLStringer(true);
+        $xs->element(
+            'poco:preferredUsername',
+            null,
+            $this->preferredUsername
+        );
+
+        $xs->element(
+            'poco:displayName',
+            null,
+            $this->displayName
+        );
+
+        if (!empty($this->note)) {
+            $xs->element('poco:note', null, common_xml_safe_str($this->note));
+        }
+
+        if (!empty($this->address)) {
+            $xs->raw($this->address->asString());
+        }
+
+        foreach ($this->urls as $url) {
+            $xs->raw($url->asString());
+        }
+
+        return $xs->getString();
+    }
+}
diff --git a/lib/pocoaddress.php b/lib/pocoaddress.php
new file mode 100644 (file)
index 0000000..60873bd
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class PoCoAddress
+{
+    const ADDRESS   = 'address';
+    const FORMATTED = 'formatted';
+
+    public $formatted;
+
+    // @todo Other address fields
+
+    function asString()
+    {
+        if (!empty($this->formatted)) {
+            $xs = new XMLStringer(true);
+            $xs->elementStart('poco:address');
+            $xs->element('poco:formatted', null, common_xml_safe_str($this->formatted));
+            $xs->elementEnd('poco:address');
+            return $xs->getString();
+        }
+
+        return null;
+    }
+}
diff --git a/lib/pocourl.php b/lib/pocourl.php
new file mode 100644 (file)
index 0000000..803484d
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * An activity
+ *
+ * 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  Feed
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class PoCoURL
+{
+    const URLS      = 'urls';
+    const TYPE      = 'type';
+    const VALUE     = 'value';
+    const PRIMARY   = 'primary';
+
+    public $type;
+    public $value;
+    public $primary;
+
+    function __construct($type, $value, $primary = false)
+    {
+        $this->type    = $type;
+        $this->value   = $value;
+        $this->primary = $primary;
+    }
+
+    function asString()
+    {
+        $xs = new XMLStringer(true);
+        $xs->elementStart('poco:urls');
+        $xs->element('poco:type', null, $this->type);
+        $xs->element('poco:value', null, $this->value);
+        if (!empty($this->primary)) {
+            $xs->element('poco:primary', null, 'true');
+        }
+        $xs->elementEnd('poco:urls');
+        return $xs->getString();
+    }
+}
index 9fdc801100f46f58df9e9ab22c71529da55af6bd..0829c8a8bcb8321d1aba5deaa55d8e4640d4d9eb 100644 (file)
@@ -213,7 +213,9 @@ abstract class QueueManager extends IoManager
     {
         if (isset($this->handlers[$queue])) {
             $class = $this->handlers[$queue];
-            if (class_exists($class)) {
+            if(is_object($class)) {
+                return $class;
+            } else if (class_exists($class)) {
                 return new $class();
             } else {
                 $this->_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'");
@@ -262,6 +264,9 @@ abstract class QueueManager extends IoManager
                 $this->connect('sms', 'SmsQueueHandler');
             }
 
+            // Background user management tasks...
+            $this->connect('deluser', 'DelUserQueueHandler');
+
             // Broadcasting profile updates to OMB remote subscribers
             $this->connect('profile', 'ProfileQueueHandler');
 
@@ -286,7 +291,7 @@ abstract class QueueManager extends IoManager
      * Only registered transports will be reliably picked up!
      *
      * @param string $transport
-     * @param string $class
+     * @param string $class class name or object instance
      * @param string $group
      */
     public function connect($transport, $class, $group='main')
index 706120e0bfb93479d5126eca815a6aea7c25804d..a48ee875e15f5a7792146bbd9e82f8816fae3054 100644 (file)
@@ -628,6 +628,12 @@ class Router
                         array('action' => 'ApiTimelineTag',
                               'format' => '(xmljson|rss|atom)'));
 
+            // media related
+            $m->connect(
+                'api/statusnet/media/upload',
+                array('action' => 'ApiMediaUpload')
+            );
+
             // search
             $m->connect('api/search.atom', array('action' => 'twitapisearchatom'));
             $m->connect('api/search.json', array('action' => 'twitapisearchjson'));
index 137b814e0269ed727978e11e55ce25cca763a199..1503c96d4fc9cb28744aa13cc8ed0580d679f6f1 100644 (file)
@@ -485,3 +485,9 @@ class Schema
         return $sql;
     }
 }
+
+class SchemaTableMissingException extends Exception
+{
+    // no-op
+}
+
index 0993a63bca506149dcecddf892b6d264d4b1cd8e..9b5a553dc64a341e578e2efd6bb08285b017d868 100644 (file)
@@ -62,15 +62,18 @@ class ServerErrorAction extends ErrorAction
                            504 => 'Gateway Timeout',
                            505 => 'HTTP Version Not Supported');
 
-    function __construct($message='Error', $code=500)
+    function __construct($message='Error', $code=500, $ex=null)
     {
         parent::__construct($message, $code);
 
         $this->default = 500;
 
         // Server errors must be logged.
-
-        common_log(LOG_ERR, "ServerErrorAction: $code $message");
+        $log = "ServerErrorAction: $code $message";
+        if ($ex) {
+            $log .= "\n" . $ex->getTraceAsString();
+        }
+        common_log(LOG_ERR, $log);
     }
 
     // XXX: Should these error actions even be invokable via URI?
index 1c240c475d40c7f71fd428de44eec07499dc3baa..165bbaa8ff7a4bbdc09429f3b703e55d6407846d 100644 (file)
@@ -42,4 +42,4 @@ function subs_unsubscribe_to($user, $other)
     } catch (Exception $e) {
         return $e->getMessage();
     }
-}
\ No newline at end of file
+}
index 8464c2446499556a8fd8bb7812121f2f32f8e32d..2c3b1ea453bb4460291ba49273cd2dc88c566a15 100644 (file)
@@ -228,6 +228,17 @@ class UserProfile extends Widget
 
     function showEntityActions()
     {
+        if ($this->profile->hasRole(Profile_role::DELETED)) {
+            $this->out->elementStart('div', 'entity_actions');
+            $this->out->element('h2', null, _('User actions'));
+            $this->out->elementStart('ul');
+            $this->out->elementStart('p', array('class' => 'profile_deleted'));
+            $this->out->text(_('User deletion in progress...'));
+            $this->out->elementEnd('p');
+            $this->out->elementEnd('ul');
+            $this->out->elementEnd('div');
+            return;
+        }
         if (Event::handle('StartProfilePageActionsSection', array(&$this->out, $this->profile))) {
 
             $cur = common_current_user();
index 3d4ed087f9a74a42e78b7af926a5069a27af41dd..795997868305ff09b2ada3614cf7a9a8d1089cf3 100644 (file)
@@ -1493,7 +1493,15 @@ function common_copy_args($from)
     $to = array();
     $strip = get_magic_quotes_gpc();
     foreach ($from as $k => $v) {
-        $to[$k] = ($strip) ? stripslashes($v) : $v;
+        if($strip) {
+            if(is_array($v)) {
+                $to[$k] = common_copy_args($v);
+            } else {
+                $to[$k] = stripslashes($v);
+            }
+        } else {
+            $to[$k] = $v;
+        }
     }
     return $to;
 }
index 578f0d25092dc04c800e2f3e66f0480651e10809..56029bc82d91f7d4dc029033eeb015b36ec3115b 100644 (file)
@@ -9,12 +9,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:06+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:16+0000\n"
 "Language-Team: Arabic\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ar\n"
 "X-Message-Group: out-statusnet\n"
@@ -22,7 +22,8 @@ msgstr ""
 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "نفاذ"
 
@@ -43,7 +44,6 @@ msgstr "أأمنع المستخدمين المجهولين (غير الوالج
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "خاص"
@@ -74,10 +74,9 @@ msgid "Save access settings"
 msgstr "حفظ إعدادت الوصول"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
-msgstr "أرسÙ\84"
+msgstr "احÙ\81ظ"
 
 #. TRANS: Server error when page not found (404)
 #: actions/all.php:64 actions/public.php:98 actions/replies.php:93
@@ -103,7 +102,7 @@ msgstr "لا صفحة كهذه"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -119,7 +118,7 @@ msgstr "%1$s والأصدقاء, الصفحة %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -174,7 +173,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "أنت والأصدقاء"
 
@@ -201,11 +200,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "لم يتم العثور على وسيلة API."
 
@@ -304,7 +303,7 @@ msgstr "رسالة مباشرة %s"
 #: actions/apidirectmessage.php:105
 #, php-format
 msgid "All the direct messages sent to %s"
-msgstr ""
+msgstr "كل الرسائل المباشرة التي أرسلت إلى %s"
 
 #: actions/apidirectmessagenew.php:126
 msgid "No message text!"
@@ -550,7 +549,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:276
 msgid "Allow or deny access"
-msgstr ""
+msgstr "اسمح أو امنع الوصول"
 
 #: actions/apioauthauthorize.php:292
 #, php-format
@@ -560,7 +559,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "الحساب"
 
@@ -647,18 +646,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "مسار %s الزمني"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -669,12 +656,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "مسار %s الزمني العام"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -694,7 +681,7 @@ msgstr "تكرارات %s"
 msgid "Notices tagged with %s"
 msgstr "الإشعارات الموسومة ب%s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -734,7 +721,7 @@ msgstr "بإمكانك رفع أفتارك الشخصي. أقصى حجم للم
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -917,19 +904,17 @@ msgid "Conversation"
 msgstr "محادثة"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "الإشعارات"
 
 #: actions/deleteapplication.php:63
-#, fuzzy
 msgid "You must be logged in to delete an application."
-msgstr "يجب أن تكون مسجل الدخول لتعدل تطبيقا."
+msgstr "يجب أن تسجل الدخول لتحذف تطبيقا."
 
 #: actions/deleteapplication.php:71
-#, fuzzy
 msgid "Application not found."
-msgstr "Ù\84Ù\85 Ù\8aÙ\88جد Ø±Ù\85ز Ø§Ù\84تأÙ\83Ù\8aد."
+msgstr "Ù\84Ù\85 Ù\8aÙ\88جد Ø§Ù\84تطبÙ\8aÙ\82."
 
 #: actions/deleteapplication.php:78 actions/editapplication.php:77
 #: actions/showapplication.php:94
@@ -938,7 +923,7 @@ msgstr "أنت لست مالك هذا التطبيق."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1125,8 +1110,9 @@ msgstr "ارجع إلى المبدئي"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1242,7 +1228,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعة."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
@@ -1362,7 +1348,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "ليس عنوان بريد صالح."
 
@@ -1436,12 +1422,12 @@ msgstr "ألغِ تفضيل المفضلة"
 #: actions/favorited.php:65 lib/popularnoticesection.php:91
 #: lib/publicgroupnav.php:93
 msgid "Popular notices"
-msgstr "إشعارات Ù\85Ø´Ù\87Ù\88رة"
+msgstr "إشعارات Ù\85حبÙ\88بة"
 
 #: actions/favorited.php:67
 #, php-format
 msgid "Popular notices, page %d"
-msgstr "إشعارات Ù\85Ø´Ù\87Ù\88رة، الصفحة %d"
+msgstr "إشعارات Ù\85حبÙ\88بة، الصفحة %d"
 
 #: actions/favorited.php:79
 msgid "The most popular notices on the site right now."
@@ -1473,7 +1459,7 @@ msgstr "إشعارات %s المُفضلة"
 #: actions/favoritesrss.php:115
 #, php-format
 msgid "Updates favored by %1$s on %2$s!"
-msgstr ""
+msgstr "الإشعارات التي فضلها %1$s في %2$s!"
 
 #: actions/featured.php:69 lib/featureduserssection.php:87
 #: lib/publicgroupnav.php:89
@@ -1546,6 +1532,25 @@ msgstr "لا ملف كهذا."
 msgid "Cannot read file."
 msgstr "تعذّرت قراءة الملف."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "حجم غير صالح."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "لا يمكنك إسكات المستخدمين على هذا الموقع."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "المستخدم مسكت من قبل."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1624,7 +1629,7 @@ msgstr "تعذّر تحديث تصميمك."
 
 #: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
-msgstr ""
+msgstr "حُفظت تفضيلات التصميم."
 
 #: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
@@ -1676,7 +1681,7 @@ msgstr "امنع"
 
 #: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
-msgstr ""
+msgstr "اجعل المستخدم إداريًا في المجموعة"
 
 #: actions/groupmembers.php:482
 msgid "Make Admin"
@@ -1686,12 +1691,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr "اجعل هذا المستخدم إداريًا"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "مسار %s الزمني"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "مجموعات"
@@ -1924,7 +1935,6 @@ msgstr ""
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "أرسل"
@@ -2246,8 +2256,8 @@ msgstr "نوع المحتوى "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "ليس نسق بيانات مدعوم."
 
@@ -2343,7 +2353,7 @@ msgstr "كلمة السر القديمة"
 
 #: actions/passwordsettings.php:108 actions/recoverpassword.php:235
 msgid "New password"
-msgstr "Ù\83Ù\84Ù\85Ø© Ø³Ø± جديدة"
+msgstr "Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84جديدة"
 
 #: actions/passwordsettings.php:109
 msgid "6 or more characters"
@@ -2386,7 +2396,8 @@ msgstr "تعذّر حفظ كلمة السر الجديدة."
 msgid "Password saved."
 msgstr "حُفظت كلمة السر."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "المسارات"
 
@@ -2506,7 +2517,7 @@ msgstr "دليل الخلفيات"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "مطلقا"
 
@@ -2557,13 +2568,13 @@ msgstr "ليس وسم أشخاص صالح: %s"
 #: actions/peopletag.php:144
 #, php-format
 msgid "Users self-tagged with %1$s - page %2$d"
-msgstr ""
+msgstr "المستخدمون الذين وسموا أنفسهم ب%1$s - الصفحة %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "محتوى إشعار غير صالح"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2640,7 +2651,7 @@ msgid ""
 msgstr ""
 "سِم نفسك (حروف وأرقام و \"-\" و \".\" و \"_\")، افصلها بفاصلة (',') أو مسافة."
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "اللغة"
 
@@ -2666,7 +2677,7 @@ msgstr "اشترك تلقائيًا بأي شخص يشترك بي (يفضل أن
 msgid "Bio is too long (max %d chars)."
 msgstr ""
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "لم تُختر المنطقة الزمنية."
 
@@ -2970,7 +2981,7 @@ msgid "Same as password above. Required."
 msgstr "نفس كلمة السر أعلاه. مطلوب."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "البريد الإلكتروني"
 
@@ -3054,7 +3065,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "اشترك"
 
@@ -3150,6 +3161,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "لا يمكنك إسكات المستخدمين على هذا الموقع."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "المستخدم بدون ملف مطابق."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "ستاتس نت"
@@ -3162,7 +3183,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "الجلسات"
 
@@ -3187,7 +3210,7 @@ msgstr "تنقيح الجلسة"
 msgid "Turn on debugging output for sessions."
 msgstr "مكّن تنقيح مُخرجات الجلسة."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "اذف إعدادت الموقع"
@@ -3218,8 +3241,8 @@ msgstr "المنظمة"
 msgid "Description"
 msgstr "الوصف"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "إحصاءات"
 
@@ -3356,45 +3379,45 @@ msgstr "الكنى"
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "الأعضاء"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(لا شيء)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "جميع الأعضاء"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "أنشئ"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3403,8 +3426,13 @@ msgid ""
 "their life and interests. [Join now](%%%%action.register%%%%) to become part "
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
+"**%s** مجموعة مستخدمين على %%%%site.name%%%%، خدمة [التدوين المُصغّر](http://"
+"en.wikipedia.org/wiki/Micro-blogging) المبنية على البرنامج الحر [StatusNet]"
+"(http://status.net/). يتشارك أعضاؤها رسائل قصيرة عن حياتهم واهتماماتهم. "
+"[انضم الآن](%%%%action.register%%%%) لتصبح عضوًا في هذه المجموعة ومجموعات "
+"أخرى عديدة! ([اقرأ المزيد](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3412,8 +3440,11 @@ msgid ""
 "[StatusNet](http://status.net/) tool. Its members share short messages about "
 "their life and interests. "
 msgstr ""
+"**%s** مجموعة مستخدمين على %%%%site.name%%%%، خدمة [التدوين المُصغّر](http://"
+"en.wikipedia.org/wiki/Micro-blogging) المبنية على البرنامج الحر [StatusNet]"
+"(http://status.net/). يتشارك أعضاؤها رسائل قصيرة عن حياتهم واهتماماتهم. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "الإداريون"
 
@@ -3445,9 +3476,9 @@ msgid " tagged %s"
 msgstr ""
 
 #: actions/showstream.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s, page %2$d"
-msgstr "%1$s والأصدقاء, الصفحة %2$d"
+msgstr "%1$s، الصفحة %2$d"
 
 #: actions/showstream.php:122
 #, php-format
@@ -3500,6 +3531,11 @@ msgid ""
 "[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to "
 "follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
+"لدى **%s** حساب على  %%site.name%%، خدمة [التدوين المُصغّر](http://en."
+"wikipedia.org/wiki/Micro-blogging) المبنية على البرنامج الحر [StatusNet]"
+"(http://status.net/). يتشارك أعضاؤها رسائل قصيرة عن حياتهم واهتماماتهم. "
+"[انضم الآن](%%%%action.register%%%%) لتتابع إشعارت **%s** وغيره! ([اقرأ "
+"المزيد](%%%%doc.help%%%%))"
 
 #: actions/showstream.php:248
 #, php-format
@@ -3523,146 +3559,131 @@ msgid "User is already silenced."
 msgstr "المستخدم مسكت من قبل."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr "الإعدادات الأساسية لموقع StatusNet هذا."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "يجب ألا يكون طول اسم الموقع صفرًا."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "يجب أن تملك عنوان بريد إلكتروني صحيح."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "لغة غير معروفة \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "حد النص الأدنى هو 140 حرفًا."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "عام"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "اسم الموقع"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "اسم موقعك، \"التدوين المصغر لشركتك\" مثلا"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "عنوان البريد الإلكتروني للاتصال بموقعك"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "محلي"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "المنطقة الزمنية المبدئية"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "المنطقة الزمنية المبدئية للموقع؛ ت‌ع‌م عادة."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr "لغة الموقع المبدئية"
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "في مهمة مُجدولة"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "التكرار"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
+msgstr "اللغة المبدئية"
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "بلّغ عن المسار"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "الحدود"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "حد النص"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "أقصى عدد للحروف في الإشعارات."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "إشعار الموقع"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "عدّل رسالة الموقع العامة"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "مشكلة أثناء حفظ الإشعار."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "نص إشعار الموقع"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr "نص إشعار عام للموقع (255 حرف كحد أقصى؛ يسمح بHTML)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "احفظ إشعار الموقع"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "إعدادات الرسائل القصيرة"
@@ -3755,6 +3776,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "لم تدخل رمزًا"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "غيّر ضبط الموقع"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "في مهمة مُجدولة"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "التكرار"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "بلّغ عن المسار"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "اذف إعدادت الموقع"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -3948,7 +4029,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -3956,7 +4037,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "المستخدم"
@@ -4139,16 +4219,22 @@ msgstr "%1$s أعضاء المجموعة, الصفحة %2$d"
 msgid "Search for more groups"
 msgstr "ابحث عن المزيد من المجموعات"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s ليس عضوًا في أي مجموعة."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4194,7 +4280,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "الملحقات"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "النسخة"
 
@@ -4257,39 +4343,39 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "مشكلة في حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكلة في حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "مشكلة أثناء حفظ الإشعار."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشكلة أثناء حفظ الإشعار."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "آر تي @%1$s %2$s"
@@ -4314,7 +4400,12 @@ msgstr "غير مشترك!"
 msgid "Couldn't delete self-subscription."
 msgstr "لم يمكن حذف اشتراك ذاتي."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "تعذّر حذف الاشتراك."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "تعذّر حذف الاشتراك."
 
@@ -4323,20 +4414,20 @@ msgstr "تعذّر حذف الاشتراك."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم في %1$s يا @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعة."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "تعذّر ضبط عضوية المجموعة."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضوية المجموعة."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "تعذّر حفظ الاشتراك."
@@ -4378,194 +4469,171 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "صفحة غير مُعنونة"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "الملف الشخصي ومسار الأصدقاء الزمني"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
-msgstr "شخصية"
+msgstr "اÙ\84صÙ\81حة Ø§Ù\84شخصÙ\8aØ©"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
-msgstr "غير كلمة سرّك"
-
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "الحساب"
+msgstr "غير بريدك الإلكتروني وكلمة سرّك وأفتارك وملفك الشخصي"
 
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "اتصالات"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "اتصل"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "غيّر ضبط الموقع"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "إداري"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
-msgstr "استخدÙ\85 Ù\87ذا Ø§Ù\84Ù\86Ù\85Ù\88ذج Ù\84دعÙ\88Ø© Ø£ØµØ¯Ù\82ائÙ\83 Ù\88زÙ\85Ù\84ائÙ\83 Ù\84استخداÙ\85 Ù\87Ø°Ù\87 Ø§Ù\84خدÙ\85Ø©."
+msgstr "ادعÙ\8f Ø£ØµØ¯Ù\82ائÙ\83 Ù\88زÙ\85Ù\84ائÙ\83 Ù\84Ù\84اÙ\86ضÙ\85اÙ\85 Ø¥Ù\84Ù\8aÙ\83 Ù\81Ù\8a %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "ادعُ"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "اخرج من الموقع"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "اخرج"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "أنشئ حسابًا"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "سجّل"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "لُج إلى الموقع"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "لُج"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "ساعدني!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "مساعدة"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
-msgstr "ابحث عن أشخاص أو نص"
+msgstr "ابحث عن أشخاص أو نصوص"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "ابحث"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "إشعار الموقع"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "المشاهدات المحلية"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "إشعار الصفحة"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "مساعدة"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "عن"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "الأسئلة المكررة"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "الشروط"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "خصوصية"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "المصدر"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "اتصل"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "الجسر"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "رخصة برنامج StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4574,12 +4642,12 @@ msgstr ""
 "**%%site.name%%** خدمة تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4590,60 +4658,60 @@ msgstr ""
 "المتوفر تحت [رخصة غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
 "agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "رخصة محتوى الموقع"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "الرخصة."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "قبل"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
-msgstr ""
+msgstr "لا يمكنك إجراء تغييرات على هذا الموقع."
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:110
@@ -4651,92 +4719,77 @@ msgid "Changes to that panel are not allowed."
 msgstr "التغييرات لهذه اللوحة غير مسموح بها."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "تعذّر حذف إعدادات التصميم."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "ضبط الموقع الأساسي"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "الموقع"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "ضبط التصميم"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "التصميم"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
-#, fuzzy
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
-msgstr "ضبط Ø§Ù\84Ù\85سارات"
+msgstr "ضبط Ø§Ù\84Ù\85ستخدÙ\85"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "المستخدم"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "ضبط الحساب"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "نفاذ"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "ضبط المسارات"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "المسارات"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "ضبط الجلسات"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "عدّل إشعار الموقع"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "الجلسات"
+msgid "Snapshots configuration"
+msgstr "ضبط المسارات"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -4753,7 +4806,7 @@ msgstr "عدّل التطبيق"
 
 #: lib/applicationeditform.php:184
 msgid "Icon for this application"
-msgstr ""
+msgstr "أيقونة لهذا التطبيق"
 
 #: lib/applicationeditform.php:204
 #, php-format
@@ -4786,7 +4839,7 @@ msgstr ""
 
 #: lib/applicationeditform.php:258
 msgid "Browser"
-msgstr ""
+msgstr "متصفح"
 
 #: lib/applicationeditform.php:274
 msgid "Desktop"
@@ -4923,12 +4976,12 @@ msgstr "%s ترك المجموعة %s"
 msgid "Fullname: %s"
 msgstr "الاسم الكامل: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "الموقع: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "الصفحة الرئيسية: %s"
@@ -4988,9 +5041,8 @@ msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
 #: lib/command.php:554 lib/command.php:589
-#, fuzzy
 msgid "No such user"
-msgstr "لا مستخدم كهذا."
+msgstr "لا مستخدم كهذا"
 
 #: lib/command.php:561
 #, php-format
@@ -5008,23 +5060,23 @@ msgstr ""
 
 #: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
-msgstr ""
+msgstr "الأمر لم يُجهزّ بعد."
 
 #: lib/command.php:616
 msgid "Notification off."
-msgstr ""
+msgstr "الإشعار مُطفأ."
 
 #: lib/command.php:618
 msgid "Can't turn off notification."
-msgstr ""
+msgstr "تعذّر إطفاء الإشعارات."
 
 #: lib/command.php:639
 msgid "Notification on."
-msgstr ""
+msgstr "الإشعار يعمل."
 
 #: lib/command.php:641
 msgid "Can't turn on notification."
-msgstr ""
+msgstr "تعذّر تشغيل الإشعار."
 
 #: lib/command.php:654
 msgid "Login command is disabled"
@@ -5233,6 +5285,11 @@ msgstr ""
 msgid "Go"
 msgstr "اذهب"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5362,17 +5419,17 @@ msgstr "غادر"
 
 #: lib/logingroupnav.php:80
 msgid "Login with a username and password"
-msgstr ""
+msgstr "لُج باسم مستخدم وكلمة سر"
 
 #: lib/logingroupnav.php:86
 msgid "Sign up for a new account"
-msgstr ""
+msgstr "سجّل حسابًا جديدًا"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "تأكيد عنوان البريد الإلكتروني"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5388,13 +5445,25 @@ msgid ""
 "Thanks for your time, \n"
 "%s\n"
 msgstr ""
+"مرحبًا، %s.\n"
+"\n"
+"لقد أدخل أحدهم قبل لحظات عنوان البريد الإلكتروني هذا على  %s.\n"
+"\n"
+"إذا كنت هو، وإذا كنت تريد تأكيد هذه المدخلة، فاستخدم المسار أدناه:\n"
+"\n"
+" %s\n"
+"\n"
+"إذا كان الأمر خلاف ذلك، فتجاهل هذه الرسالة.\n"
+"\n"
+"شكرًا على الوقت الذي أمضيته، \n"
+"%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s يستمع الآن إلى إشعاراتك على %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5419,17 +5488,17 @@ msgstr ""
 "----\n"
 "غيّر خيارات البريد الإلكتروني والإشعار في %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "السيرة: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
-msgstr ""
+msgstr "عنوان بريد إلكتروني جديد للإرسال إلى %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5442,21 +5511,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "حالة %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
-msgstr ""
+msgstr "تأكيد الرسالة القصيرة"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
-msgstr ""
+msgstr "لقد نبهك %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5472,12 +5541,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "رسالة خاصة جديدة من %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5496,12 +5565,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
-msgstr ""
+msgstr "لقد أضاف %s (@%s) إشعارك إلى مفضلاته"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5522,12 +5591,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
-msgstr ""
+msgstr "لقد أرسل %s (@%s) إشعارًا إليك"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5642,7 +5711,6 @@ msgid "Available characters"
 msgstr "المحارف المتوفرة"
 
 #: lib/messageform.php:178 lib/noticeform.php:236
-#, fuzzy
 msgctxt "Send button for sending notice"
 msgid "Send"
 msgstr "أرسل"
@@ -5767,10 +5835,6 @@ msgstr "الردود"
 msgid "Favorites"
 msgstr "المفضلات"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "المستخدم"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق الوارد"
@@ -5796,7 +5860,7 @@ msgstr "وسوم في إشعارات %s"
 msgid "Unknown"
 msgstr "غير معروفة"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "الاشتراكات"
 
@@ -5804,23 +5868,23 @@ msgstr "الاشتراكات"
 msgid "All subscriptions"
 msgstr "جميع الاشتراكات"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "المشتركون"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "جميع المشتركين"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "هوية المستخدم"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "عضو منذ"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "كل المجموعات"
 
@@ -5850,7 +5914,7 @@ msgstr "مُختارون"
 
 #: lib/publicgroupnav.php:92
 msgid "Popular"
-msgstr "Ù\85Ø´Ù\87Ù\88رة"
+msgstr "Ù\85حبÙ\88بة"
 
 #: lib/repeatform.php:107
 msgid "Repeat this notice?"
@@ -5860,7 +5924,12 @@ msgstr "أأكرّر هذا الإشعار؟ّ"
 msgid "Repeat this notice"
 msgstr "كرّر هذا الإشعار"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "امنع هذا المستخدم من هذه المجموعة"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6014,47 +6083,62 @@ msgstr "رسالة"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "ملف المستخدم الشخصي"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "إداري"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "مراقب"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "قبل دقيقة تقريبًا"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "قبل ساعة تقريبًا"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "قبل سنة تقريبًا"
 
index 3ce1fbc4efcc7659a8fbe3840e65322b8eeab6b0..aaf1d89bd2c4568fab2480fe7bcded99d702a3df 100644 (file)
@@ -10,12 +10,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:09+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:19+0000\n"
 "Language-Team: Egyptian Spoken Arabic\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: arz\n"
 "X-Message-Group: out-statusnet\n"
@@ -23,7 +23,8 @@ msgstr ""
 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "نفاذ"
 
@@ -107,7 +108,7 @@ msgstr "لا صفحه كهذه"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +124,7 @@ msgstr "%1$s و الصحاب, صفحه %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -178,7 +179,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "أنت والأصدقاء"
 
@@ -205,11 +206,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "الـ API method مش موجوده."
 
@@ -564,7 +565,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "الحساب"
 
@@ -651,18 +652,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "مسار %s الزمني"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -673,12 +662,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "مسار %s الزمنى العام"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -698,7 +687,7 @@ msgstr "تكرارات %s"
 msgid "Notices tagged with %s"
 msgstr "الإشعارات الموسومه ب%s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -738,7 +727,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -921,7 +910,7 @@ msgid "Conversation"
 msgstr "محادثة"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "الإشعارات"
 
@@ -942,7 +931,7 @@ msgstr "انت مش بتملك الapplication دى."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1132,8 +1121,9 @@ msgstr "ارجع إلى المبدئي"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1250,7 +1240,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعه."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
@@ -1370,7 +1360,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "ليس عنوان بريد صالح."
 
@@ -1554,6 +1544,25 @@ msgstr "لا ملف كهذا."
 msgid "Cannot read file."
 msgstr "تعذّرت قراءه الملف."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "حجم غير صالح."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "لا يمكنك إسكات المستخدمين على هذا الموقع."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "المستخدم مسكت من قبل."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1694,12 +1703,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr "اجعل هذا المستخدم إداريًا"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "مسار %s الزمني"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "مجموعات"
@@ -2252,8 +2267,8 @@ msgstr "نوع المحتوى "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr " مش نظام بيانات مدعوم."
 
@@ -2392,7 +2407,8 @@ msgstr "تعذّر حفظ كلمه السر الجديده."
 msgid "Password saved."
 msgstr "حُفظت كلمه السر."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "المسارات"
 
@@ -2512,7 +2528,7 @@ msgstr "دليل الخلفيات"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "مطلقا"
 
@@ -2565,11 +2581,11 @@ msgstr "ليس وسم أشخاص صالح: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr ""
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "محتوى إشعار غير صالح"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2645,7 +2661,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "اللغة"
 
@@ -2671,7 +2687,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr ""
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "لم تُختر المنطقه الزمنيه."
 
@@ -2975,7 +2991,7 @@ msgid "Same as password above. Required."
 msgstr "نفس كلمه السر أعلاه. مطلوب."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "البريد الإلكتروني"
 
@@ -3059,7 +3075,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "اشترك"
 
@@ -3155,6 +3171,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "لا يمكنك إسكات المستخدمين على هذا الموقع."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "يوزر من-غير پروفايل زيّه."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3167,7 +3193,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "الجلسات"
 
@@ -3192,7 +3220,7 @@ msgstr "تنقيح الجلسة"
 msgid "Turn on debugging output for sessions."
 msgstr "مكّن تنقيح مُخرجات الجلسه."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "اذف إعدادت الموقع"
@@ -3223,8 +3251,8 @@ msgstr "المنظمه"
 msgid "Description"
 msgstr "الوصف"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "إحصاءات"
 
@@ -3361,45 +3389,45 @@ msgstr "الكنى"
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "الأعضاء"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(لا شيء)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "جميع الأعضاء"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "أنشئ"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3409,7 +3437,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3418,7 +3446,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "الإداريون"
 
@@ -3528,146 +3556,137 @@ msgid "User is already silenced."
 msgstr "المستخدم مسكت من قبل."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "الإعدادات الأساسيه لموقع StatusNet هذا."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "يجب ألا يكون طول اسم الموقع صفرًا."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "لازم يكون عندك عنوان ايميل صالح."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "لغه مش معروفه \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "حد النص الأدنى هو 140 حرفًا."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "عام"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "اسم الموقع"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "اسم موقعك، \"التدوين المصغر لشركتك\" مثلا"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "عنوان البريد الإلكترونى للاتصال بموقعك"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "محلي"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "المنطقه الزمنيه المبدئية"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "المنطقه الزمنيه المبدئيه للموقع؛ ت‌ع‌م عاده."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "لغه الموقع المبدئية"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "فى مهمه مُجدولة"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "التكرار"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "بلّغ عن المسار"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "الحدود"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "حد النص"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "أقصى عدد للحروف فى الإشعارات."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "إشعار الموقع"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "رساله جديدة"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "مشكله أثناء حفظ الإشعار."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "إشعار الموقع"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "إشعار الموقع"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "تظبيطات الـSMS"
@@ -3760,6 +3779,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "غيّر ضبط الموقع"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "فى مهمه مُجدولة"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "التكرار"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "بلّغ عن المسار"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "اذف إعدادت الموقع"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -3954,7 +4033,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4145,16 +4224,22 @@ msgstr "%1$s أعضاء المجموعة, الصفحه %2$d"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4198,7 +4283,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "النسخه"
 
@@ -4262,39 +4347,39 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "مشكله فى حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكله فى حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "مشكله أثناء حفظ الإشعار."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشكله أثناء حفظ الإشعار."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "آر تى @%1$s %2$s"
@@ -4319,7 +4404,12 @@ msgstr "غير مشترك!"
 msgid "Couldn't delete self-subscription."
 msgstr "ما نفعش يمسح الاشتراك الشخصى."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "تعذّر حذف الاشتراك."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "تعذّر حذف الاشتراك."
 
@@ -4328,20 +4418,20 @@ msgstr "تعذّر حذف الاشتراك."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم فى %1$s يا @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعه."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "تعذّر ضبط عضويه المجموعه."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضويه المجموعه."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "تعذّر حفظ الاشتراك."
@@ -4383,194 +4473,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "صفحه غير مُعنونة"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "الملف الشخصى ومسار الأصدقاء الزمني"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "شخصية"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "غير كلمه سرّك"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "الحساب"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "كونيكشونات (Connections)"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "اتصل"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "غيّر ضبط الموقع"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "إداري"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "ادعُ"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "اخرج من الموقع"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "اخرج"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "أنشئ حسابًا"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "سجّل"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "لُج إلى الموقع"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "لُج"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "ساعدني!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "مساعدة"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "ابحث عن أشخاص أو نص"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "ابحث"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "إشعار الموقع"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "المشاهدات المحلية"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "إشعار الصفحة"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "مساعدة"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "عن"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "الأسئله المكررة"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "الشروط"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "خصوصية"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "المصدر"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "اتصل"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4579,12 +4662,12 @@ msgstr ""
 "**%%site.name%%** خدمه تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4595,53 +4678,53 @@ msgstr ""
 "المتوفر تحت [رخصه غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
 "agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "رخصه محتوى الموقع"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "الرخصه."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "قبل"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4656,94 +4739,83 @@ msgid "Changes to that panel are not allowed."
 msgstr "التغييرات مش مسموحه للـ لوحه دى."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "تعذّر حذف إعدادات التصميم."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "ضبط الموقع الأساسي"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "الموقع"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "ضبط التصميم"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "التصميم"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "ضبط المسارات"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "المستخدم"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "ضبط التصميم"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "نفاذ"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "ضبط المسارات"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "المسارات"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "ضبط التصميم"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "الجلسات"
+msgid "Edit site notice"
+msgstr "إشعار الموقع"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "ضبط المسارات"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -4930,12 +5002,12 @@ msgstr "%s ساب الجروپ %s"
 msgid "Fullname: %s"
 msgstr "الاسم الكامل: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "الموقع: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "الصفحه الرئيسية: %s"
@@ -5240,6 +5312,11 @@ msgstr ""
 msgid "Go"
 msgstr "اذهب"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5375,11 +5452,11 @@ msgstr ""
 msgid "Sign up for a new account"
 msgstr ""
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "تأكيد عنوان البريد الإلكتروني"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5396,12 +5473,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr ""
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5416,17 +5493,17 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "عن نفسك: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5439,21 +5516,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "حاله %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5469,12 +5546,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "رساله خاصه جديده من %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5493,12 +5570,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr ""
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5519,12 +5596,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5764,10 +5841,6 @@ msgstr "الردود"
 msgid "Favorites"
 msgstr "المفضلات"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "المستخدم"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق الوارد"
@@ -5793,7 +5866,7 @@ msgstr ""
 msgid "Unknown"
 msgstr "مش معروف"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "الاشتراكات"
 
@@ -5801,23 +5874,23 @@ msgstr "الاشتراكات"
 msgid "All subscriptions"
 msgstr "جميع الاشتراكات"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "المشتركون"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "جميع المشتركين"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "هويه المستخدم"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "عضو منذ"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "كل المجموعات"
 
@@ -5857,7 +5930,12 @@ msgstr "كرر هذا الإشعار؟"
 msgid "Repeat this notice"
 msgstr "كرر هذا الإشعار"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "امنع هذا المستخدم من هذه المجموعة"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6011,47 +6089,63 @@ msgstr "رسالة"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "ملف المستخدم الشخصي"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "الإداريون"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "قبل دقيقه تقريبًا"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "قبل ساعه تقريبًا"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "قبل سنه تقريبًا"
 
index abf1998d84ff63d5c9870a911fa6753f38f0ffcb..3a6b5b0472986248dd9d9d0be897fe528888291e 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:12+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:22+0000\n"
 "Language-Team: Bulgarian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: bg\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Достъп"
 
@@ -102,7 +103,7 @@ msgstr "Няма такака страница."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -118,7 +119,7 @@ msgstr "%1$s и приятели, страница %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -173,7 +174,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Вие и приятелите"
 
@@ -200,11 +201,11 @@ msgstr "Бележки от %1$s и приятели в %2$s."
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Не е открит методът в API."
 
@@ -570,7 +571,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Сметка"
 
@@ -658,18 +659,6 @@ msgstr "%s / Отбелязани като любими от %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s бележки отбелязани като любими от %s / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Поток на %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Бележки от %1$s в %2$s."
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -680,12 +669,12 @@ msgstr "%1$s / Реплики на %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s реплики на съобщения от %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Общ поток на %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -705,7 +694,7 @@ msgstr "Повторения на %s"
 msgid "Notices tagged with %s"
 msgstr "Бележки с етикет %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Бележки от %1$s в %2$s."
@@ -747,7 +736,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Потребител без съответстващ профил"
 
@@ -932,7 +921,7 @@ msgid "Conversation"
 msgstr "Разговор"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Бележки"
 
@@ -954,7 +943,7 @@ msgstr "Не членувате в тази група."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Имаше проблем със сесията ви в сайта."
 
@@ -1149,8 +1138,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1278,7 +1268,7 @@ msgstr "Описанието е твърде дълго (до %d символа)
 msgid "Could not update group."
 msgstr "Грешка при обновяване на групата."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Грешка при отбелязване като любима."
@@ -1402,7 +1392,7 @@ msgid "Cannot normalize that email address"
 msgstr "Грешка при нормализиране адреса на е-пощата"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Неправилен адрес на е-поща."
 
@@ -1595,6 +1585,25 @@ msgstr "Няма такъв файл."
 msgid "Cannot read file."
 msgstr "Грешка при четене на файла."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Неправилен размер."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Не може да изпращате съобщения до този потребител."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Потребителят вече е заглушен."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1744,12 +1753,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Поток на %s"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Бележки от %1$s в %2$s."
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Групи"
@@ -2362,8 +2377,8 @@ msgstr "вид съдържание "
 msgid "Only "
 msgstr "Само "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Неподдържан формат на данните"
 
@@ -2509,7 +2524,8 @@ msgstr "Грешка при запазване на новата парола."
 msgid "Password saved."
 msgstr "Паролата е записана."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Пътища"
 
@@ -2629,7 +2645,7 @@ msgstr "Директория на фона"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Никога"
 
@@ -2684,11 +2700,11 @@ msgstr "Това не е правилен адрес на е-поща."
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Бележки с етикет %s, страница %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Невалидно съдържание на бележка"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2764,7 +2780,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Език"
 
@@ -2792,7 +2808,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Биографията е твърде дълга (до %d символа)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Не е избран часови пояс"
 
@@ -3097,7 +3113,7 @@ msgid "Same as password above. Required."
 msgstr "Същото като паролата по-горе. Задължително поле."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Е-поща"
 
@@ -3202,7 +3218,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Адрес на профила ви в друга, съвместима услуга за микроблогване"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Абониране"
 
@@ -3300,6 +3316,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Отговори до %1$s в %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Не можете да заглушавате потребители на този сайт."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Потребител без съответстващ профил"
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3314,7 +3340,9 @@ msgstr "Не може да изпращате съобщения до този 
 msgid "User is already sandboxed."
 msgstr "Потребителят ви е блокирал."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Сесии"
 
@@ -3339,7 +3367,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Запазване настройките на сайта"
@@ -3372,8 +3400,8 @@ msgstr "Организация"
 msgid "Description"
 msgstr "Описание"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Статистики"
 
@@ -3507,45 +3535,45 @@ msgstr "Псевдоними"
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Изходяща кутия за %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Членове"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Всички членове"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Създадена на"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3555,7 +3583,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3564,7 +3592,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Администратори"
 
@@ -3674,147 +3702,138 @@ msgid "User is already silenced."
 msgstr "Потребителят вече е заглушен."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Основни настройки на тази инсталация на StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Името на сайта е задължително."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Адресът на е-поща за контакт е задължителен"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Непознат език \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Минималното ограничение на текста е 140 знака."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Общи"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Име на сайта"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Адрес на е-поща за контакт със сайта"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Местоположение"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Часови пояс по подразбиране"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Часови пояс по подразбиране за сайта (обикновено UTC)."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Език по подразбиране за сайта"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
+#: actions/siteadminpanel.php:271
+msgid "Limits"
+msgstr "Ограничения"
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Честота"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Нова бележка"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Ново съобщение"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr "Ограничения"
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Грешка при записване настройките за Twitter"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Нова бележка"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Нова бележка"
 
 #: actions/smssettings.php:58
 msgid "SMS settings"
@@ -3917,6 +3936,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Не е въведен код."
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Промяна настройките на сайта"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Честота"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Запазване настройките на сайта"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Не сте абонирани за този профил"
@@ -4119,7 +4198,7 @@ msgstr "Сървърът не е върнал адрес на профила."
 msgid "Unsubscribed"
 msgstr "Отписване"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4325,16 +4404,22 @@ msgstr "Членове на групата %s, страница %d"
 msgid "Search for more groups"
 msgstr "Търсене на още групи"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s не членува в никоя група."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Бележки от %1$s в %2$s."
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4378,7 +4463,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Приставки"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Версия"
 
@@ -4446,23 +4531,23 @@ msgstr "Грешка при обновяване на бележката с но
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Грешка при записване на бележката. Непознат потребител."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4471,20 +4556,20 @@ msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Забранено ви е да публикувате бележки в този сайт."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4512,7 +4597,12 @@ msgstr "Не сте абонирани!"
 msgid "Couldn't delete self-subscription."
 msgstr "Грешка при изтриване на абонамента."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Грешка при изтриване на абонамента."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Грешка при изтриване на абонамента."
 
@@ -4521,21 +4611,21 @@ msgstr "Грешка при изтриване на абонамента."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добре дошли в %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Грешка при създаване на групата."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Грешка при създаване на нов абонамент."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Грешка при създаване на нов абонамент."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Грешка при създаване на нов абонамент."
@@ -4578,196 +4668,189 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Неозаглавена страница"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Лично"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Промяна на поща, аватар, парола, профил"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Сметка"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Свързване към услуги"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Свързване"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Промяна настройките на сайта"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Настройки"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Поканете приятели и колеги да се присъединят към вас в %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Покани"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Излизане от сайта"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Изход"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Създаване на нова сметка"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Регистриране"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Влизане в сайта"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Вход"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Помощ"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Помощ"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Търсене за хора или бележки"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Търсене"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "Нова бележка"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "Нова бележка"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Абонаменти"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Помощ"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Относно"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Въпроси"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Условия"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Поверителност"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Изходен код"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Табелка"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Лиценз на програмата StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4776,12 +4859,12 @@ msgstr ""
 "**%%site.name%%** е услуга за микроблогване, предоставена ви от [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** е услуга за микроблогване. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4792,53 +4875,53 @@ msgstr ""
 "достъпна под [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Лиценз на съдържанието"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Всички "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "лиценз."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Страниране"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "След"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Преди"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4854,97 +4937,86 @@ msgid "Changes to that panel are not allowed."
 msgstr "Записването не е позволено."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Командата все още не се поддържа."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Командата все още не се поддържа."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Грешка при записване настройките за Twitter"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Основна настройка на сайта"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Сайт"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Настройка на оформлението"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Версия"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Настройка на пътищата"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Потребител"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Настройка на оформлението"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Достъп"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Настройка на пътищата"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Пътища"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Настройка на оформлението"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Сесии"
+msgid "Edit site notice"
+msgstr "Нова бележка"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Настройка на пътищата"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5139,12 +5211,12 @@ msgstr "%s напусна групата %s"
 msgid "Fullname: %s"
 msgstr "Пълно име: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Местоположение: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Домашна страница: %s"
@@ -5443,6 +5515,11 @@ msgstr "Изберете етикет за конкретизиране"
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "Адрес на страница, блог или профил в друг сайт на групата"
@@ -5580,11 +5657,11 @@ msgstr "Вход с име и парола"
 msgid "Sign up for a new account"
 msgstr "Създаване на нова сметка"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Потвърждаване адреса на е-поща"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5601,12 +5678,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s вече получава бележките ви в %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5631,17 +5708,17 @@ msgstr ""
 "----\n"
 "Може да смените адреса и настройките за уведомяване по е-поща на %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Биография: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Нов адрес на е-поща за публикщуване в %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5654,21 +5731,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Състояние на %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Потвърждение за SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Побутнати сте от %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5684,12 +5761,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Ново лично съобщение от %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5708,12 +5785,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) отбеляза бележката ви като любима"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5734,12 +5811,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5983,10 +6060,6 @@ msgstr "Отговори"
 msgid "Favorites"
 msgstr "Любими"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Потребител"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Входящи"
@@ -6013,7 +6086,7 @@ msgstr "Етикети в бележките на %s"
 msgid "Unknown"
 msgstr "Непознато действие"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Абонаменти"
 
@@ -6021,24 +6094,24 @@ msgstr "Абонаменти"
 msgid "All subscriptions"
 msgstr "Всички абонаменти"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Абонати"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Всички абонати"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "Потребител"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Участник от"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Всички групи"
 
@@ -6079,7 +6152,12 @@ msgstr "Повтаряне на тази бележка"
 msgid "Repeat this notice"
 msgstr "Повтаряне на тази бележка"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Списък с потребителите в тази група."
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6239,47 +6317,63 @@ msgstr "Съобщение"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Потребителски профил"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратори"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "преди няколко секунди"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "преди около минута"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "преди около %d минути"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "преди около час"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "преди около %d часа"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "преди около ден"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "преди около %d дни"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "преди около месец"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "преди около %d месеца"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "преди около година"
 
diff --git a/locale/br/LC_MESSAGES/statusnet.po b/locale/br/LC_MESSAGES/statusnet.po
new file mode 100644 (file)
index 0000000..2197b9e
--- /dev/null
@@ -0,0 +1,6102 @@
+# Translation of StatusNet to Breton
+#
+# Author@translatewiki.net: Fulup
+# Author@translatewiki.net: Y-M D
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:25+0000\n"
+"Language-Team: Dutch\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: br\n"
+"X-Message-Group: out-statusnet\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. TRANS: Page title
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
+msgid "Access"
+msgstr "Moned"
+
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
+msgid "Site access settings"
+msgstr ""
+
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
+msgid "Registration"
+msgstr "Enskrivadur"
+
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
+msgid "Prohibit anonymous users (not logged in) from viewing site?"
+msgstr ""
+
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
+#: actions/accessadminpanel.php:167
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Prevez"
+
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
+msgstr "Aotreañ an enskrivadur goude bezañ bet pedet hepken."
+
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Tud pedet hepken"
+
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
+msgstr "Diweredekaat an enskrivadurioù nevez."
+
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Serr"
+
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
+msgid "Save access settings"
+msgstr "Enrollañ an arventennoù moned"
+
+#: actions/accessadminpanel.php:203
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Enrollañ"
+
+#. TRANS: Server error when page not found (404)
+#: actions/all.php:64 actions/public.php:98 actions/replies.php:93
+#: actions/showfavorites.php:138 actions/tag.php:52
+msgid "No such page"
+msgstr "N'eus ket eus ar bajenn-se"
+
+#: actions/all.php:75 actions/allrss.php:68
+#: actions/apiaccountupdatedeliverydevice.php:113
+#: actions/apiaccountupdateprofile.php:105
+#: actions/apiaccountupdateprofilebackgroundimage.php:116
+#: actions/apiaccountupdateprofileimage.php:105 actions/apiblockcreate.php:97
+#: actions/apiblockdestroy.php:96 actions/apidirectmessage.php:77
+#: actions/apidirectmessagenew.php:75 actions/apigroupcreate.php:112
+#: actions/apigroupismember.php:90 actions/apigroupjoin.php:99
+#: actions/apigroupleave.php:99 actions/apigrouplist.php:90
+#: actions/apistatusesupdate.php:148 actions/apisubscriptions.php:87
+#: actions/apitimelinefavorites.php:70 actions/apitimelinefriends.php:78
+#: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79
+#: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75
+#: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58
+#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116
+#: actions/otp.php:76 actions/remotesubscribe.php:145
+#: actions/remotesubscribe.php:154 actions/replies.php:73
+#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
+#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
+#: lib/command.php:355 lib/command.php:401 lib/command.php:462
+#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
+#: lib/profileaction.php:77
+msgid "No such user."
+msgstr "N'eus ket eus an implijer-se."
+
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
+#, php-format
+msgid "%1$s and friends, page %2$d"
+msgstr "%1$s hag e vignoned, pajenn %2$d"
+
+#. TRANS: Page title. %1$s is user nickname
+#. TRANS: H1 text. %1$s is user nickname
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
+#: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
+#: lib/personalgroupnav.php:100
+#, php-format
+msgid "%s and friends"
+msgstr "%s hag e vignoned"
+
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
+#, php-format
+msgid "Feed for friends of %s (RSS 1.0)"
+msgstr "Gwazh evit mignoned %s (RSS 1.0)"
+
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
+#, php-format
+msgid "Feed for friends of %s (RSS 2.0)"
+msgstr "Gwazh evit mignoned %s (RSS 2.0)"
+
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
+#, php-format
+msgid "Feed for friends of %s (Atom)"
+msgstr "Gwazh evit mignoned %s (Atom)"
+
+#. TRANS: %1$s is user nickname
+#: actions/all.php:134
+#, php-format
+msgid ""
+"This is the timeline for %s and friends but no one has posted anything yet."
+msgstr ""
+
+#: actions/all.php:139
+#, php-format
+msgid ""
+"Try subscribing to more people, [join a group](%%action.groups%%) or post "
+"something yourself."
+msgstr ""
+
+#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@"
+#: actions/all.php:142
+#, php-format
+msgid ""
+"You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
+"his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
+msgstr ""
+
+#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211
+#, php-format
+msgid ""
+"Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
+"post a notice to his or her attention."
+msgstr ""
+
+#. TRANS: H1 text
+#: actions/all.php:178
+msgid "You and friends"
+msgstr "C'hwi hag o mignoned"
+
+#: actions/allrss.php:119 actions/apitimelinefriends.php:119
+#: actions/apitimelinehome.php:120
+#, php-format
+msgid "Updates from %1$s and friends on %2$s!"
+msgstr "Hizivadennoù %1$s ha mignoned e %2$s!"
+
+#: actions/apiaccountratelimitstatus.php:70
+#: actions/apiaccountupdatedeliverydevice.php:93
+#: actions/apiaccountupdateprofile.php:97
+#: actions/apiaccountupdateprofilebackgroundimage.php:94
+#: actions/apiaccountupdateprofilecolors.php:118
+#: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156
+#: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100
+#: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100
+#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138
+#: actions/apigroupismember.php:114 actions/apigroupjoin.php:155
+#: actions/apigroupleave.php:141 actions/apigrouplist.php:132
+#: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106
+#: actions/apigroupshow.php:115 actions/apihelptest.php:88
+#: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
+#: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
+#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
+#: actions/apitimelineretweetedtome.php:121
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
+msgid "API method not found."
+msgstr "N'eo ket bet kavet an hentenn API !"
+
+#: actions/apiaccountupdatedeliverydevice.php:85
+#: actions/apiaccountupdateprofile.php:89
+#: actions/apiaccountupdateprofilebackgroundimage.php:86
+#: actions/apiaccountupdateprofilecolors.php:110
+#: actions/apiaccountupdateprofileimage.php:84 actions/apiblockcreate.php:89
+#: actions/apiblockdestroy.php:88 actions/apidirectmessagenew.php:117
+#: actions/apifavoritecreate.php:90 actions/apifavoritedestroy.php:91
+#: actions/apifriendshipscreate.php:91 actions/apifriendshipsdestroy.php:91
+#: actions/apigroupcreate.php:104 actions/apigroupjoin.php:91
+#: actions/apigroupleave.php:91 actions/apistatusesretweet.php:65
+#: actions/apistatusesupdate.php:118
+msgid "This method requires a POST."
+msgstr "Ezhomm en deus an argerzh-mañ eus ur POST."
+
+#: actions/apiaccountupdatedeliverydevice.php:105
+msgid ""
+"You must specify a parameter named 'device' with a value of one of: sms, im, "
+"none"
+msgstr ""
+
+#: actions/apiaccountupdatedeliverydevice.php:132
+msgid "Could not update user."
+msgstr "Diposubl eo hizivaat an implijer."
+
+#: actions/apiaccountupdateprofile.php:112
+#: actions/apiaccountupdateprofilebackgroundimage.php:194
+#: actions/apiaccountupdateprofilecolors.php:185
+#: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108
+#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74
+#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66
+#: lib/profileaction.php:84
+msgid "User has no profile."
+msgstr "An implijer-mañ n'eus profil ebet dezhañ."
+
+#: actions/apiaccountupdateprofile.php:147
+msgid "Could not save profile."
+msgstr "Diposubl eo enrollañ ar profil."
+
+#: actions/apiaccountupdateprofilebackgroundimage.php:108
+#: actions/apiaccountupdateprofileimage.php:97
+#: actions/apistatusesupdate.php:131 actions/avatarsettings.php:257
+#: actions/designadminpanel.php:122 actions/editapplication.php:118
+#: actions/newapplication.php:101 actions/newnotice.php:94
+#: lib/designsettings.php:283
+#, php-format
+msgid ""
+"The server was unable to handle that much POST data (%s bytes) due to its "
+"current configuration."
+msgstr ""
+
+#: actions/apiaccountupdateprofilebackgroundimage.php:136
+#: actions/apiaccountupdateprofilebackgroundimage.php:146
+#: actions/apiaccountupdateprofilecolors.php:164
+#: actions/apiaccountupdateprofilecolors.php:174
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
+#: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
+#: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
+msgid "Unable to save your design settings."
+msgstr ""
+
+#: actions/apiaccountupdateprofilebackgroundimage.php:187
+#: actions/apiaccountupdateprofilecolors.php:142
+msgid "Could not update your design."
+msgstr "Diposubl eo hizivat ho design."
+
+#: actions/apiblockcreate.php:105
+msgid "You cannot block yourself!"
+msgstr "Ne c'helloc'h ket ho stankañ ho unan !"
+
+#: actions/apiblockcreate.php:126
+msgid "Block user failed."
+msgstr "N'eo ket bet stanke an implijer."
+
+#: actions/apiblockdestroy.php:114
+msgid "Unblock user failed."
+msgstr "N'eus ket bet tu distankañ an implijer."
+
+#: actions/apidirectmessage.php:89
+#, php-format
+msgid "Direct messages from %s"
+msgstr "Kemennadennoù war-eeun kaset gant %s"
+
+#: actions/apidirectmessage.php:93
+#, php-format
+msgid "All the direct messages sent from %s"
+msgstr "An holl gemennadennoù war-eeun kaset gant %s"
+
+#: actions/apidirectmessage.php:101
+#, php-format
+msgid "Direct messages to %s"
+msgstr "Kemennadennoù war-eeun kaset da %s"
+
+#: actions/apidirectmessage.php:105
+#, php-format
+msgid "All the direct messages sent to %s"
+msgstr "An holl gemennadennoù war-eeun kaset da %s"
+
+#: actions/apidirectmessagenew.php:126
+msgid "No message text!"
+msgstr "Kemenadenn hep testenn !"
+
+#: actions/apidirectmessagenew.php:135 actions/newmessage.php:150
+#, php-format
+msgid "That's too long. Max message size is %d chars."
+msgstr "Re hir eo ! Ment hirañ ar gemenadenn a zo a %d arouezenn."
+
+#: actions/apidirectmessagenew.php:146
+msgid "Recipient user not found."
+msgstr "N'eo ket bet kavet ar resever."
+
+#: actions/apidirectmessagenew.php:150
+msgid "Can't send direct messages to users who aren't your friend."
+msgstr ""
+"Ne c'helloc'h ket kas kemennadennoù personel d'an implijerien n'int ket ho "
+"mignoned."
+
+#: actions/apifavoritecreate.php:108 actions/apifavoritedestroy.php:109
+#: actions/apistatusesdestroy.php:113
+msgid "No status found with that ID."
+msgstr "N'eo bet kavet statud ebet gant an ID-mañ."
+
+#: actions/apifavoritecreate.php:119
+msgid "This status is already a favorite."
+msgstr "Ur pennroll eo dija an ali-mañ."
+
+#: actions/apifavoritecreate.php:130 actions/favor.php:84 lib/command.php:176
+msgid "Could not create favorite."
+msgstr "Diposupl eo krouiñ ar pennroll-mañ."
+
+#: actions/apifavoritedestroy.php:122
+msgid "That status is not a favorite."
+msgstr "N'eo ket ar statud-mañ ur pennroll."
+
+#: actions/apifavoritedestroy.php:134 actions/disfavor.php:87
+msgid "Could not delete favorite."
+msgstr "Diposupl eo dilemel ar pennroll-mañ."
+
+#: actions/apifriendshipscreate.php:109
+msgid "Could not follow user: User not found."
+msgstr "Diposupl eo heuliañ an implijer : N'eo ket bet kavet an implijer."
+
+#: actions/apifriendshipscreate.php:118
+#, php-format
+msgid "Could not follow user: %s is already on your list."
+msgstr "Diposubl eo heuliañ an implijer : war ho listenn emañ %s dija."
+
+#: actions/apifriendshipsdestroy.php:109
+msgid "Could not unfollow user: User not found."
+msgstr ""
+"Diposupl eo paouez heuliañ an implijer : N'eo ket bet kavet an implijer."
+
+#: actions/apifriendshipsdestroy.php:120
+msgid "You cannot unfollow yourself."
+msgstr "Ne c'hallit ket chom hep ho heuliañ hoc'h-unan."
+
+#: actions/apifriendshipsexists.php:94
+msgid "Two user ids or screen_names must be supplied."
+msgstr ""
+
+#: actions/apifriendshipsshow.php:134
+msgid "Could not determine source user."
+msgstr "Diposubl eo termeniñ an implijer mammenn."
+
+#: actions/apifriendshipsshow.php:142
+msgid "Could not find target user."
+msgstr "Diposubl eo kavout an implijer pal."
+
+#: actions/apigroupcreate.php:166 actions/editgroup.php:186
+#: actions/newgroup.php:126 actions/profilesettings.php:215
+#: actions/register.php:205
+msgid "Nickname must have only lowercase letters and numbers and no spaces."
+msgstr ""
+
+#: actions/apigroupcreate.php:175 actions/editgroup.php:190
+#: actions/newgroup.php:130 actions/profilesettings.php:238
+#: actions/register.php:208
+msgid "Nickname already in use. Try another one."
+msgstr "Implijet eo dija al lesanv-se. Klaskit unan all."
+
+#: actions/apigroupcreate.php:182 actions/editgroup.php:193
+#: actions/newgroup.php:133 actions/profilesettings.php:218
+#: actions/register.php:210
+msgid "Not a valid nickname."
+msgstr "N'eo ket ul lesanv mat."
+
+#: actions/apigroupcreate.php:198 actions/editapplication.php:215
+#: actions/editgroup.php:199 actions/newapplication.php:203
+#: actions/newgroup.php:139 actions/profilesettings.php:222
+#: actions/register.php:217
+msgid "Homepage is not a valid URL."
+msgstr "N'eo ket chomlec'h al lec'hienn personel un URL reizh."
+
+#: actions/apigroupcreate.php:207 actions/editgroup.php:202
+#: actions/newgroup.php:142 actions/profilesettings.php:225
+#: actions/register.php:220
+msgid "Full name is too long (max 255 chars)."
+msgstr "Re hir eo an anv klok (255 arouezenn d'ar muiañ)."
+
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
+#: actions/newapplication.php:172
+#, php-format
+msgid "Description is too long (max %d chars)."
+msgstr "Re hir eo an deskrivadur (%d arouezenn d'ar muiañ)."
+
+#: actions/apigroupcreate.php:226 actions/editgroup.php:208
+#: actions/newgroup.php:148 actions/profilesettings.php:232
+#: actions/register.php:227
+msgid "Location is too long (max 255 chars)."
+msgstr "Re hir eo al lec'hiadur (255 arouezenn d'ar muiañ)."
+
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
+#: actions/newgroup.php:159
+#, php-format
+msgid "Too many aliases! Maximum %d."
+msgstr "Re a aliasoù ! %d d'ar muiañ."
+
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
+#: actions/newgroup.php:168
+#, php-format
+msgid "Invalid alias: \"%s\""
+msgstr "Alias fall : \"%s\""
+
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
+#: actions/newgroup.php:172
+#, php-format
+msgid "Alias \"%s\" already in use. Try another one."
+msgstr "Implijet e vez an alias \"%s\" dija. Klaskit gant unan all."
+
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
+#: actions/newgroup.php:178
+msgid "Alias can't be the same as nickname."
+msgstr "Ne c'hell ket an alias bezañ ar memes hini eget al lesanv."
+
+#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
+#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
+#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
+msgid "Group not found!"
+msgstr "N'eo ket bet kavet ar strollad"
+
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
+msgid "You are already a member of that group."
+msgstr "Un ezel eus ar strollad-mañ eo dija."
+
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
+msgid "You have been blocked from that group by the admin."
+msgstr "Stanket oc'h bet eus ar strollad-mañ gant ur merour."
+
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
+#, php-format
+msgid "Could not join user %1$s to group %2$s."
+msgstr "Diposubl eo stagañ an implijer %1$s d'ar strollad %2$s."
+
+#: actions/apigroupleave.php:114
+msgid "You are not a member of this group."
+msgstr "N'oc'h ket ezel eus ar strollad-mañ."
+
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
+#, php-format
+msgid "Could not remove user %1$s from group %2$s."
+msgstr "Diposubl eo dilemel an implijer %1$s deus ar strollad %2$s."
+
+#: actions/apigrouplist.php:95
+#, php-format
+msgid "%s's groups"
+msgstr "Strollad %s"
+
+#: actions/apigrouplistall.php:90 actions/usergroups.php:62
+#, php-format
+msgid "%s groups"
+msgstr "Strolladoù %s"
+
+#: actions/apigrouplistall.php:94
+#, php-format
+msgid "groups on %s"
+msgstr "strolladoù war %s"
+
+#: actions/apioauthauthorize.php:101
+msgid "No oauth_token parameter provided."
+msgstr "Arventenn oauth_token nann-roet."
+
+#: actions/apioauthauthorize.php:106
+msgid "Invalid token."
+msgstr "Fichenn direizh."
+
+#: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268
+#: actions/deletenotice.php:157 actions/disfavor.php:74
+#: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54
+#: actions/groupblock.php:66 actions/grouplogo.php:312
+#: actions/groupunblock.php:66 actions/imsettings.php:206
+#: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66
+#: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80
+#: actions/oauthappssettings.php:159 actions/oauthconnectionssettings.php:135
+#: actions/othersettings.php:145 actions/passwordsettings.php:138
+#: actions/profilesettings.php:194 actions/recoverpassword.php:337
+#: actions/register.php:165 actions/remotesubscribe.php:77
+#: actions/repeat.php:83 actions/smssettings.php:228 actions/subedit.php:38
+#: actions/subscribe.php:86 actions/tagother.php:166
+#: actions/unsubscribe.php:69 actions/userauthorization.php:52
+#: lib/designsettings.php:294
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#: actions/apioauthauthorize.php:135
+msgid "Invalid nickname / password!"
+msgstr "Lesanv / ger tremen direizh !"
+
+#: actions/apioauthauthorize.php:159
+msgid "Database error deleting OAuth application user."
+msgstr ""
+
+#: actions/apioauthauthorize.php:185
+msgid "Database error inserting OAuth application user."
+msgstr ""
+
+#: actions/apioauthauthorize.php:214
+#, php-format
+msgid ""
+"The request token %s has been authorized. Please exchange it for an access "
+"token."
+msgstr ""
+
+#: actions/apioauthauthorize.php:227
+#, php-format
+msgid "The request token %s has been denied and revoked."
+msgstr ""
+
+#: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
+#: actions/designadminpanel.php:103 actions/editapplication.php:139
+#: actions/emailsettings.php:256 actions/grouplogo.php:322
+#: actions/imsettings.php:220 actions/newapplication.php:121
+#: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44
+#: actions/smssettings.php:248 lib/designsettings.php:304
+msgid "Unexpected form submission."
+msgstr ""
+
+#: actions/apioauthauthorize.php:259
+msgid "An application would like to connect to your account"
+msgstr ""
+
+#: actions/apioauthauthorize.php:276
+msgid "Allow or deny access"
+msgstr "Aotreañ pe nac'h ar moned"
+
+#: actions/apioauthauthorize.php:292
+#, php-format
+msgid ""
+"The application <strong>%1$s</strong> by <strong>%2$s</strong> would like "
+"the ability to <strong>%3$s</strong> your %4$s account data. You should only "
+"give access to your %4$s account to third parties you trust."
+msgstr ""
+
+#: actions/apioauthauthorize.php:310 lib/action.php:438
+msgid "Account"
+msgstr "Kont"
+
+#: actions/apioauthauthorize.php:313 actions/login.php:230
+#: actions/profilesettings.php:106 actions/register.php:424
+#: actions/showgroup.php:244 actions/tagother.php:94
+#: actions/userauthorization.php:145 lib/groupeditform.php:152
+#: lib/userprofile.php:131
+msgid "Nickname"
+msgstr "Lesanv"
+
+#: actions/apioauthauthorize.php:316 actions/login.php:233
+#: actions/register.php:429 lib/accountsettingsaction.php:116
+msgid "Password"
+msgstr "Ger-tremen"
+
+#: actions/apioauthauthorize.php:328
+msgid "Deny"
+msgstr "Nac'hañ"
+
+#: actions/apioauthauthorize.php:334
+msgid "Allow"
+msgstr "Aotreañ"
+
+#: actions/apioauthauthorize.php:351
+msgid "Allow or deny access to your account information."
+msgstr "Aotreañ pe nac'hañ ar moned da ditouroù ho kont."
+
+#: actions/apistatusesdestroy.php:107
+msgid "This method requires a POST or DELETE."
+msgstr "Ezhomm en deus an argerzh-mañ ur POST pe un DELETE."
+
+#: actions/apistatusesdestroy.php:130
+msgid "You may not delete another user's status."
+msgstr "Ne c'helloc'h ket dilemel statud un implijer all."
+
+#: actions/apistatusesretweet.php:75 actions/apistatusesretweets.php:72
+#: actions/deletenotice.php:52 actions/shownotice.php:92
+msgid "No such notice."
+msgstr "N'eus ket eus an ali-se."
+
+#: actions/apistatusesretweet.php:83
+msgid "Cannot repeat your own notice."
+msgstr "Ne c'helloc'h ket adlavar ho alioù."
+
+#: actions/apistatusesretweet.php:91
+msgid "Already repeated that notice."
+msgstr "Adlavaret o peus dija an ali-mañ."
+
+#: actions/apistatusesshow.php:138
+msgid "Status deleted."
+msgstr "Statud diverket."
+
+#: actions/apistatusesshow.php:144
+msgid "No status with that ID found."
+msgstr "N'eo ket bet kavet a statud evit an ID-mañ"
+
+#: actions/apistatusesupdate.php:161 actions/newnotice.php:155
+#: lib/mailhandler.php:60
+#, php-format
+msgid "That's too long. Max notice size is %d chars."
+msgstr "Re hir eo ! Ment hirañ an ali a zo a %d arouezenn."
+
+#: actions/apistatusesupdate.php:202
+msgid "Not found"
+msgstr "N'eo ket bet kavet"
+
+#: actions/apistatusesupdate.php:225 actions/newnotice.php:178
+#, php-format
+msgid "Max notice size is %d chars, including attachment URL."
+msgstr ""
+
+#: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261
+msgid "Unsupported format."
+msgstr "Diembreget eo ar furmad-se."
+
+#: actions/apitimelinefavorites.php:108
+#, php-format
+msgid "%1$s / Favorites from %2$s"
+msgstr "%1$s / Pennroll %2$s"
+
+#: actions/apitimelinefavorites.php:117
+#, php-format
+msgid "%1$s updates favorited by %2$s / %2$s."
+msgstr "%1$s statud pennroll da %2$s / %2$s."
+
+#: actions/apitimelinementions.php:117
+#, php-format
+msgid "%1$s / Updates mentioning %2$s"
+msgstr "%1$s / Hizivadennoù a veneg %2$s"
+
+#: actions/apitimelinementions.php:127
+#, php-format
+msgid "%1$s updates that reply to updates from %2$s / %3$s."
+msgstr ""
+
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#, php-format
+msgid "%s public timeline"
+msgstr "Oberezhioù publik %s"
+
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#, php-format
+msgid "%s updates from everyone!"
+msgstr "%s statud an holl !"
+
+#: actions/apitimelineretweetedtome.php:111
+#, php-format
+msgid "Repeated to %s"
+msgstr "Adkemeret evit %s"
+
+#: actions/apitimelineretweetsofme.php:114
+#, php-format
+msgid "Repeats of %s"
+msgstr "Adkemeret eus %s"
+
+#: actions/apitimelinetag.php:102 actions/tag.php:67
+#, php-format
+msgid "Notices tagged with %s"
+msgstr "Alioù merket gant %s"
+
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
+#, php-format
+msgid "Updates tagged with %1$s on %2$s!"
+msgstr ""
+
+#: actions/apiusershow.php:96
+msgid "Not found."
+msgstr "N'eo ket bet kavet."
+
+#: actions/attachment.php:73
+msgid "No such attachment."
+msgstr "N'eo ket bet kavet ar restr stag."
+
+#: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73
+#: actions/editgroup.php:84 actions/groupdesignsettings.php:84
+#: actions/grouplogo.php:86 actions/groupmembers.php:76
+#: actions/grouprss.php:91 actions/showgroup.php:121
+msgid "No nickname."
+msgstr "Lesanv ebet."
+
+#: actions/avatarbynickname.php:64
+msgid "No size."
+msgstr "Ment ebet."
+
+#: actions/avatarbynickname.php:69
+msgid "Invalid size."
+msgstr "Ment direizh."
+
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
+#: lib/accountsettingsaction.php:112
+msgid "Avatar"
+msgstr "Avatar"
+
+#: actions/avatarsettings.php:78
+#, php-format
+msgid "You can upload your personal avatar. The maximum file size is %s."
+msgstr ""
+
+#: actions/avatarsettings.php:106 actions/avatarsettings.php:185
+#: actions/remotesubscribe.php:191 actions/userauthorization.php:72
+#: actions/userrss.php:106
+msgid "User without matching profile"
+msgstr "Implijer hep profil klotaus"
+
+#: actions/avatarsettings.php:119 actions/avatarsettings.php:197
+#: actions/grouplogo.php:254
+msgid "Avatar settings"
+msgstr "Arventennoù an avatar"
+
+#: actions/avatarsettings.php:127 actions/avatarsettings.php:205
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
+msgid "Original"
+msgstr "Orin"
+
+#: actions/avatarsettings.php:142 actions/avatarsettings.php:217
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
+msgid "Preview"
+msgstr "Rakwelet"
+
+#: actions/avatarsettings.php:149 actions/showapplication.php:252
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
+msgid "Delete"
+msgstr "Diverkañ"
+
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
+msgid "Upload"
+msgstr "Enporzhiañ"
+
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
+msgid "Crop"
+msgstr "Adframmañ"
+
+#: actions/avatarsettings.php:328
+msgid "Pick a square area of the image to be your avatar"
+msgstr ""
+
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
+msgid "Lost our file data."
+msgstr "Kollet eo bet roadennoù."
+
+#: actions/avatarsettings.php:366
+msgid "Avatar updated."
+msgstr "Hizivaet eo bet an avatar."
+
+#: actions/avatarsettings.php:369
+msgid "Failed updating avatar."
+msgstr "Ur gudenn 'zo bet e-pad hizivadenn an avatar."
+
+#: actions/avatarsettings.php:393
+msgid "Avatar deleted."
+msgstr "Dilammet eo bet an Avatar."
+
+#: actions/block.php:69
+msgid "You already blocked that user."
+msgstr "Stanket o peus dija an implijer-mañ."
+
+#: actions/block.php:105 actions/block.php:128 actions/groupblock.php:160
+msgid "Block user"
+msgstr "Stankañ an implijer-mañ"
+
+#: actions/block.php:130
+msgid ""
+"Are you sure you want to block this user? Afterwards, they will be "
+"unsubscribed from you, unable to subscribe to you in the future, and you "
+"will not be notified of any @-replies from them."
+msgstr ""
+
+#: actions/block.php:143 actions/deleteapplication.php:153
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
+#: actions/groupblock.php:178
+msgid "No"
+msgstr "Ket"
+
+#: actions/block.php:143 actions/deleteuser.php:150
+msgid "Do not block this user"
+msgstr "Arabat stankañ an implijer-mañ"
+
+#: actions/block.php:144 actions/deleteapplication.php:158
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
+#: actions/groupblock.php:179 lib/repeatform.php:132
+msgid "Yes"
+msgstr "Ya"
+
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
+msgid "Block this user"
+msgstr "Stankañ an implijer-mañ"
+
+#: actions/block.php:167
+msgid "Failed to save block information."
+msgstr "Diposubl eo enrollañ an titouroù stankañ."
+
+#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87
+#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62
+#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83
+#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102
+#: actions/groupmembers.php:83 actions/groupmembers.php:90
+#: actions/grouprss.php:98 actions/grouprss.php:105
+#: actions/groupunblock.php:86 actions/joingroup.php:82
+#: actions/joingroup.php:93 actions/leavegroup.php:82
+#: actions/leavegroup.php:93 actions/makeadmin.php:86
+#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212
+#: lib/command.php:260
+msgid "No such group."
+msgstr "N'eus ket eus ar strollad-se."
+
+#: actions/blockedfromgroup.php:97
+#, php-format
+msgid "%s blocked profiles"
+msgstr "%s profil stanket"
+
+#: actions/blockedfromgroup.php:100
+#, php-format
+msgid "%1$s blocked profiles, page %2$d"
+msgstr "%1$s profil stanket, pajenn %2$d"
+
+#: actions/blockedfromgroup.php:115
+msgid "A list of the users blocked from joining this group."
+msgstr ""
+"Ur roll eus an implijerien evit pere eo stanket an enskrivadur d'ar strollad."
+
+#: actions/blockedfromgroup.php:288
+msgid "Unblock user from group"
+msgstr "Distankañ implijer ar strollad"
+
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
+msgid "Unblock"
+msgstr "Distankañ"
+
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
+msgid "Unblock this user"
+msgstr "Distankañ an implijer-se"
+
+#: actions/bookmarklet.php:50
+msgid "Post to "
+msgstr "Postañ war "
+
+#: actions/confirmaddress.php:75
+msgid "No confirmation code."
+msgstr "Kod kadarnaat ebet."
+
+#: actions/confirmaddress.php:80
+msgid "Confirmation code not found."
+msgstr "N'eo ket bet kavet ar c'hod kadarnaat."
+
+#: actions/confirmaddress.php:85
+msgid "That confirmation code is not for you!"
+msgstr "N'eo ket ar c'hod-se evidoc'h !"
+
+#: actions/confirmaddress.php:90
+#, php-format
+msgid "Unrecognized address type %s"
+msgstr "N'eo ket bet anavezet seurt ar chomlec'h %s"
+
+#: actions/confirmaddress.php:94
+msgid "That address has already been confirmed."
+msgstr "Kadarnaet eo bet dija ar chomlec'h-mañ."
+
+#: actions/confirmaddress.php:114 actions/emailsettings.php:296
+#: actions/emailsettings.php:427 actions/imsettings.php:258
+#: actions/imsettings.php:401 actions/othersettings.php:174
+#: actions/profilesettings.php:283 actions/smssettings.php:278
+#: actions/smssettings.php:420
+msgid "Couldn't update user."
+msgstr "Diposubl eo hizivaat an implijer."
+
+#: actions/confirmaddress.php:126 actions/emailsettings.php:391
+#: actions/imsettings.php:363 actions/smssettings.php:382
+msgid "Couldn't delete email confirmation."
+msgstr "Diposubl eo dilemel ar postel kadarnadur."
+
+#: actions/confirmaddress.php:144
+msgid "Confirm address"
+msgstr "Chomlec'h kadarnaet"
+
+#: actions/confirmaddress.php:159
+#, php-format
+msgid "The address \"%s\" has been confirmed for your account."
+msgstr "Kadarnaet eo bet ar chomlec'h \"%s\" evit ho kont."
+
+#: actions/conversation.php:99
+msgid "Conversation"
+msgstr "Kaozeadenn"
+
+#: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
+msgid "Notices"
+msgstr "Ali"
+
+#: actions/deleteapplication.php:63
+msgid "You must be logged in to delete an application."
+msgstr "Rankout a reoc'h bezañ kevreet evit dilemel ur poellad."
+
+#: actions/deleteapplication.php:71
+msgid "Application not found."
+msgstr "N'eo ket bet kavet ar poellad"
+
+#: actions/deleteapplication.php:78 actions/editapplication.php:77
+#: actions/showapplication.php:94
+msgid "You are not the owner of this application."
+msgstr "N'oc'h ket perc'henn ar poellad-se."
+
+#: actions/deleteapplication.php:102 actions/editapplication.php:127
+#: actions/newapplication.php:110 actions/showapplication.php:118
+#: lib/action.php:1217
+msgid "There was a problem with your session token."
+msgstr ""
+
+#: actions/deleteapplication.php:123 actions/deleteapplication.php:147
+msgid "Delete application"
+msgstr "Dilemel ar poelad"
+
+#: actions/deleteapplication.php:149
+msgid ""
+"Are you sure you want to delete this application? This will clear all data "
+"about the application from the database, including all existing user "
+"connections."
+msgstr ""
+
+#: actions/deleteapplication.php:156
+msgid "Do not delete this application"
+msgstr "Arabat eo dilemel ar poellad-mañ"
+
+#: actions/deleteapplication.php:160
+msgid "Delete this application"
+msgstr "Dilemel ar poelad-se"
+
+#. TRANS: Client error message
+#: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62
+#: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69
+#: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
+#: actions/tagother.php:33 actions/unsubscribe.php:52
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
+#: lib/settingsaction.php:72
+msgid "Not logged in."
+msgstr "Nann-luget."
+
+#: actions/deletenotice.php:71
+msgid "Can't delete this notice."
+msgstr "Diposupl eo dilemel an ali-mañ."
+
+#: actions/deletenotice.php:103
+msgid ""
+"You are about to permanently delete a notice. Once this is done, it cannot "
+"be undone."
+msgstr ""
+
+#: actions/deletenotice.php:109 actions/deletenotice.php:141
+msgid "Delete notice"
+msgstr "Dilemel un ali"
+
+#: actions/deletenotice.php:144
+msgid "Are you sure you want to delete this notice?"
+msgstr "Ha sur oc'h ho peus c'hoant dilemel an ali-mañ ?"
+
+#: actions/deletenotice.php:145
+msgid "Do not delete this notice"
+msgstr "Arabat dilemel an ali-mañ"
+
+#: actions/deletenotice.php:146 lib/noticelist.php:655
+msgid "Delete this notice"
+msgstr "Dilemel an ali-mañ"
+
+#: actions/deleteuser.php:67
+msgid "You cannot delete users."
+msgstr "Ne c'helloc'h ket diverkañ implijerien"
+
+#: actions/deleteuser.php:74
+msgid "You can only delete local users."
+msgstr "Ne c'helloc'h nemet dilemel an implijerien lec'hel."
+
+#: actions/deleteuser.php:110 actions/deleteuser.php:133
+msgid "Delete user"
+msgstr "Diverkañ an implijer"
+
+#: actions/deleteuser.php:136
+msgid ""
+"Are you sure you want to delete this user? This will clear all data about "
+"the user from the database, without a backup."
+msgstr ""
+
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
+msgid "Delete this user"
+msgstr "Diverkañ an implijer-se"
+
+#: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
+#: lib/groupnav.php:119
+msgid "Design"
+msgstr "Design"
+
+#: actions/designadminpanel.php:73
+msgid "Design settings for this StatusNet site."
+msgstr "Arventennoù design evit al lec'hienn StatusNet-mañ."
+
+#: actions/designadminpanel.php:275
+msgid "Invalid logo URL."
+msgstr "URL fall evit al logo."
+
+#: actions/designadminpanel.php:279
+#, php-format
+msgid "Theme not available: %s"
+msgstr "N'eus ket tu kaout an dodenn : %s"
+
+#: actions/designadminpanel.php:375
+msgid "Change logo"
+msgstr "Cheñch al logo"
+
+#: actions/designadminpanel.php:380
+msgid "Site logo"
+msgstr "Logo al lec'hienn"
+
+#: actions/designadminpanel.php:387
+msgid "Change theme"
+msgstr "Lakaat un dodenn all"
+
+#: actions/designadminpanel.php:404
+msgid "Site theme"
+msgstr "Dodenn al lec'hienn"
+
+#: actions/designadminpanel.php:405
+msgid "Theme for the site."
+msgstr "Dodenn evit al lec'hienn."
+
+#: actions/designadminpanel.php:417 lib/designsettings.php:101
+msgid "Change background image"
+msgstr "Kemmañ ar skeudenn foñs"
+
+#: actions/designadminpanel.php:422 actions/designadminpanel.php:497
+#: lib/designsettings.php:178
+msgid "Background"
+msgstr "Background"
+
+#: actions/designadminpanel.php:427
+#, php-format
+msgid ""
+"You can upload a background image for the site. The maximum file size is %1"
+"$s."
+msgstr ""
+
+#: actions/designadminpanel.php:457 lib/designsettings.php:139
+msgid "On"
+msgstr "Gweredekaet"
+
+#: actions/designadminpanel.php:473 lib/designsettings.php:155
+msgid "Off"
+msgstr "Diweredekaet"
+
+#: actions/designadminpanel.php:474 lib/designsettings.php:156
+msgid "Turn background image on or off."
+msgstr "Gweredekaat pe diweredekaat ar skeudenn foñs."
+
+#: actions/designadminpanel.php:479 lib/designsettings.php:161
+msgid "Tile background image"
+msgstr ""
+
+#: actions/designadminpanel.php:488 lib/designsettings.php:170
+msgid "Change colours"
+msgstr "Kemmañ al livioù"
+
+#: actions/designadminpanel.php:510 lib/designsettings.php:191
+msgid "Content"
+msgstr "Endalc'h"
+
+#: actions/designadminpanel.php:523 lib/designsettings.php:204
+msgid "Sidebar"
+msgstr "Barenn kostez"
+
+#: actions/designadminpanel.php:536 lib/designsettings.php:217
+msgid "Text"
+msgstr "Testenn"
+
+#: actions/designadminpanel.php:549 lib/designsettings.php:230
+msgid "Links"
+msgstr "Liammoù"
+
+#: actions/designadminpanel.php:577 lib/designsettings.php:247
+msgid "Use defaults"
+msgstr "Implijout an talvoudoù dre ziouer"
+
+#: actions/designadminpanel.php:578 lib/designsettings.php:248
+msgid "Restore default designs"
+msgstr "Adlakaat an neuz dre ziouer."
+
+#: actions/designadminpanel.php:584 lib/designsettings.php:254
+msgid "Reset back to default"
+msgstr "Adlakaat an arventennoù dre ziouer"
+
+#: actions/designadminpanel.php:586 actions/emailsettings.php:195
+#: actions/imsettings.php:163 actions/othersettings.php:126
+#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
+#: actions/tagother.php:154 actions/useradminpanel.php:294
+#: lib/applicationeditform.php:333 lib/applicationeditform.php:334
+#: lib/designsettings.php:256 lib/groupeditform.php:202
+msgid "Save"
+msgstr "Enrollañ"
+
+#: actions/designadminpanel.php:587 lib/designsettings.php:257
+msgid "Save design"
+msgstr "Enrollañ an design"
+
+#: actions/disfavor.php:81
+msgid "This notice is not a favorite!"
+msgstr "N'eo ket an ali-mañ ur pennroll !"
+
+#: actions/disfavor.php:94
+msgid "Add to favorites"
+msgstr "Ouzhpennañ d'ar pennrolloù"
+
+#: actions/doc.php:158
+#, php-format
+msgid "No such document \"%s\""
+msgstr "N'eo ket bet kavet ar restr \"%s\""
+
+#: actions/editapplication.php:54
+msgid "Edit Application"
+msgstr "Kemmañ ar poellad"
+
+#: actions/editapplication.php:66
+msgid "You must be logged in to edit an application."
+msgstr "Ret eo bezañ kevreet evit kemmañ ur poellad."
+
+#: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166
+#: actions/showapplication.php:87
+msgid "No such application."
+msgstr "N'eus ket eus an arload-mañ."
+
+#: actions/editapplication.php:161
+msgid "Use this form to edit your application."
+msgstr "Implijit ar furmskrid-mañ evit kemmañ ho poellad."
+
+#: actions/editapplication.php:177 actions/newapplication.php:159
+msgid "Name is required."
+msgstr "Ret eo lakaat un anv."
+
+#: actions/editapplication.php:180 actions/newapplication.php:165
+msgid "Name is too long (max 255 chars)."
+msgstr "Re hir eo an anv (255 arouezenn d'ar muiañ)."
+
+#: actions/editapplication.php:183 actions/newapplication.php:162
+msgid "Name already in use. Try another one."
+msgstr "Implijet eo dija an anv-mañ. Klaskit unan all."
+
+#: actions/editapplication.php:186 actions/newapplication.php:168
+msgid "Description is required."
+msgstr "Ezhomm 'zo un deskrivadur."
+
+#: actions/editapplication.php:194
+msgid "Source URL is too long."
+msgstr "Mammenn URL re hir."
+
+#: actions/editapplication.php:200 actions/newapplication.php:185
+msgid "Source URL is not valid."
+msgstr "N'eo ket mat an URL mammenn."
+
+#: actions/editapplication.php:203 actions/newapplication.php:188
+msgid "Organization is required."
+msgstr "Ezhomm 'zo eus an aozadur."
+
+#: actions/editapplication.php:206 actions/newapplication.php:191
+msgid "Organization is too long (max 255 chars)."
+msgstr "Re hir eo an aozadur (255 arouezenn d'ar muiañ)."
+
+#: actions/editapplication.php:209 actions/newapplication.php:194
+msgid "Organization homepage is required."
+msgstr "Ret eo kaout pajenn degemer an aozadur."
+
+#: actions/editapplication.php:218 actions/newapplication.php:206
+msgid "Callback is too long."
+msgstr "Rez hir eo ar c'hounadur (Callback)."
+
+#: actions/editapplication.php:225 actions/newapplication.php:215
+msgid "Callback URL is not valid."
+msgstr "N'eo ket mat an URL kounadur (Callback)."
+
+#: actions/editapplication.php:258
+msgid "Could not update application."
+msgstr "Diposubl eo hizivaat ar poellad"
+
+#: actions/editgroup.php:56
+#, php-format
+msgid "Edit %s group"
+msgstr "Kemmañ ar strollad  %s"
+
+#: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65
+msgid "You must be logged in to create a group."
+msgstr "Rankout a reoc'h bezañ luget evit krouiñ ur strollad."
+
+#: actions/editgroup.php:107 actions/editgroup.php:172
+#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109
+msgid "You must be an admin to edit the group."
+msgstr "Rankout a reer bezañ merour evit kemmañ ar strollad."
+
+#: actions/editgroup.php:158
+msgid "Use this form to edit the group."
+msgstr "Leunit ar furmskrid-mañ evit kemmañ dibarzhioù ar strollad."
+
+#: actions/editgroup.php:205 actions/newgroup.php:145
+#, php-format
+msgid "description is too long (max %d chars)."
+msgstr "re hir eo an deskrivadur (%d arouezenn d'ar muiañ)."
+
+#: actions/editgroup.php:258
+msgid "Could not update group."
+msgstr "Diposubl eo hizivaat ar strollad."
+
+#: actions/editgroup.php:264 classes/User_group.php:493
+msgid "Could not create aliases."
+msgstr "Diposubl eo krouiñ an aliasoù."
+
+#: actions/editgroup.php:280
+msgid "Options saved."
+msgstr "Enrollet eo bet ho dibarzhioù."
+
+#: actions/emailsettings.php:60
+msgid "Email settings"
+msgstr "Arventennoù ar postel"
+
+#: actions/emailsettings.php:71
+#, php-format
+msgid "Manage how you get email from %%site.name%%."
+msgstr "Merañ ar posteloù a fell deoc'h resevout a-berzh %%site.name%%."
+
+#: actions/emailsettings.php:100 actions/imsettings.php:100
+#: actions/smssettings.php:104
+msgid "Address"
+msgstr "Chomlec'h"
+
+#: actions/emailsettings.php:105
+msgid "Current confirmed email address."
+msgstr "Chomlec'h postel gwiriekaet er mare-mañ."
+
+#: actions/emailsettings.php:107 actions/emailsettings.php:140
+#: actions/imsettings.php:108 actions/smssettings.php:115
+#: actions/smssettings.php:158
+msgid "Remove"
+msgstr "Dilemel"
+
+#: actions/emailsettings.php:113
+msgid ""
+"Awaiting confirmation on this address. Check your inbox (and spam box!) for "
+"a message with further instructions."
+msgstr ""
+
+#: actions/emailsettings.php:117 actions/imsettings.php:120
+#: actions/smssettings.php:126 lib/applicationeditform.php:331
+#: lib/applicationeditform.php:332
+msgid "Cancel"
+msgstr "Nullañ"
+
+#: actions/emailsettings.php:121
+msgid "Email address"
+msgstr "Chomlec'h postel"
+
+#: actions/emailsettings.php:123
+msgid "Email address, like \"UserName@example.org\""
+msgstr "Chomlec'h postel, evel \"AnvImplijer@example.org\""
+
+#: actions/emailsettings.php:126 actions/imsettings.php:133
+#: actions/smssettings.php:145
+msgid "Add"
+msgstr "Ouzhpennañ"
+
+#: actions/emailsettings.php:133 actions/smssettings.php:152
+msgid "Incoming email"
+msgstr "Postel o tont"
+
+#: actions/emailsettings.php:138 actions/smssettings.php:157
+msgid "Send email to this address to post new notices."
+msgstr ""
+
+#: actions/emailsettings.php:145 actions/smssettings.php:162
+msgid "Make a new email address for posting to; cancels the old one."
+msgstr ""
+
+#: actions/emailsettings.php:148 actions/smssettings.php:164
+msgid "New"
+msgstr "Nevez"
+
+#: actions/emailsettings.php:153 actions/imsettings.php:139
+#: actions/smssettings.php:169
+msgid "Preferences"
+msgstr "Penndibaboù"
+
+#: actions/emailsettings.php:158
+msgid "Send me notices of new subscriptions through email."
+msgstr ""
+
+#: actions/emailsettings.php:163
+msgid "Send me email when someone adds my notice as a favorite."
+msgstr "Kas din ur postel pa lak unan bennak unan eus va alioù evel pennroll."
+
+#: actions/emailsettings.php:169
+msgid "Send me email when someone sends me a private message."
+msgstr "Kas din ur postel pa gas unan bennak ur gemennadenn bersonel din."
+
+#: actions/emailsettings.php:174
+msgid "Send me email when someone sends me an \"@-reply\"."
+msgstr "Kas din ur postel pa gas unan bennak ur \"@-respont\" din."
+
+#: actions/emailsettings.php:179
+msgid "Allow friends to nudge me and send me an email."
+msgstr ""
+
+#: actions/emailsettings.php:185
+msgid "I want to post notices by email."
+msgstr "C'hoant am eus kas va alioù dre bostel."
+
+#: actions/emailsettings.php:191
+msgid "Publish a MicroID for my email address."
+msgstr "Embann ur MicroID evit ma chomlec'h postel."
+
+#: actions/emailsettings.php:302 actions/imsettings.php:264
+#: actions/othersettings.php:180 actions/smssettings.php:284
+msgid "Preferences saved."
+msgstr "Penndibaboù enrollet"
+
+#: actions/emailsettings.php:320
+msgid "No email address."
+msgstr "N'eus chomlec'h postel ebet."
+
+#: actions/emailsettings.php:327
+msgid "Cannot normalize that email address"
+msgstr ""
+
+#: actions/emailsettings.php:331 actions/register.php:201
+#: actions/siteadminpanel.php:144
+msgid "Not a valid email address."
+msgstr "N'eo ket ur chomlec'h postel reizh."
+
+#: actions/emailsettings.php:334
+msgid "That is already your email address."
+msgstr "Ho postel eo dija."
+
+#: actions/emailsettings.php:337
+msgid "That email address already belongs to another user."
+msgstr ""
+
+#: actions/emailsettings.php:353 actions/imsettings.php:319
+#: actions/smssettings.php:337
+msgid "Couldn't insert confirmation code."
+msgstr ""
+
+#: actions/emailsettings.php:359
+msgid ""
+"A confirmation code was sent to the email address you added. Check your "
+"inbox (and spam box!) for the code and instructions on how to use it."
+msgstr ""
+
+#: actions/emailsettings.php:379 actions/imsettings.php:351
+#: actions/smssettings.php:370
+msgid "No pending confirmation to cancel."
+msgstr ""
+
+#: actions/emailsettings.php:383 actions/imsettings.php:355
+msgid "That is the wrong IM address."
+msgstr "N'eo ket mat ar chomlec'h postelerezh prim."
+
+#: actions/emailsettings.php:395 actions/imsettings.php:367
+#: actions/smssettings.php:386
+msgid "Confirmation cancelled."
+msgstr "Nullet eo bet ar gadarnadenn."
+
+#: actions/emailsettings.php:413
+msgid "That is not your email address."
+msgstr "N'eo ket ho postel."
+
+#: actions/emailsettings.php:432 actions/imsettings.php:408
+#: actions/smssettings.php:425
+msgid "The address was removed."
+msgstr "Dilamet eo bet ar chomlec'h."
+
+#: actions/emailsettings.php:446 actions/smssettings.php:518
+msgid "No incoming email address."
+msgstr ""
+
+#: actions/emailsettings.php:456 actions/emailsettings.php:478
+#: actions/smssettings.php:528 actions/smssettings.php:552
+msgid "Couldn't update user record."
+msgstr ""
+
+#: actions/emailsettings.php:459 actions/smssettings.php:531
+msgid "Incoming email address removed."
+msgstr ""
+
+#: actions/emailsettings.php:481 actions/smssettings.php:555
+msgid "New incoming email address added."
+msgstr ""
+
+#: actions/favor.php:79
+msgid "This notice is already a favorite!"
+msgstr "Ouzhpennet eo bet an ali-mañ d'ho pennrolloù dija !"
+
+#: actions/favor.php:92 lib/disfavorform.php:140
+msgid "Disfavor favorite"
+msgstr ""
+
+#: actions/favorited.php:65 lib/popularnoticesection.php:91
+#: lib/publicgroupnav.php:93
+msgid "Popular notices"
+msgstr "Alioù poblek"
+
+#: actions/favorited.php:67
+#, php-format
+msgid "Popular notices, page %d"
+msgstr "Alioù poblek, pajenn %d"
+
+#: actions/favorited.php:79
+msgid "The most popular notices on the site right now."
+msgstr "An alioù ar brudetañ el lec'hienn er mare-mañ."
+
+#: actions/favorited.php:150
+msgid "Favorite notices appear on this page but no one has favorited one yet."
+msgstr ""
+
+#: actions/favorited.php:153
+msgid ""
+"Be the first to add a notice to your favorites by clicking the fave button "
+"next to any notice you like."
+msgstr ""
+
+#: actions/favorited.php:156
+#, php-format
+msgid ""
+"Why not [register an account](%%action.register%%) and be the first to add a "
+"notice to your favorites!"
+msgstr ""
+
+#: actions/favoritesrss.php:111 actions/showfavorites.php:77
+#: lib/personalgroupnav.php:115
+#, php-format
+msgid "%s's favorite notices"
+msgstr "Alioù pennrollet eus %s"
+
+#: actions/favoritesrss.php:115
+#, php-format
+msgid "Updates favored by %1$s on %2$s!"
+msgstr "Hizivadennoù brientek gant %1$s war %2$s !"
+
+#: actions/featured.php:69 lib/featureduserssection.php:87
+#: lib/publicgroupnav.php:89
+msgid "Featured users"
+msgstr ""
+
+#: actions/featured.php:71
+#, php-format
+msgid "Featured users, page %d"
+msgstr ""
+
+#: actions/featured.php:99
+#, php-format
+msgid "A selection of some great users on %s"
+msgstr "Un dibab eus implijerien vat e %s"
+
+#: actions/file.php:34
+msgid "No notice ID."
+msgstr "ID ali ebet."
+
+#: actions/file.php:38
+msgid "No notice."
+msgstr "Ali ebet."
+
+#: actions/file.php:42
+msgid "No attachments."
+msgstr "N'eus restr stag ebet."
+
+#: actions/file.php:51
+msgid "No uploaded attachments."
+msgstr ""
+
+#: actions/finishremotesubscribe.php:69
+msgid "Not expecting this response!"
+msgstr "Ne oa ket gortozet ar respont-mañ !"
+
+#: actions/finishremotesubscribe.php:80
+msgid "User being listened to does not exist."
+msgstr ""
+
+#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59
+msgid "You can use the local subscription!"
+msgstr ""
+
+#: actions/finishremotesubscribe.php:99
+msgid "That user has blocked you from subscribing."
+msgstr "An implijer-se en deus ho stanket evit en enskrivañ."
+
+#: actions/finishremotesubscribe.php:110
+msgid "You are not authorized."
+msgstr "N'oc'h ket aotreet."
+
+#: actions/finishremotesubscribe.php:113
+msgid "Could not convert request token to access token."
+msgstr ""
+
+#: actions/finishremotesubscribe.php:118
+msgid "Remote service uses unknown version of OMB protocol."
+msgstr ""
+
+#: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306
+msgid "Error updating remote profile"
+msgstr ""
+
+#: actions/getfile.php:79
+msgid "No such file."
+msgstr "Restr ezvezant."
+
+#: actions/getfile.php:83
+msgid "Cannot read file."
+msgstr "Diposupl eo lenn ar restr."
+
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Roll direizh."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Ne c'helloc'h ket reiñ rolloù d'an implijerien eus al lec'hienn-mañ."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "An implijer-mañ en deus dija ar roll-mañ."
+
+#: actions/groupblock.php:71 actions/groupunblock.php:71
+#: actions/makeadmin.php:71 actions/subedit.php:46
+#: lib/profileformaction.php:70
+msgid "No profile specified."
+msgstr "N'eo bet resisaet profil ebet"
+
+#: actions/groupblock.php:76 actions/groupunblock.php:76
+#: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46
+#: actions/unsubscribe.php:84 lib/profileformaction.php:77
+msgid "No profile with that ID."
+msgstr "N'eus profil ebet gant an ID-mañ."
+
+#: actions/groupblock.php:81 actions/groupunblock.php:81
+#: actions/makeadmin.php:81
+msgid "No group specified."
+msgstr "N'eo bet resisaet strollad ebet"
+
+#: actions/groupblock.php:91
+msgid "Only an admin can block group members."
+msgstr "N'eus neme ur merour a c'hell stankañ izili ur strollad."
+
+#: actions/groupblock.php:95
+msgid "User is already blocked from group."
+msgstr "An implijer-mañ a zo stanket dija eus ar strollad."
+
+#: actions/groupblock.php:100
+msgid "User is not a member of group."
+msgstr "N'eo ket an implijer-mañ ezel eus ur strollad."
+
+#: actions/groupblock.php:136 actions/groupmembers.php:323
+msgid "Block user from group"
+msgstr "Stankañ an implijer-mañ eus ar strollad"
+
+#: actions/groupblock.php:162
+#, php-format
+msgid ""
+"Are you sure you want to block user \"%1$s\" from the group \"%2$s\"? They "
+"will be removed from the group, unable to post, and unable to subscribe to "
+"the group in the future."
+msgstr ""
+
+#: actions/groupblock.php:178
+msgid "Do not block this user from this group"
+msgstr "Arabat stankañ an implijer-mañ eus ar strollad."
+
+#: actions/groupblock.php:179
+msgid "Block this user from this group"
+msgstr "Stankañ an implijer-mañ eus ar strollad-se"
+
+#: actions/groupblock.php:196
+msgid "Database error blocking user from group."
+msgstr ""
+
+#: actions/groupbyid.php:74 actions/userbyid.php:70
+msgid "No ID."
+msgstr "ID ebet"
+
+#: actions/groupdesignsettings.php:68
+msgid "You must be logged in to edit a group."
+msgstr ""
+
+#: actions/groupdesignsettings.php:144
+msgid "Group design"
+msgstr "Design ar strollad"
+
+#: actions/groupdesignsettings.php:155
+msgid ""
+"Customize the way your group looks with a background image and a colour "
+"palette of your choice."
+msgstr ""
+
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
+#: lib/designsettings.php:391 lib/designsettings.php:413
+msgid "Couldn't update your design."
+msgstr "Diposubl eo hizivaat ho design."
+
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
+msgid "Design preferences saved."
+msgstr "Enrollet eo bet an arventennoù design."
+
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
+msgid "Group logo"
+msgstr "Logo ar strollad"
+
+#: actions/grouplogo.php:153
+#, php-format
+msgid ""
+"You can upload a logo image for your group. The maximum file size is %s."
+msgstr ""
+
+#: actions/grouplogo.php:181
+msgid "User without matching profile."
+msgstr ""
+
+#: actions/grouplogo.php:365
+msgid "Pick a square area of the image to be the logo."
+msgstr ""
+
+#: actions/grouplogo.php:399
+msgid "Logo updated."
+msgstr "Logo hizivaet."
+
+#: actions/grouplogo.php:401
+msgid "Failed updating logo."
+msgstr "N'eo ket bet kaset da benn an hizivadenn."
+
+#: actions/groupmembers.php:100 lib/groupnav.php:92
+#, php-format
+msgid "%s group members"
+msgstr "Izili ar strollad %s"
+
+#: actions/groupmembers.php:103
+#, php-format
+msgid "%1$s group members, page %2$d"
+msgstr "Izili ar strollad %1$s, pajenn %2$d"
+
+#: actions/groupmembers.php:118
+msgid "A list of the users in this group."
+msgstr "Roll an implijerien enrollet er strollad-mañ."
+
+#: actions/groupmembers.php:182 lib/groupnav.php:107
+msgid "Admin"
+msgstr "Merañ"
+
+#: actions/groupmembers.php:355 lib/blockform.php:69
+msgid "Block"
+msgstr "Stankañ"
+
+#: actions/groupmembers.php:450
+msgid "Make user an admin of the group"
+msgstr "Lakaat an implijer da vezañ ur merour eus ar strollad"
+
+#: actions/groupmembers.php:482
+msgid "Make Admin"
+msgstr "Lakaat ur merour"
+
+#: actions/groupmembers.php:482
+msgid "Make this user an admin"
+msgstr "Lakaat an implijer-mañ da verour"
+
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Oberezhioù %s"
+
+#: actions/grouprss.php:140
+#, php-format
+msgid "Updates from members of %1$s on %2$s!"
+msgstr "Hizivadenn izili %1$s e %2$s !"
+
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
+#: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
+msgid "Groups"
+msgstr "Strolladoù"
+
+#: actions/groups.php:64
+#, php-format
+msgid "Groups, page %d"
+msgstr "Strollad, pajenn %d"
+
+#: actions/groups.php:90
+#, php-format
+msgid ""
+"%%%%site.name%%%% groups let you find and talk with people of similar "
+"interests. After you join a group you can send messages to all other members "
+"using the syntax \"!groupname\". Don't see a group you like? Try [searching "
+"for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup"
+"%%%%)"
+msgstr ""
+
+#: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122
+msgid "Create a new group"
+msgstr "Krouiñ ur strollad nevez"
+
+#: actions/groupsearch.php:52
+#, php-format
+msgid ""
+"Search for groups on %%site.name%% by their name, location, or description. "
+"Separate the terms by spaces; they must be 3 characters or more."
+msgstr ""
+
+#: actions/groupsearch.php:58
+msgid "Group search"
+msgstr "Klask strolladoù"
+
+#: actions/groupsearch.php:79 actions/noticesearch.php:117
+#: actions/peoplesearch.php:83
+msgid "No results."
+msgstr "Disoc'h ebet."
+
+#: actions/groupsearch.php:82
+#, php-format
+msgid ""
+"If you can't find the group you're looking for, you can [create it](%%action."
+"newgroup%%) yourself."
+msgstr ""
+"Ma ne gavoc'h ket ar strollad emaoc'h o klask, neuze e c'helloc'h [krouiñ "
+"anezhañ](%%action.newgroup%%)."
+
+#: actions/groupsearch.php:85
+#, php-format
+msgid ""
+"Why not [register an account](%%action.register%%) and [create the group](%%"
+"action.newgroup%%) yourself!"
+msgstr ""
+
+#: actions/groupunblock.php:91
+msgid "Only an admin can unblock group members."
+msgstr "N'eus nemet ur merour a c'hell distankañ izili ur strollad."
+
+#: actions/groupunblock.php:95
+msgid "User is not blocked from group."
+msgstr "N'eo ket stanket an implijer-mañ eus ar strollad."
+
+#: actions/groupunblock.php:128 actions/unblock.php:86
+msgid "Error removing the block."
+msgstr "Ur fazi a zo bet e-pad nulladenn ar stankadenn."
+
+#: actions/imsettings.php:59
+msgid "IM settings"
+msgstr "Arventennoù ar bostelerezh prim"
+
+#: actions/imsettings.php:70
+#, php-format
+msgid ""
+"You can send and receive notices through Jabber/GTalk [instant messages](%%"
+"doc.im%%). Configure your address and settings below."
+msgstr ""
+
+#: actions/imsettings.php:89
+msgid "IM is not available."
+msgstr "Dizimplijadus eo ar bostelerezh prim"
+
+#: actions/imsettings.php:106
+msgid "Current confirmed Jabber/GTalk address."
+msgstr "Chomlec'h Jabber/GTalk kadarnaet er mare-mañ."
+
+#: actions/imsettings.php:114
+#, php-format
+msgid ""
+"Awaiting confirmation on this address. Check your Jabber/GTalk account for a "
+"message with further instructions. (Did you add %s to your buddy list?)"
+msgstr ""
+
+#: actions/imsettings.php:124
+msgid "IM address"
+msgstr "Chomlec'h postelerezh prim"
+
+#: actions/imsettings.php:126
+#, php-format
+msgid ""
+"Jabber or GTalk address, like \"UserName@example.org\". First, make sure to "
+"add %s to your buddy list in your IM client or on GTalk."
+msgstr ""
+
+#: actions/imsettings.php:143
+msgid "Send me notices through Jabber/GTalk."
+msgstr "Kas din an alioù dre Jabber/GTalk."
+
+#: actions/imsettings.php:148
+msgid "Post a notice when my Jabber/GTalk status changes."
+msgstr ""
+
+#: actions/imsettings.php:153
+msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to."
+msgstr ""
+
+#: actions/imsettings.php:159
+msgid "Publish a MicroID for my Jabber/GTalk address."
+msgstr "Embann ur MicroID evit ma chomlec'h Jabber/GTalk."
+
+#: actions/imsettings.php:285
+msgid "No Jabber ID."
+msgstr "ID Jabber ebet."
+
+#: actions/imsettings.php:292
+msgid "Cannot normalize that Jabber ID"
+msgstr "Diposubl eo implijout an ID Jabber-mañ"
+
+#: actions/imsettings.php:296
+msgid "Not a valid Jabber ID"
+msgstr "N'eo ket un ID Jabber reizh."
+
+#: actions/imsettings.php:299
+msgid "That is already your Jabber ID."
+msgstr "Ho ID Jabber eo dija"
+
+#: actions/imsettings.php:302
+msgid "Jabber ID already belongs to another user."
+msgstr "Implijet eo an Jabber ID-mañ gant un implijer all."
+
+#: actions/imsettings.php:327
+#, php-format
+msgid ""
+"A confirmation code was sent to the IM address you added. You must approve %"
+"s for sending messages to you."
+msgstr ""
+
+#: actions/imsettings.php:387
+msgid "That is not your Jabber ID."
+msgstr "N'eo ket ho ID Jabber."
+
+#: actions/inbox.php:59
+#, php-format
+msgid "Inbox for %1$s - page %2$d"
+msgstr "Boest degemer %1$s - pajenn %2$d"
+
+#: actions/inbox.php:62
+#, php-format
+msgid "Inbox for %s"
+msgstr "Bost resevout %s"
+
+#: actions/inbox.php:115
+msgid "This is your inbox, which lists your incoming private messages."
+msgstr ""
+
+#: actions/invite.php:39
+msgid "Invites have been disabled."
+msgstr "Diweredekaat eo bet ar bedadennoù."
+
+#: actions/invite.php:41
+#, php-format
+msgid "You must be logged in to invite other users to use %s"
+msgstr ""
+
+#: actions/invite.php:72
+#, php-format
+msgid "Invalid email address: %s"
+msgstr "Fall eo ar postel : %s"
+
+#: actions/invite.php:110
+msgid "Invitation(s) sent"
+msgstr "Kaset eo bet ar bedadenn(où)"
+
+#: actions/invite.php:112
+msgid "Invite new users"
+msgstr "Pediñ implijerien nevez"
+
+#: actions/invite.php:128
+msgid "You are already subscribed to these users:"
+msgstr "Koumanantet oc'h dija d'an implijerien-mañ :"
+
+#: actions/invite.php:131 actions/invite.php:139 lib/command.php:306
+#, php-format
+msgid "%1$s (%2$s)"
+msgstr "%1$s (%2$s)"
+
+#: actions/invite.php:136
+msgid ""
+"These people are already users and you were automatically subscribed to them:"
+msgstr ""
+"Implijerien eo dija an dud-mañ ha koumanantet oc'h bet ez emgefre d'an "
+"implijerien da-heul :"
+
+#: actions/invite.php:144
+msgid "Invitation(s) sent to the following people:"
+msgstr "Pedadennoù bet kaset d'an implijerien da-heul :"
+
+#: actions/invite.php:150
+msgid ""
+"You will be notified when your invitees accept the invitation and register "
+"on the site. Thanks for growing the community!"
+msgstr ""
+
+#: actions/invite.php:162
+msgid ""
+"Use this form to invite your friends and colleagues to use this service."
+msgstr ""
+
+#: actions/invite.php:187
+msgid "Email addresses"
+msgstr "Chomlec'hioù postel"
+
+#: actions/invite.php:189
+msgid "Addresses of friends to invite (one per line)"
+msgstr "Chomlec'hioù an implijerien da bediñ (unan dre linenn)"
+
+#: actions/invite.php:192
+msgid "Personal message"
+msgstr "Kemenadenn bersonel"
+
+#: actions/invite.php:194
+msgid "Optionally add a personal message to the invitation."
+msgstr ""
+
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+msgctxt "BUTTON"
+msgid "Send"
+msgstr "Kas"
+
+#: actions/invite.php:227
+#, php-format
+msgid "%1$s has invited you to join them on %2$s"
+msgstr "%1$s a bed ac'hanoc'h d'en em enskrivañ war %2$s"
+
+#: actions/invite.php:229
+#, php-format
+msgid ""
+"%1$s has invited you to join them on %2$s (%3$s).\n"
+"\n"
+"%2$s is a micro-blogging service that lets you keep up-to-date with people "
+"you know and people who interest you.\n"
+"\n"
+"You can also share news about yourself, your thoughts, or your life online "
+"with people who know about you. It's also great for meeting new people who "
+"share your interests.\n"
+"\n"
+"%1$s said:\n"
+"\n"
+"%4$s\n"
+"\n"
+"You can see %1$s's profile page on %2$s here:\n"
+"\n"
+"%5$s\n"
+"\n"
+"If you'd like to try the service, click on the link below to accept the "
+"invitation.\n"
+"\n"
+"%6$s\n"
+"\n"
+"If not, you can ignore this message. Thanks for your patience and your "
+"time.\n"
+"\n"
+"Sincerely, %2$s\n"
+msgstr ""
+
+#: actions/joingroup.php:60
+msgid "You must be logged in to join a group."
+msgstr "Rankout a reoc'h bezañ luget evit mont en ur strollad."
+
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Lesanv pe ID ebet."
+
+#: actions/joingroup.php:141
+#, php-format
+msgid "%1$s joined group %2$s"
+msgstr "%1$s a zo bet er strollad %2$s"
+
+#: actions/leavegroup.php:60
+msgid "You must be logged in to leave a group."
+msgstr "Ret eo deoc'h bezañ kevreet evit kuitaat ur strollad"
+
+#: actions/leavegroup.php:100 lib/command.php:265
+msgid "You are not a member of that group."
+msgstr "N'oc'h ket un ezel eus ar strollad-mañ."
+
+#: actions/leavegroup.php:137
+#, php-format
+msgid "%1$s left group %2$s"
+msgstr "%1$s en deus kuitaet ar strollad %2$s"
+
+#: actions/login.php:80 actions/otp.php:62 actions/register.php:137
+msgid "Already logged in."
+msgstr "Kevreet oc'h dija."
+
+#: actions/login.php:126
+msgid "Incorrect username or password."
+msgstr "Anv implijer pe ger-tremen direizh."
+
+#: actions/login.php:132 actions/otp.php:120
+msgid "Error setting user. You are probably not authorized."
+msgstr ""
+"Ur fazi 'zo bet e-pad hizivadenn an implijer. Moarvat n'oc'h ket aotreet "
+"evit en ober."
+
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
+msgid "Login"
+msgstr "Kevreañ"
+
+#: actions/login.php:227
+msgid "Login to site"
+msgstr "Kevreañ d'al lec'hienn"
+
+#: actions/login.php:236 actions/register.php:478
+msgid "Remember me"
+msgstr "Kaout soñj"
+
+#: actions/login.php:237 actions/register.php:480
+msgid "Automatically login in the future; not for shared computers!"
+msgstr ""
+"Digeriñ va dalc'h war-eeun ar wechoù o tont ; arabat en ober war "
+"urzhiataeroù rannet pe publik !"
+
+#: actions/login.php:247
+msgid "Lost or forgotten password?"
+msgstr "Ha kollet o peus ho ker-tremen ?"
+
+#: actions/login.php:266
+msgid ""
+"For security reasons, please re-enter your user name and password before "
+"changing your settings."
+msgstr ""
+"Evit abegoù a surentezh, mar plij adlakait hoc'h anv implijer hag ho ker-"
+"tremen a-benn enrollañ ho penndibaboù."
+
+#: actions/login.php:270
+#, php-format
+msgid ""
+"Login with your username and password. Don't have a username yet? [Register]"
+"(%%action.register%%) a new account."
+msgstr ""
+"Kevreit gant ho anv implijer hag ho ker tremen. N'o peus ket a anv implijer "
+"evit c'hoazh ? [Krouit](%%action.register%%) ur gont nevez."
+
+#: actions/makeadmin.php:92
+msgid "Only an admin can make another user an admin."
+msgstr "N'eus nemet ur merour a c'hall lakaat un implijer all da vezañ merour."
+
+#: actions/makeadmin.php:96
+#, php-format
+msgid "%1$s is already an admin for group \"%2$s\"."
+msgstr "%1$s a zo dija merour ar strollad \"%2$s\"."
+
+#: actions/makeadmin.php:133
+#, php-format
+msgid "Can't get membership record for %1$s in group %2$s."
+msgstr ""
+
+#: actions/makeadmin.php:146
+#, php-format
+msgid "Can't make %1$s an admin for group %2$s."
+msgstr "Diposubl eo lakaat %1$s da merour ar strollad %2$s."
+
+#: actions/microsummary.php:69
+msgid "No current status"
+msgstr "Statud ebet er mare-mañ"
+
+#: actions/newapplication.php:52
+msgid "New Application"
+msgstr "Poellad nevez"
+
+#: actions/newapplication.php:64
+msgid "You must be logged in to register an application."
+msgstr "Ret eo deoc'h bezañ luget evit enrollañ ur poellad."
+
+#: actions/newapplication.php:143
+msgid "Use this form to register a new application."
+msgstr "Implijit ar furmskrid-mañ evit enskrivañ ur poellad nevez."
+
+#: actions/newapplication.php:176
+msgid "Source URL is required."
+msgstr "Ezhomm 'zo eus ar vammenn URL."
+
+#: actions/newapplication.php:258 actions/newapplication.php:267
+msgid "Could not create application."
+msgstr "N'eo ket posubl krouiñ ar poellad."
+
+#: actions/newgroup.php:53
+msgid "New group"
+msgstr "Strollad nevez"
+
+#: actions/newgroup.php:110
+msgid "Use this form to create a new group."
+msgstr "Implijit ar furmskrid-mañ a-benn krouiñ ur strollad nevez."
+
+#: actions/newmessage.php:71 actions/newmessage.php:231
+msgid "New message"
+msgstr "Kemennadenn nevez"
+
+#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:358
+msgid "You can't send a message to this user."
+msgstr "Ne c'helloc'h ket kas kemennadennoù d'an implijer-mañ."
+
+#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:342
+#: lib/command.php:475
+msgid "No content!"
+msgstr "Goullo eo !"
+
+#: actions/newmessage.php:158
+msgid "No recipient specified."
+msgstr "N'o peus ket lakaet a resever."
+
+#: actions/newmessage.php:164 lib/command.php:361
+msgid ""
+"Don't send a message to yourself; just say it to yourself quietly instead."
+msgstr ""
+"Na gasit ket a gemennadenn deoc'h c'hwi ho unan ; lavarit an traoù-se en ho "
+"penn kentoc'h."
+
+#: actions/newmessage.php:181
+msgid "Message sent"
+msgstr "Kaset eo bet ar gemenadenn"
+
+#: actions/newmessage.php:185
+#, php-format
+msgid "Direct message to %s sent."
+msgstr "Kaset eo bet da %s ar gemennadenn war-eeun."
+
+#: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170
+msgid "Ajax Error"
+msgstr "Fazi Ajax"
+
+#: actions/newnotice.php:69
+msgid "New notice"
+msgstr "Ali nevez"
+
+#: actions/newnotice.php:211
+msgid "Notice posted"
+msgstr "Ali embannet"
+
+#: actions/noticesearch.php:68
+#, php-format
+msgid ""
+"Search for notices on %%site.name%% by their contents. Separate search terms "
+"by spaces; they must be 3 characters or more."
+msgstr ""
+
+#: actions/noticesearch.php:78
+msgid "Text search"
+msgstr "Klask un destenn"
+
+#: actions/noticesearch.php:91
+#, php-format
+msgid "Search results for \"%1$s\" on %2$s"
+msgstr "Disoc'hoù ar c'hlask evit \"%1$s\" e %2$s"
+
+#: actions/noticesearch.php:121
+#, php-format
+msgid ""
+"Be the first to [post on this topic](%%%%action.newnotice%%%%?"
+"status_textarea=%s)!"
+msgstr ""
+
+#: actions/noticesearch.php:124
+#, php-format
+msgid ""
+"Why not [register an account](%%%%action.register%%%%) and be the first to "
+"[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!"
+msgstr ""
+
+#: actions/noticesearchrss.php:96
+#, php-format
+msgid "Updates with \"%s\""
+msgstr "Hizivadenn gant \"%s\""
+
+#: actions/noticesearchrss.php:98
+#, php-format
+msgid "Updates matching search term \"%1$s\" on %2$s!"
+msgstr ""
+
+#: actions/nudge.php:85
+msgid ""
+"This user doesn't allow nudges or hasn't confirmed or set his email yet."
+msgstr ""
+
+#: actions/nudge.php:94
+msgid "Nudge sent"
+msgstr "Kaset eo bet ar blinkadenn"
+
+#: actions/nudge.php:97
+msgid "Nudge sent!"
+msgstr "Kaset eo bet ar blinkadenn !"
+
+#: actions/oauthappssettings.php:59
+msgid "You must be logged in to list your applications."
+msgstr "Rankout a reoc'h bezañ kevreet evit rollañ ho poelladoù."
+
+#: actions/oauthappssettings.php:74
+msgid "OAuth applications"
+msgstr "Poelladoù OAuth"
+
+#: actions/oauthappssettings.php:85
+msgid "Applications you have registered"
+msgstr "Ar poelladoù o peus enrollet"
+
+#: actions/oauthappssettings.php:135
+#, php-format
+msgid "You have not registered any applications yet."
+msgstr "N'o peus enrollet poellad ebet evit poent."
+
+#: actions/oauthconnectionssettings.php:72
+msgid "Connected applications"
+msgstr "Poeladoù kevreet."
+
+#: actions/oauthconnectionssettings.php:83
+msgid "You have allowed the following applications to access you account."
+msgstr ""
+
+#: actions/oauthconnectionssettings.php:175
+msgid "You are not a user of that application."
+msgstr "N'oc'h ket un implijer eus ar poellad-mañ."
+
+#: actions/oauthconnectionssettings.php:186
+msgid "Unable to revoke access for app: "
+msgstr "Dibosupl eo nullañ moned ar poellad : "
+
+#: actions/oauthconnectionssettings.php:198
+#, php-format
+msgid "You have not authorized any applications to use your account."
+msgstr ""
+
+#: actions/oauthconnectionssettings.php:211
+msgid "Developers can edit the registration settings for their applications "
+msgstr ""
+
+#: actions/oembed.php:79 actions/shownotice.php:100
+msgid "Notice has no profile"
+msgstr "N'en deus ket an ali a profil"
+
+#: actions/oembed.php:86 actions/shownotice.php:180
+#, php-format
+msgid "%1$s's status on %2$s"
+msgstr "Statud %1$s war %2$s"
+
+#: actions/oembed.php:157
+msgid "content type "
+msgstr "seurt an danvez "
+
+#: actions/oembed.php:160
+msgid "Only "
+msgstr "Hepken "
+
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
+msgid "Not a supported data format."
+msgstr ""
+
+#: actions/opensearch.php:64
+msgid "People Search"
+msgstr "Klask tud"
+
+#: actions/opensearch.php:67
+msgid "Notice Search"
+msgstr "Klask alioù"
+
+#: actions/othersettings.php:60
+msgid "Other settings"
+msgstr "Arventennoù all"
+
+#: actions/othersettings.php:71
+msgid "Manage various other options."
+msgstr "Dibarzhioù all da gefluniañ."
+
+#: actions/othersettings.php:108
+msgid " (free service)"
+msgstr "  (servij digoust)"
+
+#: actions/othersettings.php:116
+msgid "Shorten URLs with"
+msgstr ""
+
+#: actions/othersettings.php:117
+msgid "Automatic shortening service to use."
+msgstr ""
+
+#: actions/othersettings.php:122
+msgid "View profile designs"
+msgstr ""
+
+#: actions/othersettings.php:123
+msgid "Show or hide profile designs."
+msgstr ""
+
+#: actions/othersettings.php:153
+msgid "URL shortening service is too long (max 50 chars)."
+msgstr ""
+
+#: actions/otp.php:69
+msgid "No user ID specified."
+msgstr "N'eus bet diferet ID implijer ebet."
+
+#: actions/otp.php:83
+msgid "No login token specified."
+msgstr ""
+
+#: actions/otp.php:90
+msgid "No login token requested."
+msgstr ""
+
+#: actions/otp.php:95
+msgid "Invalid login token specified."
+msgstr ""
+
+#: actions/otp.php:104
+msgid "Login token expired."
+msgstr ""
+
+#: actions/outbox.php:58
+#, php-format
+msgid "Outbox for %1$s - page %2$d"
+msgstr "Boest kas %1$s - pajenn %2$d"
+
+#: actions/outbox.php:61
+#, php-format
+msgid "Outbox for %s"
+msgstr "Boest kas %s"
+
+#: actions/outbox.php:116
+msgid "This is your outbox, which lists private messages you have sent."
+msgstr ""
+
+#: actions/passwordsettings.php:58
+msgid "Change password"
+msgstr "Cheñch ger-tremen"
+
+#: actions/passwordsettings.php:69
+msgid "Change your password."
+msgstr "Kemmañ ho ger tremen."
+
+#: actions/passwordsettings.php:96 actions/recoverpassword.php:231
+msgid "Password change"
+msgstr "Kemmañ ar ger-tremen"
+
+#: actions/passwordsettings.php:104
+msgid "Old password"
+msgstr "Ger-tremen kozh"
+
+#: actions/passwordsettings.php:108 actions/recoverpassword.php:235
+msgid "New password"
+msgstr "Ger-tremen nevez"
+
+#: actions/passwordsettings.php:109
+msgid "6 or more characters"
+msgstr "6 arouezenn pe muioc'h"
+
+#: actions/passwordsettings.php:112 actions/recoverpassword.php:239
+#: actions/register.php:433 actions/smssettings.php:134
+msgid "Confirm"
+msgstr "Kadarnaat"
+
+#: actions/passwordsettings.php:113 actions/recoverpassword.php:240
+msgid "Same as password above"
+msgstr "Memestra eget ar ger tremen a-us"
+
+#: actions/passwordsettings.php:117
+msgid "Change"
+msgstr "Kemmañ"
+
+#: actions/passwordsettings.php:154 actions/register.php:230
+msgid "Password must be 6 or more characters."
+msgstr "Rankout a ra ar ger-tremen bezañ gant 6 arouezenn d'an nebeutañ."
+
+#: actions/passwordsettings.php:157 actions/register.php:233
+msgid "Passwords don't match."
+msgstr "Ne glot ket ar gerioù-tremen."
+
+#: actions/passwordsettings.php:165
+msgid "Incorrect old password"
+msgstr "ger-termen kozh amreizh"
+
+#: actions/passwordsettings.php:181
+msgid "Error saving user; invalid."
+msgstr "Ur fazi 'zo bet e-pad enolladenn an implijer ; diwiriek."
+
+#: actions/passwordsettings.php:186 actions/recoverpassword.php:368
+msgid "Can't save new password."
+msgstr "Dibosupl eo enrollañ ar ger-tremen nevez."
+
+#: actions/passwordsettings.php:192 actions/recoverpassword.php:211
+msgid "Password saved."
+msgstr "Ger-tremen enrollet."
+
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
+msgid "Paths"
+msgstr "Hentoù"
+
+#: actions/pathsadminpanel.php:70
+msgid "Path and server settings for this StatusNet site."
+msgstr ""
+
+#: actions/pathsadminpanel.php:157
+#, php-format
+msgid "Theme directory not readable: %s"
+msgstr ""
+
+#: actions/pathsadminpanel.php:163
+#, php-format
+msgid "Avatar directory not writable: %s"
+msgstr ""
+
+#: actions/pathsadminpanel.php:169
+#, php-format
+msgid "Background directory not writable: %s"
+msgstr ""
+
+#: actions/pathsadminpanel.php:177
+#, php-format
+msgid "Locales directory not readable: %s"
+msgstr ""
+
+#: actions/pathsadminpanel.php:183
+msgid "Invalid SSL server. The maximum length is 255 characters."
+msgstr ""
+
+#: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
+msgid "Site"
+msgstr "Lec'hien"
+
+#: actions/pathsadminpanel.php:238
+msgid "Server"
+msgstr "Servijer"
+
+#: actions/pathsadminpanel.php:238
+msgid "Site's server hostname."
+msgstr ""
+
+#: actions/pathsadminpanel.php:242
+msgid "Path"
+msgstr "Hent"
+
+#: actions/pathsadminpanel.php:242
+msgid "Site path"
+msgstr "Hent al lec'hien"
+
+#: actions/pathsadminpanel.php:246
+msgid "Path to locales"
+msgstr ""
+
+#: actions/pathsadminpanel.php:246
+msgid "Directory path to locales"
+msgstr ""
+
+#: actions/pathsadminpanel.php:250
+msgid "Fancy URLs"
+msgstr "URLioù brav"
+
+#: actions/pathsadminpanel.php:252
+msgid "Use fancy (more readable and memorable) URLs?"
+msgstr ""
+
+#: actions/pathsadminpanel.php:259
+msgid "Theme"
+msgstr "Danvez"
+
+#: actions/pathsadminpanel.php:264
+msgid "Theme server"
+msgstr "Servijer danvezioù"
+
+#: actions/pathsadminpanel.php:268
+msgid "Theme path"
+msgstr "Hentad an tem"
+
+#: actions/pathsadminpanel.php:272
+msgid "Theme directory"
+msgstr "Doser an temoù"
+
+#: actions/pathsadminpanel.php:279
+msgid "Avatars"
+msgstr "Avataroù"
+
+#: actions/pathsadminpanel.php:284
+msgid "Avatar server"
+msgstr "Servijer avatar"
+
+#: actions/pathsadminpanel.php:288
+msgid "Avatar path"
+msgstr ""
+
+#: actions/pathsadminpanel.php:292
+msgid "Avatar directory"
+msgstr ""
+
+#: actions/pathsadminpanel.php:301
+msgid "Backgrounds"
+msgstr "Backgroundoù"
+
+#: actions/pathsadminpanel.php:305
+msgid "Background server"
+msgstr "Servijer ar backgroundoù"
+
+#: actions/pathsadminpanel.php:309
+msgid "Background path"
+msgstr ""
+
+#: actions/pathsadminpanel.php:313
+msgid "Background directory"
+msgstr ""
+
+#: actions/pathsadminpanel.php:320
+msgid "SSL"
+msgstr "SSL"
+
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
+msgid "Never"
+msgstr "Morse"
+
+#: actions/pathsadminpanel.php:324
+msgid "Sometimes"
+msgstr "A-wechoù"
+
+#: actions/pathsadminpanel.php:325
+msgid "Always"
+msgstr "Atav"
+
+#: actions/pathsadminpanel.php:329
+msgid "Use SSL"
+msgstr "Implij SSl"
+
+#: actions/pathsadminpanel.php:330
+msgid "When to use SSL"
+msgstr ""
+
+#: actions/pathsadminpanel.php:335
+msgid "SSL server"
+msgstr "Servijer SSL"
+
+#: actions/pathsadminpanel.php:336
+msgid "Server to direct SSL requests to"
+msgstr ""
+
+#: actions/pathsadminpanel.php:352
+msgid "Save paths"
+msgstr "Enrollañ an hentadoù."
+
+#: actions/peoplesearch.php:52
+#, php-format
+msgid ""
+"Search for people on %%site.name%% by their name, location, or interests. "
+"Separate the terms by spaces; they must be 3 characters or more."
+msgstr ""
+
+#: actions/peoplesearch.php:58
+msgid "People search"
+msgstr "Klask tud"
+
+#: actions/peopletag.php:70
+#, php-format
+msgid "Not a valid people tag: %s"
+msgstr "N'eo ket reizh ar merk-se : %s"
+
+#: actions/peopletag.php:144
+#, php-format
+msgid "Users self-tagged with %1$s - page %2$d"
+msgstr ""
+
+#: actions/postnotice.php:95
+msgid "Invalid notice content"
+msgstr ""
+
+#: actions/postnotice.php:101
+#, php-format
+msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgstr ""
+
+#: actions/profilesettings.php:60
+msgid "Profile settings"
+msgstr "Arventennoù ar profil"
+
+#: actions/profilesettings.php:71
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+#: actions/profilesettings.php:99
+msgid "Profile information"
+msgstr "Titouroù ar profil"
+
+#: actions/profilesettings.php:108 lib/groupeditform.php:154
+msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
+msgstr ""
+
+#: actions/profilesettings.php:111 actions/register.php:448
+#: actions/showgroup.php:255 actions/tagother.php:104
+#: lib/groupeditform.php:157 lib/userprofile.php:149
+msgid "Full name"
+msgstr "Anv klok"
+
+#: actions/profilesettings.php:115 actions/register.php:453
+#: lib/applicationeditform.php:228 lib/groupeditform.php:161
+msgid "Homepage"
+msgstr "Pajenn degemer"
+
+#: actions/profilesettings.php:117 actions/register.php:455
+msgid "URL of your homepage, blog, or profile on another site"
+msgstr ""
+
+#: actions/profilesettings.php:122 actions/register.php:461
+#, php-format
+msgid "Describe yourself and your interests in %d chars"
+msgstr ""
+
+#: actions/profilesettings.php:125 actions/register.php:464
+msgid "Describe yourself and your interests"
+msgstr ""
+
+#: actions/profilesettings.php:127 actions/register.php:466
+msgid "Bio"
+msgstr "Buhezskrid"
+
+#: actions/profilesettings.php:132 actions/register.php:471
+#: actions/showgroup.php:264 actions/tagother.php:112
+#: actions/userauthorization.php:166 lib/groupeditform.php:177
+#: lib/userprofile.php:164
+msgid "Location"
+msgstr "Lec'hiadur"
+
+#: actions/profilesettings.php:134 actions/register.php:473
+msgid "Where you are, like \"City, State (or Region), Country\""
+msgstr ""
+
+#: actions/profilesettings.php:138
+msgid "Share my current location when posting notices"
+msgstr ""
+
+#: actions/profilesettings.php:145 actions/tagother.php:149
+#: actions/tagother.php:209 lib/subscriptionlist.php:106
+#: lib/subscriptionlist.php:108 lib/userprofile.php:209
+msgid "Tags"
+msgstr "Balizennoù"
+
+#: actions/profilesettings.php:147
+msgid ""
+"Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
+msgstr ""
+
+#: actions/profilesettings.php:151
+msgid "Language"
+msgstr "Yezh"
+
+#: actions/profilesettings.php:152
+msgid "Preferred language"
+msgstr "Yezh d'ober ganti da gentañ"
+
+#: actions/profilesettings.php:161
+msgid "Timezone"
+msgstr "Takad eur"
+
+#: actions/profilesettings.php:162
+msgid "What timezone are you normally in?"
+msgstr ""
+
+#: actions/profilesettings.php:167
+msgid ""
+"Automatically subscribe to whoever subscribes to me (best for non-humans)"
+msgstr ""
+
+#: actions/profilesettings.php:228 actions/register.php:223
+#, php-format
+msgid "Bio is too long (max %d chars)."
+msgstr "Re hir eo ar bio (%d arouezenn d'ar muiañ)."
+
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
+msgid "Timezone not selected."
+msgstr "N'eo bet dibabet gwerzhid-eur ebet."
+
+#: actions/profilesettings.php:241
+msgid "Language is too long (max 50 chars)."
+msgstr "Re hir eo ar yezh (255 arouezenn d'ar muiañ)."
+
+#: actions/profilesettings.php:253 actions/tagother.php:178
+#, php-format
+msgid "Invalid tag: \"%s\""
+msgstr "Balizenn direizh : \"%s\""
+
+#: actions/profilesettings.php:306
+msgid "Couldn't update user for autosubscribe."
+msgstr ""
+
+#: actions/profilesettings.php:363
+msgid "Couldn't save location prefs."
+msgstr ""
+
+#: actions/profilesettings.php:375
+msgid "Couldn't save profile."
+msgstr "Diposubl eo enrollañ ar profil."
+
+#: actions/profilesettings.php:383
+msgid "Couldn't save tags."
+msgstr "Diposubl eo enrollañ ar balizennoù."
+
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
+msgid "Settings saved."
+msgstr "Enrollet eo bet an arventennoù."
+
+#: actions/public.php:83
+#, php-format
+msgid "Beyond the page limit (%s)"
+msgstr ""
+
+#: actions/public.php:92
+msgid "Could not retrieve public stream."
+msgstr ""
+
+#: actions/public.php:130
+#, php-format
+msgid "Public timeline, page %d"
+msgstr ""
+
+#: actions/public.php:132 lib/publicgroupnav.php:79
+msgid "Public timeline"
+msgstr ""
+
+#: actions/public.php:160
+msgid "Public Stream Feed (RSS 1.0)"
+msgstr ""
+
+#: actions/public.php:164
+msgid "Public Stream Feed (RSS 2.0)"
+msgstr ""
+
+#: actions/public.php:168
+msgid "Public Stream Feed (Atom)"
+msgstr ""
+
+#: actions/public.php:188
+#, php-format
+msgid ""
+"This is the public timeline for %%site.name%% but no one has posted anything "
+"yet."
+msgstr ""
+
+#: actions/public.php:191
+msgid "Be the first to post!"
+msgstr "Bezit an hini gentañ da bostañ !"
+
+#: actions/public.php:195
+#, php-format
+msgid ""
+"Why not [register an account](%%action.register%%) and be the first to post!"
+msgstr ""
+
+#: actions/public.php:242
+#, php-format
+msgid ""
+"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
+"blogging) service based on the Free Software [StatusNet](http://status.net/) "
+"tool. [Join now](%%action.register%%) to share notices about yourself with "
+"friends, family, and colleagues! ([Read more](%%doc.help%%))"
+msgstr ""
+
+#: actions/public.php:247
+#, php-format
+msgid ""
+"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
+"blogging) service based on the Free Software [StatusNet](http://status.net/) "
+"tool."
+msgstr ""
+
+#: actions/publictagcloud.php:57
+msgid "Public tag cloud"
+msgstr ""
+
+#: actions/publictagcloud.php:63
+#, php-format
+msgid "These are most popular recent tags on %s "
+msgstr ""
+
+#: actions/publictagcloud.php:69
+#, php-format
+msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet."
+msgstr ""
+
+#: actions/publictagcloud.php:72
+msgid "Be the first to post one!"
+msgstr ""
+
+#: actions/publictagcloud.php:75
+#, php-format
+msgid ""
+"Why not [register an account](%%action.register%%) and be the first to post "
+"one!"
+msgstr ""
+
+#: actions/publictagcloud.php:134
+msgid "Tag cloud"
+msgstr ""
+
+#: actions/recoverpassword.php:36
+msgid "You are already logged in!"
+msgstr "Luget oc'h dija !"
+
+#: actions/recoverpassword.php:62
+msgid "No such recovery code."
+msgstr "Kod adtapout nann-kavet."
+
+#: actions/recoverpassword.php:66
+msgid "Not a recovery code."
+msgstr "N'eo ket ur c'hod adtapout an dra-mañ."
+
+#: actions/recoverpassword.php:73
+msgid "Recovery code for unknown user."
+msgstr ""
+
+#: actions/recoverpassword.php:86
+msgid "Error with confirmation code."
+msgstr ""
+
+#: actions/recoverpassword.php:97
+msgid "This confirmation code is too old. Please start again."
+msgstr ""
+
+#: actions/recoverpassword.php:111
+msgid "Could not update user with confirmed email address."
+msgstr ""
+
+#: actions/recoverpassword.php:152
+msgid ""
+"If you have forgotten or lost your password, you can get a new one sent to "
+"the email address you have stored in your account."
+msgstr ""
+
+#: actions/recoverpassword.php:158
+msgid "You have been identified. Enter a new password below. "
+msgstr ""
+
+#: actions/recoverpassword.php:188
+msgid "Password recovery"
+msgstr "Adtapout ar ger-tremen"
+
+#: actions/recoverpassword.php:191
+msgid "Nickname or email address"
+msgstr ""
+
+#: actions/recoverpassword.php:193
+msgid "Your nickname on this server, or your registered email address."
+msgstr ""
+
+#: actions/recoverpassword.php:199 actions/recoverpassword.php:200
+msgid "Recover"
+msgstr "Adtapout"
+
+#: actions/recoverpassword.php:208
+msgid "Reset password"
+msgstr "Adderaouekaat ar ger-tremen"
+
+#: actions/recoverpassword.php:209
+msgid "Recover password"
+msgstr "Adtapout ar ger-tremen"
+
+#: actions/recoverpassword.php:210 actions/recoverpassword.php:322
+msgid "Password recovery requested"
+msgstr "Goulennet eo an adtapout gerioù-tremen"
+
+#: actions/recoverpassword.php:213
+msgid "Unknown action"
+msgstr "Ober dianav"
+
+#: actions/recoverpassword.php:236
+msgid "6 or more characters, and don't forget it!"
+msgstr "6 arouezenn pe muioc'h, ha n'e zisoñjit ket !"
+
+#: actions/recoverpassword.php:243
+msgid "Reset"
+msgstr "Adderaouekaat"
+
+#: actions/recoverpassword.php:252
+msgid "Enter a nickname or email address."
+msgstr "Lakait ul lesanv pe ur chomlec'h postel."
+
+#: actions/recoverpassword.php:272
+msgid "No user with that email address or username."
+msgstr ""
+
+#: actions/recoverpassword.php:287
+msgid "No registered email address for that user."
+msgstr ""
+
+#: actions/recoverpassword.php:301
+msgid "Error saving address confirmation."
+msgstr ""
+
+#: actions/recoverpassword.php:325
+msgid ""
+"Instructions for recovering your password have been sent to the email "
+"address registered to your account."
+msgstr ""
+
+#: actions/recoverpassword.php:344
+msgid "Unexpected password reset."
+msgstr ""
+
+#: actions/recoverpassword.php:352
+msgid "Password must be 6 chars or more."
+msgstr ""
+
+#: actions/recoverpassword.php:356
+msgid "Password and confirmation do not match."
+msgstr ""
+
+#: actions/recoverpassword.php:375 actions/register.php:248
+msgid "Error setting user."
+msgstr ""
+
+#: actions/recoverpassword.php:382
+msgid "New password successfully saved. You are now logged in."
+msgstr ""
+
+#: actions/register.php:85 actions/register.php:189 actions/register.php:405
+msgid "Sorry, only invited people can register."
+msgstr ""
+
+#: actions/register.php:92
+msgid "Sorry, invalid invitation code."
+msgstr "Digarezit, kod pedadenn direizh."
+
+#: actions/register.php:112
+msgid "Registration successful"
+msgstr ""
+
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
+msgid "Register"
+msgstr "Krouiñ ur gont"
+
+#: actions/register.php:135
+msgid "Registration not allowed."
+msgstr ""
+
+#: actions/register.php:198
+msgid "You can't register if you don't agree to the license."
+msgstr ""
+
+#: actions/register.php:212
+msgid "Email address already exists."
+msgstr "Implijet eo dija ar chomlec'h postel-se."
+
+#: actions/register.php:243 actions/register.php:265
+msgid "Invalid username or password."
+msgstr ""
+
+#: actions/register.php:343
+msgid ""
+"With this form you can create  a new account. You can then post notices and "
+"link up to friends and colleagues. "
+msgstr ""
+
+#: actions/register.php:425
+msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required."
+msgstr ""
+
+#: actions/register.php:430
+msgid "6 or more characters. Required."
+msgstr "6 arouezenn pe muioc'h. Rekis."
+
+#: actions/register.php:434
+msgid "Same as password above. Required."
+msgstr "Memestra hag ar ger-tremen a-us. Rekis."
+
+#: actions/register.php:438 actions/register.php:442
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
+msgid "Email"
+msgstr "Postel"
+
+#: actions/register.php:439 actions/register.php:443
+msgid "Used only for updates, announcements, and password recovery"
+msgstr ""
+
+#: actions/register.php:450
+msgid "Longer name, preferably your \"real\" name"
+msgstr ""
+
+#: actions/register.php:494
+msgid "My text and files are available under "
+msgstr ""
+
+#: actions/register.php:496
+msgid "Creative Commons Attribution 3.0"
+msgstr ""
+
+#: actions/register.php:497
+msgid ""
+" except this private data: password, email address, IM address, and phone "
+"number."
+msgstr ""
+
+#: actions/register.php:538
+#, php-format
+msgid ""
+"Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may "
+"want to...\n"
+"\n"
+"* Go to [your profile](%2$s) and post your first message.\n"
+"* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send "
+"notices through instant messages.\n"
+"* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that "
+"share your interests. \n"
+"* Update your [profile settings](%%%%action.profilesettings%%%%) to tell "
+"others more about you. \n"
+"* Read over the [online docs](%%%%doc.help%%%%) for features you may have "
+"missed. \n"
+"\n"
+"Thanks for signing up and we hope you enjoy using this service."
+msgstr ""
+
+#: actions/register.php:562
+msgid ""
+"(You should receive a message by email momentarily, with instructions on how "
+"to confirm your email address.)"
+msgstr ""
+
+#: actions/remotesubscribe.php:98
+#, php-format
+msgid ""
+"To subscribe, you can [login](%%action.login%%), or [register](%%action."
+"register%%) a new  account. If you already have an account  on a [compatible "
+"microblogging site](%%doc.openmublog%%),  enter your profile URL below."
+msgstr ""
+
+#: actions/remotesubscribe.php:112
+msgid "Remote subscribe"
+msgstr ""
+
+#: actions/remotesubscribe.php:124
+msgid "Subscribe to a remote user"
+msgstr ""
+
+#: actions/remotesubscribe.php:129
+msgid "User nickname"
+msgstr ""
+
+#: actions/remotesubscribe.php:130
+msgid "Nickname of the user you want to follow"
+msgstr ""
+
+#: actions/remotesubscribe.php:133
+msgid "Profile URL"
+msgstr ""
+
+#: actions/remotesubscribe.php:134
+msgid "URL of your profile on another compatible microblogging service"
+msgstr ""
+
+#: actions/remotesubscribe.php:137 lib/subscribeform.php:139
+#: lib/userprofile.php:394
+msgid "Subscribe"
+msgstr "En em enskrivañ"
+
+#: actions/remotesubscribe.php:159
+msgid "Invalid profile URL (bad format)"
+msgstr ""
+
+#: actions/remotesubscribe.php:168
+msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)."
+msgstr ""
+
+#: actions/remotesubscribe.php:176
+msgid "That’s a local profile! Login to subscribe."
+msgstr ""
+
+#: actions/remotesubscribe.php:183
+msgid "Couldn’t get a request token."
+msgstr ""
+
+#: actions/repeat.php:57
+msgid "Only logged-in users can repeat notices."
+msgstr ""
+
+#: actions/repeat.php:64 actions/repeat.php:71
+msgid "No notice specified."
+msgstr "N'eus bet diferet ali ebet."
+
+#: actions/repeat.php:76
+msgid "You can't repeat your own notice."
+msgstr "Ne c'helloc'h ket adkemer ho ali deoc'h."
+
+#: actions/repeat.php:90
+msgid "You already repeated that notice."
+msgstr "Adkemeret o peus dija an ali-mañ."
+
+#: actions/repeat.php:114 lib/noticelist.php:674
+msgid "Repeated"
+msgstr "Adlavaret"
+
+#: actions/repeat.php:119
+msgid "Repeated!"
+msgstr "Adlavaret !"
+
+#: actions/replies.php:126 actions/repliesrss.php:68
+#: lib/personalgroupnav.php:105
+#, php-format
+msgid "Replies to %s"
+msgstr "Respontoù da %s"
+
+#: actions/replies.php:128
+#, php-format
+msgid "Replies to %1$s, page %2$d"
+msgstr "Respontoù da %1$s, pajenn %2$d"
+
+#: actions/replies.php:145
+#, php-format
+msgid "Replies feed for %s (RSS 1.0)"
+msgstr ""
+
+#: actions/replies.php:152
+#, php-format
+msgid "Replies feed for %s (RSS 2.0)"
+msgstr ""
+
+#: actions/replies.php:159
+#, php-format
+msgid "Replies feed for %s (Atom)"
+msgstr ""
+
+#: actions/replies.php:199
+#, php-format
+msgid ""
+"This is the timeline showing replies to %1$s but %2$s hasn't received a "
+"notice to his attention yet."
+msgstr ""
+
+#: actions/replies.php:204
+#, php-format
+msgid ""
+"You can engage other users in a conversation, subscribe to more people or "
+"[join groups](%%action.groups%%)."
+msgstr ""
+
+#: actions/replies.php:206
+#, php-format
+msgid ""
+"You can try to [nudge %1$s](../%2$s) or [post something to his or her "
+"attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
+msgstr ""
+
+#: actions/repliesrss.php:72
+#, php-format
+msgid "Replies to %1$s on %2$s!"
+msgstr ""
+
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Ne c'helloc'h ket kas kemennadennoù d'an implijer-mañ."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr ""
+
+#: actions/rsd.php:146 actions/version.php:157
+msgid "StatusNet"
+msgstr "StatusNet"
+
+#: actions/sandbox.php:65 actions/unsandbox.php:65
+msgid "You cannot sandbox users on this site."
+msgstr ""
+
+#: actions/sandbox.php:72
+msgid "User is already sandboxed."
+msgstr ""
+
+#. TRANS: Menu item for site administration
+#: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
+msgid "Sessions"
+msgstr "Dalc'hoù"
+
+#: actions/sessionsadminpanel.php:65
+msgid "Session settings for this StatusNet site."
+msgstr ""
+
+#: actions/sessionsadminpanel.php:175
+msgid "Handle sessions"
+msgstr "Merañ an dalc'hoù"
+
+#: actions/sessionsadminpanel.php:177
+msgid "Whether to handle sessions ourselves."
+msgstr ""
+
+#: actions/sessionsadminpanel.php:181
+msgid "Session debugging"
+msgstr ""
+
+#: actions/sessionsadminpanel.php:183
+msgid "Turn on debugging output for sessions."
+msgstr ""
+
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/useradminpanel.php:294
+msgid "Save site settings"
+msgstr ""
+
+#: actions/showapplication.php:82
+msgid "You must be logged in to view an application."
+msgstr ""
+
+#: actions/showapplication.php:157
+msgid "Application profile"
+msgstr ""
+
+#: actions/showapplication.php:159 lib/applicationeditform.php:180
+msgid "Icon"
+msgstr ""
+
+#: actions/showapplication.php:169 actions/version.php:195
+#: lib/applicationeditform.php:195
+msgid "Name"
+msgstr "Anv"
+
+#: actions/showapplication.php:178 lib/applicationeditform.php:222
+msgid "Organization"
+msgstr ""
+
+#: actions/showapplication.php:187 actions/version.php:198
+#: lib/applicationeditform.php:209 lib/groupeditform.php:172
+msgid "Description"
+msgstr ""
+
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
+msgid "Statistics"
+msgstr "Stadegoù"
+
+#: actions/showapplication.php:203
+#, php-format
+msgid "Created by %1$s - %2$s access by default - %3$d users"
+msgstr ""
+
+#: actions/showapplication.php:213
+msgid "Application actions"
+msgstr ""
+
+#: actions/showapplication.php:236
+msgid "Reset key & secret"
+msgstr ""
+
+#: actions/showapplication.php:261
+msgid "Application info"
+msgstr ""
+
+#: actions/showapplication.php:263
+msgid "Consumer key"
+msgstr ""
+
+#: actions/showapplication.php:268
+msgid "Consumer secret"
+msgstr ""
+
+#: actions/showapplication.php:273
+msgid "Request token URL"
+msgstr ""
+
+#: actions/showapplication.php:278
+msgid "Access token URL"
+msgstr ""
+
+#: actions/showapplication.php:283
+msgid "Authorize URL"
+msgstr ""
+
+#: actions/showapplication.php:288
+msgid ""
+"Note: We support HMAC-SHA1 signatures. We do not support the plaintext "
+"signature method."
+msgstr ""
+
+#: actions/showapplication.php:309
+msgid "Are you sure you want to reset your consumer key and secret?"
+msgstr ""
+
+#: actions/showfavorites.php:79
+#, php-format
+msgid "%1$s's favorite notices, page %2$d"
+msgstr ""
+
+#: actions/showfavorites.php:132
+msgid "Could not retrieve favorite notices."
+msgstr ""
+
+#: actions/showfavorites.php:171
+#, php-format
+msgid "Feed for favorites of %s (RSS 1.0)"
+msgstr ""
+
+#: actions/showfavorites.php:178
+#, php-format
+msgid "Feed for favorites of %s (RSS 2.0)"
+msgstr ""
+
+#: actions/showfavorites.php:185
+#, php-format
+msgid "Feed for favorites of %s (Atom)"
+msgstr ""
+
+#: actions/showfavorites.php:206
+msgid ""
+"You haven't chosen any favorite notices yet. Click the fave button on "
+"notices you like to bookmark them for later or shed a spotlight on them."
+msgstr ""
+
+#: actions/showfavorites.php:208
+#, php-format
+msgid ""
+"%s hasn't added any notices to his favorites yet. Post something interesting "
+"they would add to their favorites :)"
+msgstr ""
+
+#: actions/showfavorites.php:212
+#, php-format
+msgid ""
+"%s hasn't added any notices to his favorites yet. Why not [register an "
+"account](%%%%action.register%%%%) and then post something interesting they "
+"would add to their favorites :)"
+msgstr ""
+
+#: actions/showfavorites.php:243
+msgid "This is a way to share what you like."
+msgstr ""
+
+#: actions/showgroup.php:82 lib/groupnav.php:86
+#, php-format
+msgid "%s group"
+msgstr "strollad %s"
+
+#: actions/showgroup.php:84
+#, php-format
+msgid "%1$s group, page %2$d"
+msgstr ""
+
+#: actions/showgroup.php:226
+msgid "Group profile"
+msgstr "Profil ar strollad"
+
+#: actions/showgroup.php:271 actions/tagother.php:118
+#: actions/userauthorization.php:175 lib/userprofile.php:177
+msgid "URL"
+msgstr "URL"
+
+#: actions/showgroup.php:282 actions/tagother.php:128
+#: actions/userauthorization.php:187 lib/userprofile.php:194
+msgid "Note"
+msgstr "Notenn"
+
+#: actions/showgroup.php:292 lib/groupeditform.php:184
+msgid "Aliases"
+msgstr "Aliasoù"
+
+#: actions/showgroup.php:301
+msgid "Group actions"
+msgstr "Oberoù ar strollad"
+
+#: actions/showgroup.php:337
+#, php-format
+msgid "Notice feed for %s group (RSS 1.0)"
+msgstr ""
+
+#: actions/showgroup.php:343
+#, php-format
+msgid "Notice feed for %s group (RSS 2.0)"
+msgstr ""
+
+#: actions/showgroup.php:349
+#, php-format
+msgid "Notice feed for %s group (Atom)"
+msgstr ""
+
+#: actions/showgroup.php:354
+#, php-format
+msgid "FOAF for %s group"
+msgstr ""
+
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
+msgid "Members"
+msgstr "Izili"
+
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
+#: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
+msgid "(None)"
+msgstr "(hini ebet)"
+
+#: actions/showgroup.php:401
+msgid "All members"
+msgstr "An holl izili"
+
+#: actions/showgroup.php:441
+msgid "Created"
+msgstr "Krouet"
+
+#: actions/showgroup.php:457
+#, php-format
+msgid ""
+"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
+"wikipedia.org/wiki/Micro-blogging) service based on the Free Software "
+"[StatusNet](http://status.net/) tool. Its members share short messages about "
+"their life and interests. [Join now](%%%%action.register%%%%) to become part "
+"of this group and many more! ([Read more](%%%%doc.help%%%%))"
+msgstr ""
+
+#: actions/showgroup.php:463
+#, php-format
+msgid ""
+"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
+"wikipedia.org/wiki/Micro-blogging) service based on the Free Software "
+"[StatusNet](http://status.net/) tool. Its members share short messages about "
+"their life and interests. "
+msgstr ""
+
+#: actions/showgroup.php:491
+msgid "Admins"
+msgstr "Merourien"
+
+#: actions/showmessage.php:81
+msgid "No such message."
+msgstr "N'eus ket eus ar gemennadenn-se."
+
+#: actions/showmessage.php:98
+msgid "Only the sender and recipient may read this message."
+msgstr ""
+
+#: actions/showmessage.php:108
+#, php-format
+msgid "Message to %1$s on %2$s"
+msgstr ""
+
+#: actions/showmessage.php:113
+#, php-format
+msgid "Message from %1$s on %2$s"
+msgstr ""
+
+#: actions/shownotice.php:90
+msgid "Notice deleted."
+msgstr ""
+
+#: actions/showstream.php:73
+#, php-format
+msgid " tagged %s"
+msgstr " merket %s"
+
+#: actions/showstream.php:79
+#, php-format
+msgid "%1$s, page %2$d"
+msgstr ""
+
+#: actions/showstream.php:122
+#, php-format
+msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)"
+msgstr ""
+
+#: actions/showstream.php:129
+#, php-format
+msgid "Notice feed for %s (RSS 1.0)"
+msgstr ""
+
+#: actions/showstream.php:136
+#, php-format
+msgid "Notice feed for %s (RSS 2.0)"
+msgstr ""
+
+#: actions/showstream.php:143
+#, php-format
+msgid "Notice feed for %s (Atom)"
+msgstr ""
+
+#: actions/showstream.php:148
+#, php-format
+msgid "FOAF for %s"
+msgstr ""
+
+#: actions/showstream.php:200
+#, php-format
+msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet."
+msgstr ""
+
+#: actions/showstream.php:205
+msgid ""
+"Seen anything interesting recently? You haven't posted any notices yet, now "
+"would be a good time to start :)"
+msgstr ""
+
+#: actions/showstream.php:207
+#, php-format
+msgid ""
+"You can try to nudge %1$s or [post something to his or her attention](%%%%"
+"action.newnotice%%%%?status_textarea=%2$s)."
+msgstr ""
+
+#: actions/showstream.php:243
+#, php-format
+msgid ""
+"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en."
+"wikipedia.org/wiki/Micro-blogging) service based on the Free Software "
+"[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to "
+"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))"
+msgstr ""
+
+#: actions/showstream.php:248
+#, php-format
+msgid ""
+"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en."
+"wikipedia.org/wiki/Micro-blogging) service based on the Free Software "
+"[StatusNet](http://status.net/) tool. "
+msgstr ""
+
+#: actions/showstream.php:305
+#, php-format
+msgid "Repeat of %s"
+msgstr ""
+
+#: actions/silence.php:65 actions/unsilence.php:65
+msgid "You cannot silence users on this site."
+msgstr ""
+
+#: actions/silence.php:72
+msgid "User is already silenced."
+msgstr ""
+
+#: actions/siteadminpanel.php:69
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
+msgstr "Arventennoù design evit al lec'hienn StatusNet-mañ."
+
+#: actions/siteadminpanel.php:133
+msgid "Site name must have non-zero length."
+msgstr ""
+
+#: actions/siteadminpanel.php:141
+msgid "You must have a valid contact email address."
+msgstr ""
+
+#: actions/siteadminpanel.php:159
+#, php-format
+msgid "Unknown language \"%s\"."
+msgstr ""
+
+#: actions/siteadminpanel.php:165
+msgid "Minimum text limit is 140 characters."
+msgstr ""
+
+#: actions/siteadminpanel.php:171
+msgid "Dupe limit must 1 or more seconds."
+msgstr ""
+
+#: actions/siteadminpanel.php:221
+msgid "General"
+msgstr "Hollek"
+
+#: actions/siteadminpanel.php:224
+msgid "Site name"
+msgstr "Anv al lec'hienn"
+
+#: actions/siteadminpanel.php:225
+msgid "The name of your site, like \"Yourcompany Microblog\""
+msgstr ""
+
+#: actions/siteadminpanel.php:229
+msgid "Brought by"
+msgstr "Degaset gant"
+
+#: actions/siteadminpanel.php:230
+msgid "Text used for credits link in footer of each page"
+msgstr ""
+
+#: actions/siteadminpanel.php:234
+msgid "Brought by URL"
+msgstr ""
+
+#: actions/siteadminpanel.php:235
+msgid "URL used for credits link in footer of each page"
+msgstr ""
+
+#: actions/siteadminpanel.php:239
+msgid "Contact email address for your site"
+msgstr ""
+
+#: actions/siteadminpanel.php:245
+msgid "Local"
+msgstr "Lec'hel"
+
+#: actions/siteadminpanel.php:256
+msgid "Default timezone"
+msgstr ""
+
+#: actions/siteadminpanel.php:257
+msgid "Default timezone for the site; usually UTC."
+msgstr ""
+
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
+msgstr "Yezh d'ober ganti da gentañ"
+
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+
+#: actions/siteadminpanel.php:271
+msgid "Limits"
+msgstr "Bevennoù"
+
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
+msgstr ""
+
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
+msgstr ""
+
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
+msgstr ""
+
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Ali"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Kemennadenn nevez"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Diposubl eo enrollañ an titouroù stankañ."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Eilañ an ali"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Dilemel un ali"
+
+#: actions/smssettings.php:58
+msgid "SMS settings"
+msgstr "Arventennoù SMS"
+
+#: actions/smssettings.php:69
+#, php-format
+msgid "You can receive SMS messages through email from %%site.name%%."
+msgstr ""
+
+#: actions/smssettings.php:91
+msgid "SMS is not available."
+msgstr "Dizimplijadus eo an SMS."
+
+#: actions/smssettings.php:112
+msgid "Current confirmed SMS-enabled phone number."
+msgstr ""
+
+#: actions/smssettings.php:123
+msgid "Awaiting confirmation on this phone number."
+msgstr ""
+
+#: actions/smssettings.php:130
+msgid "Confirmation code"
+msgstr "Kod kadarnaat"
+
+#: actions/smssettings.php:131
+msgid "Enter the code you received on your phone."
+msgstr ""
+
+#: actions/smssettings.php:138
+msgid "SMS phone number"
+msgstr "Niverenn bellgomz evit an SMS"
+
+#: actions/smssettings.php:140
+msgid "Phone number, no punctuation or spaces, with area code"
+msgstr ""
+
+#: actions/smssettings.php:174
+msgid ""
+"Send me notices through SMS; I understand I may incur exorbitant charges "
+"from my carrier."
+msgstr ""
+
+#: actions/smssettings.php:306
+msgid "No phone number."
+msgstr "Niverenn bellgomz ebet."
+
+#: actions/smssettings.php:311
+msgid "No carrier selected."
+msgstr ""
+
+#: actions/smssettings.php:318
+msgid "That is already your phone number."
+msgstr ""
+
+#: actions/smssettings.php:321
+msgid "That phone number already belongs to another user."
+msgstr ""
+
+#: actions/smssettings.php:347
+msgid ""
+"A confirmation code was sent to the phone number you added. Check your phone "
+"for the code and instructions on how to use it."
+msgstr ""
+
+#: actions/smssettings.php:374
+msgid "That is the wrong confirmation number."
+msgstr ""
+
+#: actions/smssettings.php:405
+msgid "That is not your phone number."
+msgstr ""
+
+#: actions/smssettings.php:465
+msgid "Mobile carrier"
+msgstr ""
+
+#: actions/smssettings.php:469
+msgid "Select a carrier"
+msgstr ""
+
+#: actions/smssettings.php:476
+#, php-format
+msgid ""
+"Mobile carrier for your phone. If you know a carrier that accepts SMS over "
+"email but isn't listed here, send email to let us know at %s."
+msgstr ""
+
+#: actions/smssettings.php:498
+msgid "No code entered"
+msgstr "N'eo bet lakaet kod ebet"
+
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Stankter"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Enrollañ an arventennoù moned"
+
+#: actions/subedit.php:70
+msgid "You are not subscribed to that profile."
+msgstr ""
+
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
+msgid "Could not save subscription."
+msgstr ""
+
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr ""
+
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+
+#: actions/subscribe.php:145
+msgid "Subscribed"
+msgstr ""
+
+#: actions/subscribers.php:50
+#, php-format
+msgid "%s subscribers"
+msgstr ""
+
+#: actions/subscribers.php:52
+#, php-format
+msgid "%1$s subscribers, page %2$d"
+msgstr ""
+
+#: actions/subscribers.php:63
+msgid "These are the people who listen to your notices."
+msgstr ""
+
+#: actions/subscribers.php:67
+#, php-format
+msgid "These are the people who listen to %s's notices."
+msgstr ""
+
+#: actions/subscribers.php:108
+msgid ""
+"You have no subscribers. Try subscribing to people you know and they might "
+"return the favor"
+msgstr ""
+
+#: actions/subscribers.php:110
+#, php-format
+msgid "%s has no subscribers. Want to be the first?"
+msgstr ""
+
+#: actions/subscribers.php:114
+#, php-format
+msgid ""
+"%s has no subscribers. Why not [register an account](%%%%action.register%%%"
+"%) and be the first?"
+msgstr ""
+
+#: actions/subscriptions.php:52
+#, php-format
+msgid "%s subscriptions"
+msgstr ""
+
+#: actions/subscriptions.php:54
+#, php-format
+msgid "%1$s subscriptions, page %2$d"
+msgstr ""
+
+#: actions/subscriptions.php:65
+msgid "These are the people whose notices you listen to."
+msgstr ""
+
+#: actions/subscriptions.php:69
+#, php-format
+msgid "These are the people whose notices %s listens to."
+msgstr ""
+
+#: actions/subscriptions.php:126
+#, php-format
+msgid ""
+"You're not listening to anyone's notices right now, try subscribing to "
+"people you know. Try [people search](%%action.peoplesearch%%), look for "
+"members in groups you're interested in and in our [featured users](%%action."
+"featured%%). If you're a [Twitter user](%%action.twittersettings%%), you can "
+"automatically subscribe to people you already follow there."
+msgstr ""
+
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
+#, php-format
+msgid "%s is not listening to anyone."
+msgstr ""
+
+#: actions/subscriptions.php:199
+msgid "Jabber"
+msgstr "Jabber"
+
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
+msgid "SMS"
+msgstr "SMS"
+
+#: actions/tag.php:69
+#, php-format
+msgid "Notices tagged with %1$s, page %2$d"
+msgstr ""
+
+#: actions/tag.php:87
+#, php-format
+msgid "Notice feed for tag %s (RSS 1.0)"
+msgstr ""
+
+#: actions/tag.php:93
+#, php-format
+msgid "Notice feed for tag %s (RSS 2.0)"
+msgstr ""
+
+#: actions/tag.php:99
+#, php-format
+msgid "Notice feed for tag %s (Atom)"
+msgstr ""
+
+#: actions/tagother.php:39
+msgid "No ID argument."
+msgstr ""
+
+#: actions/tagother.php:65
+#, php-format
+msgid "Tag %s"
+msgstr ""
+
+#: actions/tagother.php:77 lib/userprofile.php:75
+msgid "User profile"
+msgstr ""
+
+#: actions/tagother.php:81 actions/userauthorization.php:132
+#: lib/userprofile.php:102
+msgid "Photo"
+msgstr "Skeudenn"
+
+#: actions/tagother.php:141
+msgid "Tag user"
+msgstr ""
+
+#: actions/tagother.php:151
+msgid ""
+"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
+"separated"
+msgstr ""
+
+#: actions/tagother.php:193
+msgid ""
+"You can only tag people you are subscribed to or who are subscribed to you."
+msgstr ""
+
+#: actions/tagother.php:200
+msgid "Could not save tags."
+msgstr ""
+
+#: actions/tagother.php:236
+msgid "Use this form to add tags to your subscribers or subscriptions."
+msgstr ""
+
+#: actions/tagrss.php:35
+msgid "No such tag."
+msgstr ""
+
+#: actions/twitapitrends.php:85
+msgid "API method under construction."
+msgstr ""
+
+#: actions/unblock.php:59
+msgid "You haven't blocked that user."
+msgstr ""
+
+#: actions/unsandbox.php:72
+msgid "User is not sandboxed."
+msgstr ""
+
+#: actions/unsilence.php:72
+msgid "User is not silenced."
+msgstr ""
+
+#: actions/unsubscribe.php:77
+msgid "No profile id in request."
+msgstr ""
+
+#: actions/unsubscribe.php:98
+msgid "Unsubscribed"
+msgstr ""
+
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
+#, php-format
+msgid ""
+"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgstr ""
+
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
+msgid "User"
+msgstr ""
+
+#: actions/useradminpanel.php:70
+msgid "User settings for this StatusNet site."
+msgstr ""
+
+#: actions/useradminpanel.php:149
+msgid "Invalid bio limit. Must be numeric."
+msgstr ""
+
+#: actions/useradminpanel.php:155
+msgid "Invalid welcome text. Max length is 255 characters."
+msgstr ""
+
+#: actions/useradminpanel.php:165
+#, php-format
+msgid "Invalid default subscripton: '%1$s' is not user."
+msgstr ""
+
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
+#: lib/personalgroupnav.php:109
+msgid "Profile"
+msgstr "Profil"
+
+#: actions/useradminpanel.php:222
+msgid "Bio Limit"
+msgstr "Bevenn ar bio"
+
+#: actions/useradminpanel.php:223
+msgid "Maximum length of a profile bio in characters."
+msgstr ""
+
+#: actions/useradminpanel.php:231
+msgid "New users"
+msgstr "Implijerien nevez"
+
+#: actions/useradminpanel.php:235
+msgid "New user welcome"
+msgstr "Degemer an implijerien nevez"
+
+#: actions/useradminpanel.php:236
+msgid "Welcome text for new users (Max 255 chars)."
+msgstr ""
+
+#: actions/useradminpanel.php:241
+msgid "Default subscription"
+msgstr ""
+
+#: actions/useradminpanel.php:242
+msgid "Automatically subscribe new users to this user."
+msgstr ""
+
+#: actions/useradminpanel.php:251
+msgid "Invitations"
+msgstr "Pedadennoù"
+
+#: actions/useradminpanel.php:256
+msgid "Invitations enabled"
+msgstr ""
+
+#: actions/useradminpanel.php:258
+msgid "Whether to allow users to invite new users."
+msgstr ""
+
+#: actions/userauthorization.php:105
+msgid "Authorize subscription"
+msgstr ""
+
+#: actions/userauthorization.php:110
+msgid ""
+"Please check these details to make sure that you want to subscribe to this "
+"user’s notices. If you didn’t just ask to subscribe to someone’s notices, "
+"click “Reject”."
+msgstr ""
+
+#: actions/userauthorization.php:196 actions/version.php:165
+msgid "License"
+msgstr "Aotre implijout"
+
+#: actions/userauthorization.php:217
+msgid "Accept"
+msgstr "Degemer"
+
+#: actions/userauthorization.php:218 lib/subscribeform.php:115
+#: lib/subscribeform.php:139
+msgid "Subscribe to this user"
+msgstr ""
+
+#: actions/userauthorization.php:219
+msgid "Reject"
+msgstr "Disteurel"
+
+#: actions/userauthorization.php:220
+msgid "Reject this subscription"
+msgstr ""
+
+#: actions/userauthorization.php:232
+msgid "No authorization request!"
+msgstr ""
+
+#: actions/userauthorization.php:254
+msgid "Subscription authorized"
+msgstr ""
+
+#: actions/userauthorization.php:256
+msgid ""
+"The subscription has been authorized, but no callback URL was passed. Check "
+"with the site’s instructions for details on how to authorize the "
+"subscription. Your subscription token is:"
+msgstr ""
+
+#: actions/userauthorization.php:266
+msgid "Subscription rejected"
+msgstr ""
+
+#: actions/userauthorization.php:268
+msgid ""
+"The subscription has been rejected, but no callback URL was passed. Check "
+"with the site’s instructions for details on how to fully reject the "
+"subscription."
+msgstr ""
+
+#: actions/userauthorization.php:303
+#, php-format
+msgid "Listener URI ‘%s’ not found here."
+msgstr ""
+
+#: actions/userauthorization.php:308
+#, php-format
+msgid "Listenee URI ‘%s’ is too long."
+msgstr ""
+
+#: actions/userauthorization.php:314
+#, php-format
+msgid "Listenee URI ‘%s’ is a local user."
+msgstr ""
+
+#: actions/userauthorization.php:329
+#, php-format
+msgid "Profile URL ‘%s’ is for a local user."
+msgstr ""
+
+#: actions/userauthorization.php:345
+#, php-format
+msgid "Avatar URL ‘%s’ is not valid."
+msgstr ""
+
+#: actions/userauthorization.php:350
+#, php-format
+msgid "Can’t read avatar URL ‘%s’."
+msgstr ""
+
+#: actions/userauthorization.php:355
+#, php-format
+msgid "Wrong image type for avatar URL ‘%s’."
+msgstr ""
+
+#: actions/userdesignsettings.php:76 lib/designsettings.php:65
+msgid "Profile design"
+msgstr ""
+
+#: actions/userdesignsettings.php:87 lib/designsettings.php:76
+msgid ""
+"Customize the way your profile looks with a background image and a colour "
+"palette of your choice."
+msgstr ""
+
+#: actions/userdesignsettings.php:282
+msgid "Enjoy your hotdog!"
+msgstr ""
+
+#: actions/usergroups.php:64
+#, php-format
+msgid "%1$s groups, page %2$d"
+msgstr ""
+
+#: actions/usergroups.php:130
+msgid "Search for more groups"
+msgstr "Klask muioc'h a strolladoù"
+
+#: actions/usergroups.php:157
+#, php-format
+msgid "%s is not a member of any group."
+msgstr ""
+
+#: actions/usergroups.php:162
+#, php-format
+msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
+msgstr ""
+
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Hizivadennoù eus %1$s e %2$s!"
+
+#: actions/version.php:73
+#, php-format
+msgid "StatusNet %s"
+msgstr "StatusNet %s"
+
+#: actions/version.php:153
+#, php-format
+msgid ""
+"This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, "
+"Inc. and contributors."
+msgstr ""
+
+#: actions/version.php:161
+msgid "Contributors"
+msgstr "Aozerien"
+
+#: actions/version.php:168
+msgid ""
+"StatusNet 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. "
+msgstr ""
+
+#: actions/version.php:174
+msgid ""
+"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. "
+msgstr ""
+
+#: actions/version.php:180
+#, php-format
+msgid ""
+"You should have received a copy of the GNU Affero General Public License "
+"along with this program.  If not, see %s."
+msgstr ""
+
+#: actions/version.php:189
+msgid "Plugins"
+msgstr "Pluginoù"
+
+#: actions/version.php:196 lib/action.php:767
+msgid "Version"
+msgstr "Stumm"
+
+#: actions/version.php:197
+msgid "Author(s)"
+msgstr "Aozer(ien)"
+
+#: classes/File.php:144
+#, php-format
+msgid ""
+"No file may be larger than %d bytes and the file you sent was %d bytes. Try "
+"to upload a smaller version."
+msgstr ""
+
+#: classes/File.php:154
+#, php-format
+msgid "A file this large would exceed your user quota of %d bytes."
+msgstr ""
+
+#: classes/File.php:161
+#, php-format
+msgid "A file this large would exceed your monthly quota of %d bytes."
+msgstr ""
+
+#: classes/Group_member.php:41
+msgid "Group join failed."
+msgstr "C'hwitet eo bet an enskrivadur d'ar strollad."
+
+#: classes/Group_member.php:53
+msgid "Not part of group."
+msgstr "N'eo ezel eus strollad ebet."
+
+#: classes/Group_member.php:60
+msgid "Group leave failed."
+msgstr "C'hwitet eo bet an disenskrivadur d'ar strollad."
+
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr ""
+
+#: classes/Login_token.php:76
+#, php-format
+msgid "Could not create login token for %s"
+msgstr ""
+
+#: classes/Message.php:45
+msgid "You are banned from sending direct messages."
+msgstr ""
+
+#: classes/Message.php:61
+msgid "Could not insert message."
+msgstr "Diposubl eo ensoc'hañ ur gemenadenn"
+
+#: classes/Message.php:71
+msgid "Could not update message with new URI."
+msgstr ""
+
+#: classes/Notice.php:172
+#, php-format
+msgid "DB error inserting hashtag: %s"
+msgstr ""
+
+#: classes/Notice.php:241
+msgid "Problem saving notice. Too long."
+msgstr ""
+
+#: classes/Notice.php:245
+msgid "Problem saving notice. Unknown user."
+msgstr ""
+
+#: classes/Notice.php:250
+msgid ""
+"Too many notices too fast; take a breather and post again in a few minutes."
+msgstr ""
+
+#: classes/Notice.php:256
+msgid ""
+"Too many duplicate messages too quickly; take a breather and post again in a "
+"few minutes."
+msgstr ""
+
+#: classes/Notice.php:262
+msgid "You are banned from posting notices on this site."
+msgstr ""
+
+#: classes/Notice.php:328 classes/Notice.php:354
+msgid "Problem saving notice."
+msgstr ""
+
+#: classes/Notice.php:927
+msgid "Problem saving group inbox."
+msgstr ""
+
+#: classes/Notice.php:1459
+#, php-format
+msgid "RT @%1$s %2$s"
+msgstr "RT @%1$s %2$s"
+
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr ""
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr ""
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr ""
+
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Diposubl eo dilemel ar postel kadarnadur."
+
+#: classes/Subscription.php:201 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr ""
+
+#: classes/User.php:373
+#, php-format
+msgid "Welcome to %1$s, @%2$s!"
+msgstr ""
+
+#: classes/User_group.php:477
+msgid "Could not create group."
+msgstr ""
+
+#: classes/User_group.php:486
+msgid "Could not set group URI."
+msgstr ""
+
+#: classes/User_group.php:507
+msgid "Could not set group membership."
+msgstr ""
+
+#: classes/User_group.php:521
+msgid "Could not save local group info."
+msgstr ""
+
+#: lib/accountsettingsaction.php:108
+msgid "Change your profile settings"
+msgstr ""
+
+#: lib/accountsettingsaction.php:112
+msgid "Upload an avatar"
+msgstr ""
+
+#: lib/accountsettingsaction.php:116
+msgid "Change your password"
+msgstr "Cheñch ar ger-tremen"
+
+#: lib/accountsettingsaction.php:120
+msgid "Change email handling"
+msgstr ""
+
+#: lib/accountsettingsaction.php:124
+msgid "Design your profile"
+msgstr ""
+
+#: lib/accountsettingsaction.php:128
+msgid "Other"
+msgstr "All"
+
+#: lib/accountsettingsaction.php:128
+msgid "Other options"
+msgstr ""
+
+#: lib/action.php:144
+#, php-format
+msgid "%1$s - %2$s"
+msgstr "%1$s - %2$s"
+
+#: lib/action.php:159
+msgid "Untitled page"
+msgstr ""
+
+#: lib/action.php:424
+msgid "Primary site navigation"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Personal"
+#: lib/action.php:430
+msgctxt "TOOLTIP"
+msgid "Personal profile and friends timeline"
+msgstr ""
+
+#: lib/action.php:433
+msgctxt "MENU"
+msgid "Personal"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:435
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:440
+msgctxt "TOOLTIP"
+msgid "Connect to services"
+msgstr ""
+
+#: lib/action.php:443
+msgid "Connect"
+msgstr "Kevreañ"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:446
+msgctxt "TOOLTIP"
+msgid "Change site configuration"
+msgstr ""
+
+#: lib/action.php:449
+msgctxt "MENU"
+msgid "Admin"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:453
+#, php-format
+msgctxt "TOOLTIP"
+msgid "Invite friends and colleagues to join you on %s"
+msgstr ""
+
+#: lib/action.php:456
+msgctxt "MENU"
+msgid "Invite"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:462
+msgctxt "TOOLTIP"
+msgid "Logout from the site"
+msgstr ""
+
+#: lib/action.php:465
+msgctxt "MENU"
+msgid "Logout"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:470
+msgctxt "TOOLTIP"
+msgid "Create an account"
+msgstr ""
+
+#: lib/action.php:473
+msgctxt "MENU"
+msgid "Register"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:476
+msgctxt "TOOLTIP"
+msgid "Login to the site"
+msgstr ""
+
+#: lib/action.php:479
+msgctxt "MENU"
+msgid "Login"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:482
+msgctxt "TOOLTIP"
+msgid "Help me!"
+msgstr ""
+
+#: lib/action.php:485
+msgctxt "MENU"
+msgid "Help"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:488
+msgctxt "TOOLTIP"
+msgid "Search for people or text"
+msgstr ""
+
+#: lib/action.php:491
+msgctxt "MENU"
+msgid "Search"
+msgstr ""
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
+msgid "Site notice"
+msgstr ""
+
+#: lib/action.php:579
+msgid "Local views"
+msgstr ""
+
+#: lib/action.php:645
+msgid "Page notice"
+msgstr ""
+
+#: lib/action.php:747
+msgid "Secondary site navigation"
+msgstr ""
+
+#: lib/action.php:752
+msgid "Help"
+msgstr "Skoazell"
+
+#: lib/action.php:754
+msgid "About"
+msgstr "Diwar-benn"
+
+#: lib/action.php:756
+msgid "FAQ"
+msgstr "FAG"
+
+#: lib/action.php:760
+msgid "TOS"
+msgstr ""
+
+#: lib/action.php:763
+msgid "Privacy"
+msgstr "Prevezded"
+
+#: lib/action.php:765
+msgid "Source"
+msgstr "Mammenn"
+
+#: lib/action.php:769
+msgid "Contact"
+msgstr "Darempred"
+
+#: lib/action.php:771
+msgid "Badge"
+msgstr ""
+
+#: lib/action.php:799
+msgid "StatusNet software license"
+msgstr ""
+
+#: lib/action.php:802
+#, php-format
+msgid ""
+"**%%site.name%%** is a microblogging service brought to you by [%%site."
+"broughtby%%](%%site.broughtbyurl%%). "
+msgstr ""
+
+#: lib/action.php:804
+#, php-format
+msgid "**%%site.name%%** is a microblogging service. "
+msgstr ""
+
+#: lib/action.php:806
+#, php-format
+msgid ""
+"It runs the [StatusNet](http://status.net/) microblogging software, version %"
+"s, available under the [GNU Affero General Public License](http://www.fsf."
+"org/licensing/licenses/agpl-3.0.html)."
+msgstr ""
+
+#: lib/action.php:821
+msgid "Site content license"
+msgstr ""
+
+#: lib/action.php:826
+#, php-format
+msgid "Content and data of %1$s are private and confidential."
+msgstr ""
+
+#: lib/action.php:831
+#, php-format
+msgid "Content and data copyright by %1$s. All rights reserved."
+msgstr ""
+
+#: lib/action.php:834
+msgid "Content and data copyright by contributors. All rights reserved."
+msgstr ""
+
+#: lib/action.php:847
+msgid "All "
+msgstr "Pep tra "
+
+#: lib/action.php:853
+msgid "license."
+msgstr "aotre implijout."
+
+#: lib/action.php:1152
+msgid "Pagination"
+msgstr "Pajennadur"
+
+#: lib/action.php:1161
+msgid "After"
+msgstr "War-lerc'h"
+
+#: lib/action.php:1169
+msgid "Before"
+msgstr "Kent"
+
+#: lib/activity.php:453
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:481
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:485
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
+msgid "You cannot make changes to this site."
+msgstr ""
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
+msgid "Changes to that panel are not allowed."
+msgstr ""
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:229
+msgid "showForm() not implemented."
+msgstr ""
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:259
+msgid "saveSettings() not implemented."
+msgstr ""
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:283
+msgid "Unable to delete design setting."
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:348
+msgid "Basic site configuration"
+msgstr ""
+
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:350
+msgctxt "MENU"
+msgid "Site"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:356
+msgid "Design configuration"
+msgstr ""
+
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:358
+msgctxt "MENU"
+msgid "Design"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:364
+msgid "User configuration"
+msgstr ""
+
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Implijer"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:372
+msgid "Access configuration"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:380
+msgid "Paths configuration"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:388
+msgid "Sessions configuration"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+#, fuzzy
+msgid "Edit site notice"
+msgstr "Eilañ an ali"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr ""
+
+#: lib/apiauth.php:94
+msgid "API resource requires read-write access, but you only have read access."
+msgstr ""
+
+#: lib/apiauth.php:272
+#, php-format
+msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
+msgstr ""
+
+#: lib/applicationeditform.php:136
+msgid "Edit application"
+msgstr "Kemmañ an arload"
+
+#: lib/applicationeditform.php:184
+msgid "Icon for this application"
+msgstr ""
+
+#: lib/applicationeditform.php:204
+#, php-format
+msgid "Describe your application in %d characters"
+msgstr ""
+
+#: lib/applicationeditform.php:207
+msgid "Describe your application"
+msgstr ""
+
+#: lib/applicationeditform.php:216
+msgid "Source URL"
+msgstr "Mammenn URL"
+
+#: lib/applicationeditform.php:218
+msgid "URL of the homepage of this application"
+msgstr ""
+
+#: lib/applicationeditform.php:224
+msgid "Organization responsible for this application"
+msgstr ""
+
+#: lib/applicationeditform.php:230
+msgid "URL for the homepage of the organization"
+msgstr ""
+
+#: lib/applicationeditform.php:236
+msgid "URL to redirect to after authentication"
+msgstr ""
+
+#: lib/applicationeditform.php:258
+msgid "Browser"
+msgstr "Merdeer"
+
+#: lib/applicationeditform.php:274
+msgid "Desktop"
+msgstr ""
+
+#: lib/applicationeditform.php:275
+msgid "Type of application, browser or desktop"
+msgstr ""
+
+#: lib/applicationeditform.php:297
+msgid "Read-only"
+msgstr ""
+
+#: lib/applicationeditform.php:315
+msgid "Read-write"
+msgstr ""
+
+#: lib/applicationeditform.php:316
+msgid "Default access for this application: read-only, or read-write"
+msgstr ""
+
+#: lib/applicationlist.php:154
+msgid "Revoke"
+msgstr ""
+
+#: lib/attachmentlist.php:87
+msgid "Attachments"
+msgstr ""
+
+#: lib/attachmentlist.php:265
+msgid "Author"
+msgstr "Aozer"
+
+#: lib/attachmentlist.php:278
+msgid "Provider"
+msgstr "Pourvezer"
+
+#: lib/attachmentnoticesection.php:67
+msgid "Notices where this attachment appears"
+msgstr ""
+
+#: lib/attachmenttagcloudsection.php:48
+msgid "Tags for this attachment"
+msgstr ""
+
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
+msgid "Password changing failed"
+msgstr ""
+
+#: lib/authenticationplugin.php:235
+msgid "Password changing is not allowed"
+msgstr ""
+
+#: lib/channel.php:138 lib/channel.php:158
+msgid "Command results"
+msgstr ""
+
+#: lib/channel.php:210 lib/mailhandler.php:142
+msgid "Command complete"
+msgstr ""
+
+#: lib/channel.php:221
+msgid "Command failed"
+msgstr ""
+
+#: lib/command.php:44
+msgid "Sorry, this command is not yet implemented."
+msgstr ""
+
+#: lib/command.php:88
+#, php-format
+msgid "Could not find a user with nickname %s"
+msgstr ""
+
+#: lib/command.php:92
+msgid "It does not make a lot of sense to nudge yourself!"
+msgstr ""
+
+#: lib/command.php:99
+#, php-format
+msgid "Nudge sent to %s"
+msgstr ""
+
+#: lib/command.php:126
+#, php-format
+msgid ""
+"Subscriptions: %1$s\n"
+"Subscribers: %2$s\n"
+"Notices: %3$s"
+msgstr ""
+
+#: lib/command.php:152 lib/command.php:390 lib/command.php:451
+msgid "Notice with that id does not exist"
+msgstr ""
+
+#: lib/command.php:168 lib/command.php:406 lib/command.php:467
+#: lib/command.php:523
+msgid "User has no last notice"
+msgstr ""
+
+#: lib/command.php:190
+msgid "Notice marked as fave."
+msgstr ""
+
+#: lib/command.php:217
+msgid "You are already a member of that group"
+msgstr ""
+
+#: lib/command.php:231
+#, php-format
+msgid "Could not join user %s to group %s"
+msgstr ""
+
+#: lib/command.php:236
+#, php-format
+msgid "%s joined group %s"
+msgstr "%s zo emezelet er strollad %s"
+
+#: lib/command.php:275
+#, php-format
+msgid "Could not remove user %s to group %s"
+msgstr ""
+
+#: lib/command.php:280
+#, php-format
+msgid "%s left group %s"
+msgstr "%s {{Gender:.|en|he}} deus kuitaet ar strollad %s"
+
+#: lib/command.php:309
+#, php-format
+msgid "Fullname: %s"
+msgstr "Anv klok : %s"
+
+#: lib/command.php:312 lib/mail.php:258
+#, php-format
+msgid "Location: %s"
+msgstr ""
+
+#: lib/command.php:315 lib/mail.php:260
+#, php-format
+msgid "Homepage: %s"
+msgstr ""
+
+#: lib/command.php:318
+#, php-format
+msgid "About: %s"
+msgstr "Diwar-benn : %s"
+
+#: lib/command.php:349
+#, php-format
+msgid "Message too long - maximum is %d characters, you sent %d"
+msgstr ""
+
+#: lib/command.php:367
+#, php-format
+msgid "Direct message to %s sent"
+msgstr ""
+
+#: lib/command.php:369
+msgid "Error sending direct message."
+msgstr ""
+
+#: lib/command.php:413
+msgid "Cannot repeat your own notice"
+msgstr ""
+
+#: lib/command.php:418
+msgid "Already repeated that notice"
+msgstr ""
+
+#: lib/command.php:426
+#, php-format
+msgid "Notice from %s repeated"
+msgstr ""
+
+#: lib/command.php:428
+msgid "Error repeating notice."
+msgstr ""
+
+#: lib/command.php:482
+#, php-format
+msgid "Notice too long - maximum is %d characters, you sent %d"
+msgstr ""
+
+#: lib/command.php:491
+#, php-format
+msgid "Reply to %s sent"
+msgstr ""
+
+#: lib/command.php:493
+msgid "Error saving notice."
+msgstr ""
+
+#: lib/command.php:547
+msgid "Specify the name of the user to subscribe to"
+msgstr ""
+
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr ""
+
+#: lib/command.php:561
+#, php-format
+msgid "Subscribed to %s"
+msgstr ""
+
+#: lib/command.php:582 lib/command.php:685
+msgid "Specify the name of the user to unsubscribe from"
+msgstr ""
+
+#: lib/command.php:595
+#, php-format
+msgid "Unsubscribed from %s"
+msgstr ""
+
+#: lib/command.php:613 lib/command.php:636
+msgid "Command not yet implemented."
+msgstr ""
+
+#: lib/command.php:616
+msgid "Notification off."
+msgstr ""
+
+#: lib/command.php:618
+msgid "Can't turn off notification."
+msgstr ""
+
+#: lib/command.php:639
+msgid "Notification on."
+msgstr ""
+
+#: lib/command.php:641
+msgid "Can't turn on notification."
+msgstr ""
+
+#: lib/command.php:654
+msgid "Login command is disabled"
+msgstr ""
+
+#: lib/command.php:665
+#, php-format
+msgid "This link is useable only once, and is good for only 2 minutes: %s"
+msgstr ""
+
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr ""
+
+#: lib/command.php:709
+msgid "You are not subscribed to anyone."
+msgstr ""
+
+#: lib/command.php:711
+#, fuzzy
+msgid "You are subscribed to this person:"
+msgid_plural "You are subscribed to these people:"
+msgstr[0] "You are subscribed to this person:"
+msgstr[1] "You are subscribed to these people:"
+
+#: lib/command.php:731
+msgid "No one is subscribed to you."
+msgstr ""
+
+#: lib/command.php:733
+#, fuzzy
+msgid "This person is subscribed to you:"
+msgid_plural "These people are subscribed to you:"
+msgstr[0] "This person is subscribed to you:"
+msgstr[1] "These people are subscribed to you:"
+
+#: lib/command.php:753
+msgid "You are not a member of any groups."
+msgstr ""
+
+#: lib/command.php:755
+#, fuzzy
+msgid "You are a member of this group:"
+msgid_plural "You are a member of these groups:"
+msgstr[0] "You are a member of this group:"
+msgstr[1] "You are a member of these groups:"
+
+#: lib/command.php:769
+msgid ""
+"Commands:\n"
+"on - turn on notifications\n"
+"off - turn off notifications\n"
+"help - show this help\n"
+"follow <nickname> - subscribe to user\n"
+"groups - lists the groups you have joined\n"
+"subscriptions - list the people you follow\n"
+"subscribers - list the people that follow you\n"
+"leave <nickname> - unsubscribe from user\n"
+"d <nickname> <text> - direct message to user\n"
+"get <nickname> - get last notice from user\n"
+"whois <nickname> - get profile info on user\n"
+"lose <nickname> - force user to stop following you\n"
+"fav <nickname> - add user's last notice as a 'fave'\n"
+"fav #<notice_id> - add notice with the given id as a 'fave'\n"
+"repeat #<notice_id> - repeat a notice with a given id\n"
+"repeat <nickname> - repeat the last notice from user\n"
+"reply #<notice_id> - reply to notice with a given id\n"
+"reply <nickname> - reply to the last notice from user\n"
+"join <group> - join group\n"
+"login - Get a link to login to the web interface\n"
+"drop <group> - leave group\n"
+"stats - get your stats\n"
+"stop - same as 'off'\n"
+"quit - same as 'off'\n"
+"sub <nickname> - same as 'follow'\n"
+"unsub <nickname> - same as 'leave'\n"
+"last <nickname> - same as 'get'\n"
+"on <nickname> - not yet implemented.\n"
+"off <nickname> - not yet implemented.\n"
+"nudge <nickname> - remind a user to update.\n"
+"invite <phone number> - not yet implemented.\n"
+"track <word> - not yet implemented.\n"
+"untrack <word> - not yet implemented.\n"
+"track off - not yet implemented.\n"
+"untrack all - not yet implemented.\n"
+"tracks - not yet implemented.\n"
+"tracking - not yet implemented.\n"
+msgstr ""
+
+#: lib/common.php:148
+msgid "No configuration file found. "
+msgstr ""
+
+#: lib/common.php:149
+msgid "I looked for configuration files in the following places: "
+msgstr ""
+
+#: lib/common.php:151
+msgid "You may wish to run the installer to fix this."
+msgstr ""
+
+#: lib/common.php:152
+msgid "Go to the installer."
+msgstr ""
+
+#: lib/connectsettingsaction.php:110
+msgid "IM"
+msgstr "IM"
+
+#: lib/connectsettingsaction.php:111
+msgid "Updates by instant messenger (IM)"
+msgstr ""
+
+#: lib/connectsettingsaction.php:116
+msgid "Updates by SMS"
+msgstr ""
+
+#: lib/connectsettingsaction.php:120
+msgid "Connections"
+msgstr ""
+
+#: lib/connectsettingsaction.php:121
+msgid "Authorized connected applications"
+msgstr ""
+
+#: lib/dberroraction.php:60
+msgid "Database error"
+msgstr ""
+
+#: lib/designsettings.php:105
+msgid "Upload file"
+msgstr ""
+
+#: lib/designsettings.php:109
+msgid ""
+"You can upload your personal background image. The maximum file size is 2MB."
+msgstr ""
+
+#: lib/designsettings.php:418
+msgid "Design defaults restored."
+msgstr ""
+
+#: lib/disfavorform.php:114 lib/disfavorform.php:140
+msgid "Disfavor this notice"
+msgstr ""
+
+#: lib/favorform.php:114 lib/favorform.php:140
+msgid "Favor this notice"
+msgstr ""
+
+#: lib/favorform.php:140
+msgid "Favor"
+msgstr ""
+
+#: lib/feed.php:85
+msgid "RSS 1.0"
+msgstr "RSS 1.0"
+
+#: lib/feed.php:87
+msgid "RSS 2.0"
+msgstr "RSS 2.0"
+
+#: lib/feed.php:89
+msgid "Atom"
+msgstr "Atom"
+
+#: lib/feed.php:91
+msgid "FOAF"
+msgstr "Mignon ur mignon (FOAF)"
+
+#: lib/feedlist.php:64
+msgid "Export data"
+msgstr ""
+
+#: lib/galleryaction.php:121
+msgid "Filter tags"
+msgstr "Silañ ar balizennoù"
+
+#: lib/galleryaction.php:131
+msgid "All"
+msgstr "An holl"
+
+#: lib/galleryaction.php:139
+msgid "Select tag to filter"
+msgstr ""
+
+#: lib/galleryaction.php:140
+msgid "Tag"
+msgstr "Merk"
+
+#: lib/galleryaction.php:141
+msgid "Choose a tag to narrow list"
+msgstr ""
+
+#: lib/galleryaction.php:143
+msgid "Go"
+msgstr "Mont"
+
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
+#: lib/groupeditform.php:163
+msgid "URL of the homepage or blog of the group or topic"
+msgstr ""
+
+#: lib/groupeditform.php:168
+msgid "Describe the group or topic"
+msgstr ""
+
+#: lib/groupeditform.php:170
+#, php-format
+msgid "Describe the group or topic in %d characters"
+msgstr ""
+
+#: lib/groupeditform.php:179
+msgid ""
+"Location for the group, if any, like \"City, State (or Region), Country\""
+msgstr ""
+
+#: lib/groupeditform.php:187
+#, php-format
+msgid "Extra nicknames for the group, comma- or space- separated, max %d"
+msgstr ""
+
+#: lib/groupnav.php:85
+msgid "Group"
+msgstr "Strollad"
+
+#: lib/groupnav.php:101
+msgid "Blocked"
+msgstr "Stanket"
+
+#: lib/groupnav.php:102
+#, php-format
+msgid "%s blocked users"
+msgstr "%s implijer stanket"
+
+#: lib/groupnav.php:108
+#, php-format
+msgid "Edit %s group properties"
+msgstr ""
+
+#: lib/groupnav.php:113
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/groupnav.php:114
+#, php-format
+msgid "Add or edit %s logo"
+msgstr ""
+
+#: lib/groupnav.php:120
+#, php-format
+msgid "Add or edit %s design"
+msgstr ""
+
+#: lib/groupsbymemberssection.php:71
+msgid "Groups with most members"
+msgstr ""
+
+#: lib/groupsbypostssection.php:71
+msgid "Groups with most posts"
+msgstr ""
+
+#: lib/grouptagcloudsection.php:56
+#, php-format
+msgid "Tags in %s group's notices"
+msgstr ""
+
+#: lib/htmloutputter.php:103
+msgid "This page is not available in a media type you accept"
+msgstr ""
+
+#: lib/imagefile.php:75
+#, php-format
+msgid "That file is too big. The maximum file size is %s."
+msgstr ""
+
+#: lib/imagefile.php:80
+msgid "Partial upload."
+msgstr ""
+
+#: lib/imagefile.php:88 lib/mediafile.php:170
+msgid "System error uploading file."
+msgstr ""
+
+#: lib/imagefile.php:96
+msgid "Not an image or corrupt file."
+msgstr ""
+
+#: lib/imagefile.php:109
+msgid "Unsupported image file format."
+msgstr ""
+
+#: lib/imagefile.php:122
+msgid "Lost our file."
+msgstr ""
+
+#: lib/imagefile.php:166 lib/imagefile.php:231
+msgid "Unknown file type"
+msgstr ""
+
+#: lib/imagefile.php:251
+msgid "MB"
+msgstr "Mo"
+
+#: lib/imagefile.php:253
+msgid "kB"
+msgstr "Ko"
+
+#: lib/jabber.php:220
+#, php-format
+msgid "[%s]"
+msgstr "[%s]"
+
+#: lib/jabber.php:400
+#, php-format
+msgid "Unknown inbox source %d."
+msgstr ""
+
+#: lib/joinform.php:114
+msgid "Join"
+msgstr "Stagañ"
+
+#: lib/leaveform.php:114
+msgid "Leave"
+msgstr "Kuitañ"
+
+#: lib/logingroupnav.php:80
+msgid "Login with a username and password"
+msgstr ""
+
+#: lib/logingroupnav.php:86
+msgid "Sign up for a new account"
+msgstr ""
+
+#: lib/mail.php:173
+msgid "Email address confirmation"
+msgstr ""
+
+#: lib/mail.php:175
+#, php-format
+msgid ""
+"Hey, %s.\n"
+"\n"
+"Someone just entered this email address on %s.\n"
+"\n"
+"If it was you, and you want to confirm your entry, use the URL below:\n"
+"\n"
+"\t%s\n"
+"\n"
+"If not, just ignore this message.\n"
+"\n"
+"Thanks for your time, \n"
+"%s\n"
+msgstr ""
+
+#: lib/mail.php:240
+#, php-format
+msgid "%1$s is now listening to your notices on %2$s."
+msgstr ""
+
+#: lib/mail.php:245
+#, php-format
+msgid ""
+"%1$s is now listening to your notices on %2$s.\n"
+"\n"
+"\t%3$s\n"
+"\n"
+"%4$s%5$s%6$s\n"
+"Faithfully yours,\n"
+"%7$s.\n"
+"\n"
+"----\n"
+"Change your email address or notification options at %8$s\n"
+msgstr ""
+
+#: lib/mail.php:262
+#, php-format
+msgid "Bio: %s"
+msgstr ""
+
+#: lib/mail.php:290
+#, php-format
+msgid "New email address for posting to %s"
+msgstr ""
+
+#: lib/mail.php:293
+#, php-format
+msgid ""
+"You have a new posting address on %1$s.\n"
+"\n"
+"Send email to %2$s to post new messages.\n"
+"\n"
+"More email instructions at %3$s.\n"
+"\n"
+"Faithfully yours,\n"
+"%4$s"
+msgstr ""
+
+#: lib/mail.php:417
+#, php-format
+msgid "%s status"
+msgstr "Statud %s"
+
+#: lib/mail.php:443
+msgid "SMS confirmation"
+msgstr ""
+
+#: lib/mail.php:467
+#, php-format
+msgid "You've been nudged by %s"
+msgstr ""
+
+#: lib/mail.php:471
+#, php-format
+msgid ""
+"%1$s (%2$s) is wondering what you are up to these days and is inviting you "
+"to post some news.\n"
+"\n"
+"So let's hear from you :)\n"
+"\n"
+"%3$s\n"
+"\n"
+"Don't reply to this email; it won't get to them.\n"
+"\n"
+"With kind regards,\n"
+"%4$s\n"
+msgstr ""
+
+#: lib/mail.php:517
+#, php-format
+msgid "New private message from %s"
+msgstr "Kemenadenn personel nevez a-berzh %s"
+
+#: lib/mail.php:521
+#, php-format
+msgid ""
+"%1$s (%2$s) sent you a private message:\n"
+"\n"
+"------------------------------------------------------\n"
+"%3$s\n"
+"------------------------------------------------------\n"
+"\n"
+"You can reply to their message here:\n"
+"\n"
+"%4$s\n"
+"\n"
+"Don't reply to this email; it won't get to them.\n"
+"\n"
+"With kind regards,\n"
+"%5$s\n"
+msgstr ""
+
+#: lib/mail.php:568
+#, php-format
+msgid "%s (@%s) added your notice as a favorite"
+msgstr ""
+
+#: lib/mail.php:570
+#, php-format
+msgid ""
+"%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
+"\n"
+"The URL of your notice is:\n"
+"\n"
+"%3$s\n"
+"\n"
+"The text of your notice is:\n"
+"\n"
+"%4$s\n"
+"\n"
+"You can see the list of %1$s's favorites here:\n"
+"\n"
+"%5$s\n"
+"\n"
+"Faithfully yours,\n"
+"%6$s\n"
+msgstr ""
+
+#: lib/mail.php:635
+#, php-format
+msgid "%s (@%s) sent a notice to your attention"
+msgstr ""
+
+#: lib/mail.php:637
+#, php-format
+msgid ""
+"%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
+"\n"
+"The notice is here:\n"
+"\n"
+"\t%3$s\n"
+"\n"
+"It reads:\n"
+"\n"
+"\t%4$s\n"
+"\n"
+msgstr ""
+
+#: lib/mailbox.php:89
+msgid "Only the user can read their own mailboxes."
+msgstr ""
+
+#: lib/mailbox.php:139
+msgid ""
+"You have no private messages. You can send private message to engage other "
+"users in conversation. People can send you messages for your eyes only."
+msgstr ""
+
+#: lib/mailbox.php:227 lib/noticelist.php:482
+msgid "from"
+msgstr "eus"
+
+#: lib/mailhandler.php:37
+msgid "Could not parse message."
+msgstr ""
+
+#: lib/mailhandler.php:42
+msgid "Not a registered user."
+msgstr ""
+
+#: lib/mailhandler.php:46
+msgid "Sorry, that is not your incoming email address."
+msgstr ""
+
+#: lib/mailhandler.php:50
+msgid "Sorry, no incoming email allowed."
+msgstr ""
+
+#: lib/mailhandler.php:228
+#, php-format
+msgid "Unsupported message type: %s"
+msgstr ""
+
+#: lib/mediafile.php:98 lib/mediafile.php:123
+msgid "There was a database error while saving your file. Please try again."
+msgstr ""
+
+#: lib/mediafile.php:142
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
+msgstr ""
+
+#: lib/mediafile.php:147
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form."
+msgstr ""
+
+#: lib/mediafile.php:152
+msgid "The uploaded file was only partially uploaded."
+msgstr ""
+
+#: lib/mediafile.php:159
+msgid "Missing a temporary folder."
+msgstr ""
+
+#: lib/mediafile.php:162
+msgid "Failed to write file to disk."
+msgstr ""
+
+#: lib/mediafile.php:165
+msgid "File upload stopped by extension."
+msgstr ""
+
+#: lib/mediafile.php:179 lib/mediafile.php:216
+msgid "File exceeds user's quota."
+msgstr ""
+
+#: lib/mediafile.php:196 lib/mediafile.php:233
+msgid "File could not be moved to destination directory."
+msgstr ""
+
+#: lib/mediafile.php:201 lib/mediafile.php:237
+msgid "Could not determine file's MIME type."
+msgstr ""
+
+#: lib/mediafile.php:270
+#, php-format
+msgid " Try using another %s format."
+msgstr ""
+
+#: lib/mediafile.php:275
+#, php-format
+msgid "%s is not a supported file type on this server."
+msgstr ""
+
+#: lib/messageform.php:120
+msgid "Send a direct notice"
+msgstr ""
+
+#: lib/messageform.php:146
+msgid "To"
+msgstr "Da"
+
+#: lib/messageform.php:159 lib/noticeform.php:185
+msgid "Available characters"
+msgstr ""
+
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr ""
+
+#: lib/noticeform.php:160
+msgid "Send a notice"
+msgstr "Kas un ali"
+
+#: lib/noticeform.php:173
+#, php-format
+msgid "What's up, %s?"
+msgstr "Penaos 'mañ kont, %s ?"
+
+#: lib/noticeform.php:192
+msgid "Attach"
+msgstr "Stagañ"
+
+#: lib/noticeform.php:196
+msgid "Attach a file"
+msgstr "Stagañ ur restr"
+
+#: lib/noticeform.php:212
+msgid "Share my location"
+msgstr ""
+
+#: lib/noticeform.php:215
+msgid "Do not share my location"
+msgstr ""
+
+#: lib/noticeform.php:216
+msgid ""
+"Sorry, retrieving your geo location is taking longer than expected, please "
+"try again later"
+msgstr ""
+
+#: lib/noticelist.php:429
+#, php-format
+msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
+msgstr ""
+
+#: lib/noticelist.php:430
+msgid "N"
+msgstr "N"
+
+#: lib/noticelist.php:430
+msgid "S"
+msgstr "S"
+
+#: lib/noticelist.php:431
+msgid "E"
+msgstr "R"
+
+#: lib/noticelist.php:431
+msgid "W"
+msgstr "K"
+
+#: lib/noticelist.php:438
+msgid "at"
+msgstr "e"
+
+#: lib/noticelist.php:566
+msgid "in context"
+msgstr ""
+
+#: lib/noticelist.php:601
+msgid "Repeated by"
+msgstr ""
+
+#: lib/noticelist.php:628
+msgid "Reply to this notice"
+msgstr ""
+
+#: lib/noticelist.php:629
+msgid "Reply"
+msgstr "Respont"
+
+#: lib/noticelist.php:673
+msgid "Notice repeated"
+msgstr ""
+
+#: lib/nudgeform.php:116
+msgid "Nudge this user"
+msgstr "Kas ur blinkadenn d'an implijer-mañ"
+
+#: lib/nudgeform.php:128
+msgid "Nudge"
+msgstr "Blinkadenn"
+
+#: lib/nudgeform.php:128
+msgid "Send a nudge to this user"
+msgstr "Kas ur blinkadenn d'an implijer-mañ"
+
+#: lib/oauthstore.php:283
+msgid "Error inserting new profile"
+msgstr ""
+
+#: lib/oauthstore.php:291
+msgid "Error inserting avatar"
+msgstr ""
+
+#: lib/oauthstore.php:311
+msgid "Error inserting remote profile"
+msgstr ""
+
+#: lib/oauthstore.php:345
+msgid "Duplicate notice"
+msgstr "Eilañ an ali"
+
+#: lib/oauthstore.php:490
+msgid "Couldn't insert new subscription."
+msgstr ""
+
+#: lib/personalgroupnav.php:99
+msgid "Personal"
+msgstr "Hiniennel"
+
+#: lib/personalgroupnav.php:104
+msgid "Replies"
+msgstr "Respontoù"
+
+#: lib/personalgroupnav.php:114
+msgid "Favorites"
+msgstr "Pennrolloù"
+
+#: lib/personalgroupnav.php:125
+msgid "Inbox"
+msgstr "Boest resev"
+
+#: lib/personalgroupnav.php:126
+msgid "Your incoming messages"
+msgstr "ar gemennadennoù o peus resevet"
+
+#: lib/personalgroupnav.php:130
+msgid "Outbox"
+msgstr "Boest kas"
+
+#: lib/personalgroupnav.php:131
+msgid "Your sent messages"
+msgstr "Ar c'hemenadennoù kaset ganeoc'h"
+
+#: lib/personaltagcloudsection.php:56
+#, php-format
+msgid "Tags in %s's notices"
+msgstr ""
+
+#: lib/plugin.php:114
+msgid "Unknown"
+msgstr "Dianav"
+
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
+msgid "Subscriptions"
+msgstr "Koumanantoù"
+
+#: lib/profileaction.php:126
+msgid "All subscriptions"
+msgstr ""
+
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
+msgid "Subscribers"
+msgstr "Ar re koumanantet"
+
+#: lib/profileaction.php:159
+msgid "All subscribers"
+msgstr "An holl re koumanantet"
+
+#: lib/profileaction.php:180
+msgid "User ID"
+msgstr "ID an implijer"
+
+#: lib/profileaction.php:185
+msgid "Member since"
+msgstr "Ezel abaoe"
+
+#: lib/profileaction.php:247
+msgid "All groups"
+msgstr "An holl strolladoù"
+
+#: lib/profileformaction.php:123
+msgid "No return-to arguments."
+msgstr ""
+
+#: lib/profileformaction.php:137
+msgid "Unimplemented method."
+msgstr ""
+
+#: lib/publicgroupnav.php:78
+msgid "Public"
+msgstr "Foran"
+
+#: lib/publicgroupnav.php:82
+msgid "User groups"
+msgstr "Strolladoù implijerien"
+
+#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85
+msgid "Recent tags"
+msgstr ""
+
+#: lib/publicgroupnav.php:88
+msgid "Featured"
+msgstr ""
+
+#: lib/publicgroupnav.php:92
+msgid "Popular"
+msgstr "Poblek"
+
+#: lib/repeatform.php:107
+msgid "Repeat this notice?"
+msgstr "Adkregiñ gant an ali-mañ ?"
+
+#: lib/repeatform.php:132
+msgid "Repeat this notice"
+msgstr "Adkregiñ gant an ali-mañ"
+
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Stankañ an implijer-mañ eus ar strollad-se"
+
+#: lib/router.php:671
+msgid "No single user defined for single-user mode."
+msgstr ""
+
+#: lib/sandboxform.php:67
+msgid "Sandbox"
+msgstr "Poull-traezh"
+
+#: lib/sandboxform.php:78
+msgid "Sandbox this user"
+msgstr ""
+
+#: lib/searchaction.php:120
+msgid "Search site"
+msgstr "Klask el lec'hienn"
+
+#: lib/searchaction.php:126
+msgid "Keyword(s)"
+msgstr "Ger(ioù) alc'hwez"
+
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Klask"
+
+#: lib/searchaction.php:162
+msgid "Search help"
+msgstr "Skoazell diwar-benn ar c'hlask"
+
+#: lib/searchgroupnav.php:80
+msgid "People"
+msgstr "Tud"
+
+#: lib/searchgroupnav.php:81
+msgid "Find people on this site"
+msgstr "Klask tud el lec'hienn-mañ"
+
+#: lib/searchgroupnav.php:83
+msgid "Find content of notices"
+msgstr "Klask alioù en danvez"
+
+#: lib/searchgroupnav.php:85
+msgid "Find groups on this site"
+msgstr "Klask strolladoù el lec'hienn-mañ"
+
+#: lib/section.php:89
+msgid "Untitled section"
+msgstr ""
+
+#: lib/section.php:106
+msgid "More..."
+msgstr "Muioc'h..."
+
+#: lib/silenceform.php:67
+msgid "Silence"
+msgstr "Didrouz"
+
+#: lib/silenceform.php:78
+msgid "Silence this user"
+msgstr ""
+
+#: lib/subgroupnav.php:83
+#, php-format
+msgid "People %s subscribes to"
+msgstr ""
+
+#: lib/subgroupnav.php:91
+#, php-format
+msgid "People subscribed to %s"
+msgstr ""
+
+#: lib/subgroupnav.php:99
+#, php-format
+msgid "Groups %s is a member of"
+msgstr ""
+
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Pediñ"
+
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr ""
+
+#: lib/subscriberspeopleselftagcloudsection.php:48
+#: lib/subscriptionspeopleselftagcloudsection.php:48
+msgid "People Tagcloud as self-tagged"
+msgstr ""
+
+#: lib/subscriberspeopletagcloudsection.php:48
+#: lib/subscriptionspeopletagcloudsection.php:48
+msgid "People Tagcloud as tagged"
+msgstr ""
+
+#: lib/tagcloudsection.php:56
+msgid "None"
+msgstr "Hini ebet"
+
+#: lib/topposterssection.php:74
+msgid "Top posters"
+msgstr ""
+
+#: lib/unsandboxform.php:69
+msgid "Unsandbox"
+msgstr ""
+
+#: lib/unsandboxform.php:80
+msgid "Unsandbox this user"
+msgstr ""
+
+#: lib/unsilenceform.php:67
+msgid "Unsilence"
+msgstr ""
+
+#: lib/unsilenceform.php:78
+msgid "Unsilence this user"
+msgstr ""
+
+#: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137
+msgid "Unsubscribe from this user"
+msgstr ""
+
+#: lib/unsubscribeform.php:137
+msgid "Unsubscribe"
+msgstr ""
+
+#: lib/userprofile.php:116
+msgid "Edit Avatar"
+msgstr "Kemmañ an Avatar"
+
+#: lib/userprofile.php:236
+msgid "User actions"
+msgstr "Obererezh an implijer"
+
+#: lib/userprofile.php:251
+msgid "Edit profile settings"
+msgstr ""
+
+#: lib/userprofile.php:252
+msgid "Edit"
+msgstr "Aozañ"
+
+#: lib/userprofile.php:275
+msgid "Send a direct message to this user"
+msgstr "Kas ur gemennadenn war-eeun d'an implijer-mañ"
+
+#: lib/userprofile.php:276
+msgid "Message"
+msgstr "Kemennadenn"
+
+#: lib/userprofile.php:314
+msgid "Moderate"
+msgstr "Habaskaat"
+
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Strolladoù implijerien"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Merourien"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Habaskaat"
+
+#: lib/util.php:1015
+msgid "a few seconds ago"
+msgstr "un nebeud eilennoù zo"
+
+#: lib/util.php:1017
+msgid "about a minute ago"
+msgstr "1 vunutenn zo well-wazh"
+
+#: lib/util.php:1019
+#, php-format
+msgid "about %d minutes ago"
+msgstr "%d munutenn zo well-wazh"
+
+#: lib/util.php:1021
+msgid "about an hour ago"
+msgstr "1 eurvezh zo well-wazh"
+
+#: lib/util.php:1023
+#, php-format
+msgid "about %d hours ago"
+msgstr "%d eurvezh zo well-wazh"
+
+#: lib/util.php:1025
+msgid "about a day ago"
+msgstr "1 devezh zo well-wazh"
+
+#: lib/util.php:1027
+#, php-format
+msgid "about %d days ago"
+msgstr "%d devezh zo well-wazh"
+
+#: lib/util.php:1029
+msgid "about a month ago"
+msgstr "miz zo well-wazh"
+
+#: lib/util.php:1031
+#, php-format
+msgid "about %d months ago"
+msgstr "%d miz zo well-wazh"
+
+#: lib/util.php:1033
+msgid "about a year ago"
+msgstr "bloaz zo well-wazh"
+
+#: lib/webcolor.php:82
+#, php-format
+msgid "%s is not a valid color!"
+msgstr ""
+
+#: lib/webcolor.php:123
+#, php-format
+msgid "%s is not a valid color! Use 3 or 6 hex chars."
+msgstr ""
+
+#: lib/xmppmanager.php:402
+#, php-format
+msgid "Message too long - maximum is %1$d characters, you sent %2$d."
+msgstr ""
+"Re hir eo ar gemennadenn - ar ment brasañ a zo %1$d arouezenn, %2$d "
+"arouezenn o peus lakaet."
index 8b12f44a94181b556cf327f54d2c8a68da275411..bd7c5cd5a84fb0aa5d2686c6caeed57f51ca95c4 100644 (file)
@@ -10,19 +10,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:15+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:29+0000\n"
 "Language-Team: Catalan\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ca\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Accés"
 
@@ -108,7 +109,7 @@ msgstr "No existeix la pàgina."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -124,7 +125,7 @@ msgstr "%s perfils blocats, pàgina %d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -181,7 +182,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Un mateix i amics"
 
@@ -208,11 +209,11 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "No s'ha trobat el mètode API!"
@@ -586,7 +587,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Compte"
 
@@ -677,18 +678,6 @@ msgstr "%s / Preferits de %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s actualitzacions favorites per %s / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s línia temporal"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Actualitzacions de %1$s a %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -699,12 +688,12 @@ msgstr "%1$s / Notificacions contestant a %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s notificacions que responen a notificacions de %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s línia temporal pública"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s notificacions de tots!"
@@ -724,7 +713,7 @@ msgstr "Repeticions de %s"
 msgid "Notices tagged with %s"
 msgstr "Aviso etiquetats amb %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualitzacions etiquetades amb %1$s el %2$s!"
@@ -765,7 +754,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Usuari sense perfil coincident"
 
@@ -952,7 +941,7 @@ msgid "Conversation"
 msgstr "Conversa"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Avisos"
 
@@ -974,7 +963,7 @@ msgstr "No sou un membre del grup."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Ha ocorregut algun problema amb la teva sessió."
 
@@ -1169,8 +1158,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1298,7 +1288,7 @@ msgstr "la descripció és massa llarga (màx. %d caràcters)."
 msgid "Could not update group."
 msgstr "No s'ha pogut actualitzar el grup."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "No s'han pogut crear els àlies."
 
@@ -1427,7 +1417,7 @@ msgid "Cannot normalize that email address"
 msgstr "No es pot normalitzar l'adreça electrònica."
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Adreça de correu electrònic no vàlida."
 
@@ -1616,6 +1606,25 @@ msgstr "No existeix el fitxer."
 msgid "Cannot read file."
 msgstr "No es pot llegir el fitxer."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Mida invàlida."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "No pots enviar un missatge a aquest usuari."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "L'usuari ja està silenciat."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1763,12 +1772,18 @@ msgstr "Fes-lo administrador"
 msgid "Make this user an admin"
 msgstr "Fes l'usuari administrador"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s línia temporal"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Actualitzacions dels membres de %1$s el %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grups"
@@ -2387,8 +2402,8 @@ msgstr "tipus de contingut "
 msgid "Only "
 msgstr "Només "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Format de data no suportat."
 
@@ -2534,7 +2549,8 @@ msgstr "No es pot guardar la nova contrasenya."
 msgid "Password saved."
 msgstr "Contrasenya guardada."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Camins"
 
@@ -2654,7 +2670,7 @@ msgstr "Directori de fons"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Mai"
 
@@ -2711,11 +2727,11 @@ msgstr "Etiqueta no vàlida per a la gent: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Usuaris que s'han etiquetat %s - pàgina %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "El contingut de l'avís és invàlid"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2797,7 +2813,7 @@ msgstr ""
 "Etiquetes per a tu mateix (lletres, números, -, ., i _), per comes o separat "
 "por espais"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Idioma"
 
@@ -2825,7 +2841,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "La biografia és massa llarga (màx. %d caràcters)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Franja horària no seleccionada."
 
@@ -3138,7 +3154,7 @@ msgid "Same as password above. Required."
 msgstr "Igual a la contrasenya de dalt. Requerit."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Correu electrònic"
 
@@ -3244,7 +3260,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL del teu perfil en un altre servei de microblogging compatible"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subscriure's"
 
@@ -3349,6 +3365,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Respostes a %1$s el %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "No podeu silenciar els usuaris d'aquest lloc."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Usuari sense perfil coincident"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3364,7 +3390,9 @@ msgstr "No pots enviar un missatge a aquest usuari."
 msgid "User is already sandboxed."
 msgstr "Un usuari t'ha bloquejat."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessions"
 
@@ -3389,7 +3417,7 @@ msgstr "Depuració de la sessió"
 msgid "Turn on debugging output for sessions."
 msgstr "Activa la sortida de depuració per a les sessions."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Desa els paràmetres del lloc"
@@ -3423,8 +3451,8 @@ msgstr "Paginació"
 msgid "Description"
 msgstr "Descripció"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Estadístiques"
 
@@ -3558,45 +3586,45 @@ msgstr "Àlies"
 msgid "Group actions"
 msgstr "Accions del grup"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Safata de sortida per %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membres"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Cap)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Tots els membres"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "S'ha creat"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3606,7 +3634,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3617,7 +3645,7 @@ msgstr ""
 "**%s** és un grup d'usuaris a %%%%site.name%%%%, un servei de [microblogging]"
 "(http://ca.wikipedia.org/wiki/Microblogging)"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administradors"
 
@@ -3732,149 +3760,140 @@ msgid "User is already silenced."
 msgstr "L'usuari ja està silenciat."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Paràmetres bàsic d'aquest lloc basat en l'StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "El nom del lloc ha de tenir una longitud superior a zero."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Heu de tenir una adreça electrònica de contacte vàlida"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, fuzzy, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Llengua desconeguda «%s»"
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "General"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nom del lloc"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "El nom del vostre lloc, com ara «El microblog de l'empresa»"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "El text que s'utilitza a l'enllaç dels crèdits al peu de cada pàgina"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Adreça electrònica de contacte del vostre lloc"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Fus horari per defecte"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Fus horari per defecte del lloc; normalment UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Llengua per defecte del lloc"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Instantànies"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "En una tasca planificada"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Instantànies de dades"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Freqüència"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Les instantànies s'enviaran a aquest URL"
-
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Límits"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Límits del text"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Límit de duplicats"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Quant de temps cal que esperin els usuaris (en segons) per enviar el mateix "
 "de nou."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Avís del lloc"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nou missatge"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "No s'ha pogut guardar la teva configuració de Twitter!"
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Avís del lloc"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Avís del lloc"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Paràmetres de l'SMS"
@@ -3978,6 +3997,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "No hi ha cap codi entrat"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Instantànies"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Canvia la configuració del lloc"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "En una tasca planificada"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Instantànies de dades"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Freqüència"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Les instantànies s'enviaran a aquest URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Desa els paràmetres del lloc"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "No estàs subscrit a aquest perfil."
@@ -4185,7 +4264,7 @@ msgstr "No id en el perfil sol·licitat."
 msgid "Unsubscribed"
 msgstr "No subscrit"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4389,16 +4468,22 @@ msgstr "%s membre/s en el grup, pàgina %d"
 msgid "Search for more groups"
 msgstr "Cerca més grups"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s no és membre de cap grup."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Actualitzacions de %1$s a %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4442,7 +4527,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Connectors"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Sessions"
@@ -4511,23 +4596,23 @@ msgstr "No s'ha pogut inserir el missatge amb la nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Hashtag de l'error de la base de dades:%s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema al guardar la notificació. Usuari desconegut."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Masses notificacions massa ràpid; pren un respir i publica de nou en uns "
 "minuts."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4536,20 +4621,20 @@ msgstr ""
 "Masses notificacions massa ràpid; pren un respir i publica de nou en uns "
 "minuts."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Ha estat bandejat de publicar notificacions en aquest lloc."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4576,7 +4661,12 @@ msgstr "No estàs subscrit!"
 msgid "Couldn't delete self-subscription."
 msgstr "No s'ha pogut eliminar la subscripció."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "No s'ha pogut eliminar la subscripció."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "No s'ha pogut eliminar la subscripció."
 
@@ -4585,20 +4675,20 @@ msgstr "No s'ha pogut eliminar la subscripció."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Us donem la benvinguda a %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "No s'ha pogut crear el grup."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "No s'ha pogut establir la pertinença d'aquest grup."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "No s'ha pogut establir la pertinença d'aquest grup."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "No s'ha pogut guardar la subscripció."
@@ -4641,194 +4731,187 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "Pàgina sense titol"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navegació primària del lloc"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil personal i línia temporal dels amics"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Canviar correu electrònic, avatar, contrasenya, perfil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Compte"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "No s'ha pogut redirigir al servidor: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Connexió"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Canvia la configuració del lloc"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Admin"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Convidar amics i companys perquè participin a %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Convida"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Finalitza la sessió del lloc"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Finalitza la sessió"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crea un compte"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registre"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Inicia una sessió al lloc"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Inici de sessió"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajuda'm"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Ajuda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cerca gent o text"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Cerca"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Avís del lloc"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Vistes locals"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Notificació pàgina"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navegació del lloc secundària"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Ajuda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Quant a"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Preguntes més freqüents"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privadesa"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Font"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contacte"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Insígnia"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Llicència del programari StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4837,12 +4920,12 @@ msgstr ""
 "**%%site.name%%** és un servei de microblogging de [%%site.broughtby%%**](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** és un servei de microblogging."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4853,53 +4936,53 @@ msgstr ""
 "%s, disponible sota la [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Llicència de contingut del lloc"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Tot "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "llicència."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginació"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Posteriors"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Anteriors"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4915,97 +4998,86 @@ msgid "Changes to that panel are not allowed."
 msgstr "Registre no permès."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Comanda encara no implementada."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Comanda encara no implementada."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "No s'ha pogut guardar la teva configuració de Twitter!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuració bàsica del lloc"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Lloc"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuració del disseny"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Disseny"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Configuració dels camins"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Usuari"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Configuració del disseny"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Accés"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configuració dels camins"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Camins"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Configuració del disseny"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessions"
+msgid "Edit site notice"
+msgstr "Avís del lloc"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Configuració dels camins"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5196,12 +5268,12 @@ msgstr "%s ha abandonat el grup %s"
 msgid "Fullname: %s"
 msgstr "Nom complet: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Localització: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Pàgina web: %s"
@@ -5500,6 +5572,11 @@ msgstr "Elegeix una etiqueta para reduir la llista"
 msgid "Go"
 msgstr "Vés-hi"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL del teu web, blog del grup u tema"
@@ -5636,11 +5713,11 @@ msgstr "Accedir amb el nom d'usuari i contrasenya"
 msgid "Sign up for a new account"
 msgstr "Crear nou compte"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmació de l'adreça de correu electrònic"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5657,12 +5734,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s ara està escoltant els teus avisos a %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5683,19 +5760,19 @@ msgstr ""
 "Atentament,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Biografia: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nou correu electrònic per publicar a %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5716,21 +5793,21 @@ msgstr ""
 "Sincerament teus,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s estat"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmació SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Has estat reclamat per %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5746,12 +5823,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nou missatge privat de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5770,12 +5847,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s ha afegit la teva nota com a favorita"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5796,12 +5873,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6047,10 +6124,6 @@ msgstr "Respostes"
 msgid "Favorites"
 msgstr "Preferits"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Usuari"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Safata d'entrada"
@@ -6077,7 +6150,7 @@ msgstr "Etiquetes en les notificacions de %s's"
 msgid "Unknown"
 msgstr "Acció desconeguda"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subscripcions"
 
@@ -6085,23 +6158,23 @@ msgstr "Subscripcions"
 msgid "All subscriptions"
 msgstr "Totes les subscripcions"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subscriptors"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Tots els subscriptors"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID de l'usuari"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membre des de"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Tots els grups"
 
@@ -6143,7 +6216,12 @@ msgstr "Repeteix l'avís"
 msgid "Repeat this notice"
 msgstr "Repeteix l'avís"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Bloca l'usuari del grup"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6300,47 +6378,64 @@ msgstr "Missatge"
 msgid "Moderate"
 msgstr "Modera"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Perfil de l'usuari"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administradors"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Modera"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "fa pocs segons"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "fa un minut"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fa %d minuts"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "fa una hora"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "fa %d hores"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "fa un dia"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "fa %d dies"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "fa un mes"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "fa %d mesos"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "fa un any"
 
index 9137d37083598553f46554d547f3ddedacc4e200..a48ec58850959e99983be64347934daf9f7b2da6 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:27+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:32+0000\n"
 "Language-Team: Czech\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: cs\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n< =4) ? 1 : 2 ;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Přijmout"
@@ -108,7 +109,7 @@ msgstr "Žádné takové oznámení."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -124,7 +125,7 @@ msgstr "%s a přátelé"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -179,7 +180,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s a přátelé"
@@ -207,11 +208,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Potvrzující kód nebyl nalezen"
@@ -580,7 +581,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "O nás"
@@ -673,18 +674,6 @@ msgstr "%1 statusů na %2"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "Mikroblog od %s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -695,12 +684,12 @@ msgstr "%1 statusů na %2"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -720,7 +709,7 @@ msgstr "Odpovědi na %s"
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Mikroblog od %s"
@@ -762,7 +751,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -954,7 +943,7 @@ msgid "Conversation"
 msgstr "Umístění"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Sdělení"
 
@@ -976,7 +965,7 @@ msgstr "Neodeslal jste nám profil"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1175,8 +1164,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1301,7 +1291,7 @@ msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)"
 msgid "Could not update group."
 msgstr "Nelze aktualizovat uživatele"
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Nelze uložin informace o obrázku"
@@ -1424,7 +1414,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Není platnou mailovou adresou."
 
@@ -1619,6 +1609,25 @@ msgstr "Žádné takové oznámení."
 msgid "Cannot read file."
 msgstr "Žádné takové oznámení."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Neplatná velikost"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Neodeslal jste nám profil"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Uživatel nemá profil."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1770,12 +1779,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Mikroblog od %s"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Skupiny"
@@ -2357,8 +2372,8 @@ msgstr "Připojit"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2506,7 +2521,8 @@ msgstr "Nelze uložit nové heslo"
 msgid "Password saved."
 msgstr "Heslo uloženo"
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2632,7 +2648,7 @@ msgstr ""
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Obnovit"
@@ -2691,11 +2707,11 @@ msgstr "Není platnou mailovou adresou."
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Mikroblog od %s"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Neplatný obsah sdělení"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2774,7 +2790,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Jazyk"
 
@@ -2800,7 +2816,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3107,7 +3123,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Email"
 
@@ -3198,7 +3214,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Adresa profilu na jiných kompatibilních mikroblozích."
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Odebírat"
 
@@ -3301,6 +3317,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Odpovědi na %s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Neodeslal jste nám profil"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Uživatel nemá profil."
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3316,7 +3342,9 @@ msgstr "Neodeslal jste nám profil"
 msgid "User is already sandboxed."
 msgstr "Uživatel nemá profil."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3340,7 +3368,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3376,8 +3404,8 @@ msgstr "Umístění"
 msgid "Description"
 msgstr "Odběry"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistiky"
 
@@ -3510,47 +3538,47 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Členem od"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Vytvořit"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3560,7 +3588,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3569,7 +3597,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3681,149 +3709,137 @@ msgid "User is already silenced."
 msgstr "Uživatel nemá profil."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Není platnou mailovou adresou."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Nové sdělení"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Žádný registrovaný email pro tohoto uživatele."
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Umístění"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Nové sdělení"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Problém při ukládání sdělení"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Nové sdělení"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Nové sdělení"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3921,6 +3937,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Odběry"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Nastavení"
+
 #: actions/subedit.php:70
 #, fuzzy
 msgid "You are not subscribed to that profile."
@@ -4129,7 +4205,7 @@ msgstr "Nebylo vráceno žádné URL profilu od servu."
 msgid "Unsubscribed"
 msgstr "Odhlásit"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4336,16 +4412,22 @@ msgstr "Všechny odběry"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Neodeslal jste nám profil"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4389,7 +4471,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Osobní"
@@ -4457,41 +4539,41 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4519,7 +4601,12 @@ msgstr "Nepřihlášen!"
 msgid "Couldn't delete self-subscription."
 msgstr "Nelze smazat odebírání"
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Nelze smazat odebírání"
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Nelze smazat odebírání"
 
@@ -4528,22 +4615,22 @@ msgstr "Nelze smazat odebírání"
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "Nelze uložin informace o obrázku"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Nelze vytvořit odebírat"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Nelze vytvořit odebírat"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Nelze vytvořit odebírat"
@@ -4587,192 +4674,185 @@ msgstr "%1 statusů na %2"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Osobní"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Změnit heslo"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "O nás"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Nelze přesměrovat na server: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Připojit"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Odběry"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Neplatná velikost"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Odhlásit"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Vytvořit nový účet"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrovat"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Přihlásit"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomoci mi!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Nápověda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Hledat"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "Nové sdělení"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "Nové sdělení"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Odběry"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Nápověda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "O nás"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Soukromí"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Zdroj"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4781,12 +4861,12 @@ msgstr ""
 "**%%site.name%%** je služba microblogů, kterou pro vás poskytuje [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** je služba mikroblogů."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4797,56 +4877,56 @@ msgstr ""
 "dostupná pod [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "Nové sdělení"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "« Novější"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "Starší »"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4861,95 +4941,86 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Potvrzení emailové adresy"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Nové sdělení"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "Potvrzení emailové adresy"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Vzhled"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Potvrzení emailové adresy"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Potvrzení emailové adresy"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Přijmout"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Potvrzení emailové adresy"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Potvrzení emailové adresy"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Osobní"
+msgid "Edit site notice"
+msgstr "Nové sdělení"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Potvrzení emailové adresy"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5143,12 +5214,12 @@ msgstr "%1 statusů na %2"
 msgid "Fullname: %s"
 msgstr "Celé jméno"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5456,6 +5527,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5599,11 +5675,11 @@ msgstr "Neplatné jméno nebo heslo"
 msgid "Sign up for a new account"
 msgstr "Vytvořit nový účet"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5620,12 +5696,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1 od teď naslouchá tvým sdělením v %2"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5646,17 +5722,17 @@ msgstr ""
 "S úctou váš,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "O mě"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5669,21 +5745,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr ""
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5699,12 +5775,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5723,12 +5799,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%1 od teď naslouchá tvým sdělením v %2"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5749,12 +5825,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6005,10 +6081,6 @@ msgstr "Odpovědi"
 msgid "Favorites"
 msgstr "Oblíbené"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -6034,7 +6106,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Odběry"
 
@@ -6042,23 +6114,23 @@ msgstr "Odběry"
 msgid "All subscriptions"
 msgstr "Všechny odběry"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Odběratelé"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Všichni odběratelé"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Členem od"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -6102,7 +6174,12 @@ msgstr "Odstranit toto oznámení"
 msgid "Repeat this notice"
 msgstr "Odstranit toto oznámení"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Žádný takový uživatel."
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6264,47 +6341,62 @@ msgstr "Zpráva"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Uživatel nemá profil."
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "před pár sekundami"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "asi před minutou"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "asi před %d minutami"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "asi před hodinou"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "asi před %d hodinami"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "asi přede dnem"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "před %d dny"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "asi před měsícem"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "asi před %d mesíci"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "asi před rokem"
 
index a00ec26113d5a6cbf72548a2e0106fbd0e6d6fef..4bad95b9ed61bd153cfac4a59d6a4850be440ea6 100644 (file)
@@ -4,6 +4,7 @@
 # Author@translatewiki.net: Lutzgh
 # Author@translatewiki.net: March
 # Author@translatewiki.net: McDutchie
+# Author@translatewiki.net: Michael
 # Author@translatewiki.net: Michi
 # Author@translatewiki.net: Pill
 # Author@translatewiki.net: Umherirrender
@@ -14,19 +15,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:31+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-08 21:10:39+0000\n"
 "Language-Team: German\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63415); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: de\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Zugang"
 
@@ -48,7 +50,6 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Privat"
@@ -79,7 +80,6 @@ msgid "Save access settings"
 msgstr "Zugangs-Einstellungen speichern"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Speichern"
@@ -108,7 +108,7 @@ msgstr "Seite nicht vorhanden"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -124,7 +124,7 @@ msgstr "%1$s und Freunde, Seite% 2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -169,12 +169,12 @@ msgstr ""
 
 #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@"
 #: actions/all.php:142
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
 "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 msgstr ""
-"Du kannst [%s in seinem Profil einen Stups geben](../%s) oder [ihm etwas "
+"Du kannst [%1$s in seinem Profil einen Stups geben](../%2$s) oder [ihm etwas "
 "posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit "
 "zu erregen."
 
@@ -189,7 +189,7 @@ msgstr ""
 "erregen?"
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Du und Freunde"
 
@@ -216,11 +216,11 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-Methode nicht gefunden."
 
@@ -273,6 +273,8 @@ msgid ""
 "The server was unable to handle that much POST data (%s bytes) due to its "
 "current configuration."
 msgstr ""
+"Der Server kann so große POST Abfragen (%s bytes) aufgrund der Konfiguration "
+"nicht verarbeiten."
 
 #: actions/apiaccountupdateprofilebackgroundimage.php:136
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
@@ -447,7 +449,7 @@ msgstr "Zu viele Pseudonyme! Maximale Anzahl ist %d."
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
-msgstr "Ungültiger Tag: „%s“"
+msgstr "Ungültiges Stichwort: „%s“"
 
 #: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
@@ -505,7 +507,7 @@ msgstr "Gruppen von %s"
 
 #: actions/apioauthauthorize.php:101
 msgid "No oauth_token parameter provided."
-msgstr ""
+msgstr "Kein oauth_token Parameter angegeben."
 
 #: actions/apioauthauthorize.php:106
 #, fuzzy
@@ -540,9 +542,8 @@ msgid "Database error deleting OAuth application user."
 msgstr "Fehler bei den Nutzereinstellungen."
 
 #: actions/apioauthauthorize.php:185
-#, fuzzy
 msgid "Database error inserting OAuth application user."
-msgstr "Datenbankfehler beim Einfügen des Hashtags: %s"
+msgstr "Datenbankfehler beim Einfügen des OAuth Programm Benutzers."
 
 #: actions/apioauthauthorize.php:214
 #, php-format
@@ -550,11 +551,13 @@ msgid ""
 "The request token %s has been authorized. Please exchange it for an access "
 "token."
 msgstr ""
+"Die Anfrage %s wurde nicht autorisiert. Bitte gegen einen Zugriffstoken "
+"austauschen."
 
 #: actions/apioauthauthorize.php:227
 #, php-format
 msgid "The request token %s has been denied and revoked."
-msgstr ""
+msgstr "Die Anfrage %s wurde gesperrt und widerrufen."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
@@ -567,11 +570,11 @@ msgstr "Unerwartete Formulareingabe."
 
 #: actions/apioauthauthorize.php:259
 msgid "An application would like to connect to your account"
-msgstr ""
+msgstr "Ein Programm will eine Verbindung zu deinem Konto aufbauen"
 
 #: actions/apioauthauthorize.php:276
 msgid "Allow or deny access"
-msgstr ""
+msgstr "Zugriff erlauben oder ablehnen"
 
 #: actions/apioauthauthorize.php:292
 #, php-format
@@ -581,7 +584,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -600,16 +603,15 @@ msgstr "Passwort"
 
 #: actions/apioauthauthorize.php:328
 msgid "Deny"
-msgstr ""
+msgstr "Ablehnen"
 
 #: actions/apioauthauthorize.php:334
-#, fuzzy
 msgid "Allow"
-msgstr "Alle"
+msgstr "Erlauben"
 
 #: actions/apioauthauthorize.php:351
 msgid "Allow or deny access to your account information."
-msgstr ""
+msgstr "Zugang zu deinem Konto erlauben oder ablehnen"
 
 #: actions/apistatusesdestroy.php:107
 msgid "This method requires a POST or DELETE."
@@ -663,26 +665,14 @@ msgid "Unsupported format."
 msgstr "Bildformat wird nicht unterstützt."
 
 #: actions/apitimelinefavorites.php:108
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s / Favorites from %2$s"
-msgstr "%s / Favoriten von %s"
+msgstr "%1$s / Favoriten von %2$s"
 
 #: actions/apitimelinefavorites.php:117
-#, fuzzy, php-format
-msgid "%1$s updates favorited by %2$s / %2$s."
-msgstr "%s Aktualisierung in den Favoriten von %s / %s."
-
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s Zeitleiste"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
 #, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Aktualisierungen von %1$s auf %2$s!"
+msgid "%1$s updates favorited by %2$s / %2$s."
+msgstr "%1$s Aktualisierung in den Favoriten von %2$s / %2$s."
 
 #: actions/apitimelinementions.php:117
 #, php-format
@@ -694,32 +684,32 @@ msgstr "%1$s / Aktualisierungen erwähnen %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "Nachrichten von %1$, die auf Nachrichten von %2$ / %3$ antworten."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s öffentliche Zeitleiste"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s Nachrichten von allen!"
 
 #: actions/apitimelineretweetedtome.php:111
-#, fuzzy, php-format
+#, php-format
 msgid "Repeated to %s"
 msgstr "Antworten an %s"
 
 #: actions/apitimelineretweetsofme.php:114
-#, fuzzy, php-format
+#, php-format
 msgid "Repeats of %s"
-msgstr "Antworten an %s"
+msgstr "Antworten von %s"
 
 #: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Nachrichten, die mit %s getagt sind"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Aktualisierungen mit %1$s getagt auf %2$s!"
@@ -760,7 +750,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Benutzer ohne passendes Profil"
 
@@ -827,6 +817,9 @@ msgid ""
 "unsubscribed from you, unable to subscribe to you in the future, and you "
 "will not be notified of any @-replies from them."
 msgstr ""
+"Bist du sicher, dass du den Benutzer blockieren willst?  Die Verbindung zum "
+"Benutzer wird gelöscht, dieser kann dich in Zukunft nicht mehr abonnieren "
+"und bekommt keine @-Antworten."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
 #: actions/deletenotice.php:145 actions/deleteuser.php:150
@@ -872,9 +865,9 @@ msgid "%s blocked profiles"
 msgstr "%s blockierte Benutzerprofile"
 
 #: actions/blockedfromgroup.php:100
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s blocked profiles, page %2$d"
-msgstr "%s blockierte Benutzerprofile, Seite %d"
+msgstr "%1$s blockierte Benutzerprofile, Seite %2$d"
 
 #: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
@@ -931,7 +924,6 @@ msgid "Couldn't delete email confirmation."
 msgstr "Konnte E-Mail-Bestätigung nicht löschen."
 
 #: actions/confirmaddress.php:144
-#, fuzzy
 msgid "Confirm address"
 msgstr "Adresse bestätigen"
 
@@ -945,36 +937,32 @@ msgid "Conversation"
 msgstr "Unterhaltung"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Nachrichten"
 
 #: actions/deleteapplication.php:63
-#, fuzzy
 msgid "You must be logged in to delete an application."
-msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten."
+msgstr "Du musst angemeldet sein, um dieses Programm zu entfernen."
 
 #: actions/deleteapplication.php:71
-#, fuzzy
 msgid "Application not found."
-msgstr "Nachricht hat kein Profil"
+msgstr "Programm nicht gefunden."
 
 #: actions/deleteapplication.php:78 actions/editapplication.php:77
 #: actions/showapplication.php:94
-#, fuzzy
 msgid "You are not the owner of this application."
-msgstr "Du bist kein Mitglied dieser Gruppe."
+msgstr "Du bist Besitzer dieses Programms"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Es gab ein Problem mit deinem Sessiontoken."
 
 #: actions/deleteapplication.php:123 actions/deleteapplication.php:147
-#, fuzzy
 msgid "Delete application"
-msgstr "Unbekannte Nachricht."
+msgstr "Programm entfernen"
 
 #: actions/deleteapplication.php:149
 msgid ""
@@ -982,16 +970,16 @@ msgid ""
 "about the application from the database, including all existing user "
 "connections."
 msgstr ""
+"Bist du sicher, dass du dieses Programm löschen willst? Es werden alle Daten "
+"aus der Datenbank entfernt, auch alle bestehenden Benutzer-Verbindungen."
 
 #: actions/deleteapplication.php:156
-#, fuzzy
 msgid "Do not delete this application"
-msgstr "Diese Nachricht nicht löschen"
+msgstr "Dieses Programm nicht löschen"
 
 #: actions/deleteapplication.php:160
-#, fuzzy
 msgid "Delete this application"
-msgstr "Nachricht löschen"
+msgstr "Programm löschen"
 
 #. TRANS: Client error message
 #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62
@@ -1049,6 +1037,8 @@ msgid ""
 "Are you sure you want to delete this user? This will clear all data about "
 "the user from the database, without a backup."
 msgstr ""
+"Bist du sicher, dass du den Benutzer löschen wisst? Alle Daten des Benutzers "
+"werden aus der Datenbank gelöscht (ohne ein Backup)."
 
 #: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
@@ -1057,7 +1047,7 @@ msgstr "Diesen Benutzer löschen"
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
 #: lib/groupnav.php:119
 msgid "Design"
-msgstr ""
+msgstr "Design"
 
 #: actions/designadminpanel.php:73
 msgid "Design settings for this StatusNet site."
@@ -1124,7 +1114,7 @@ msgstr "Hintergrundbild ein- oder ausschalten."
 
 #: actions/designadminpanel.php:479 lib/designsettings.php:161
 msgid "Tile background image"
-msgstr ""
+msgstr "Hintergrundbild kacheln"
 
 #: actions/designadminpanel.php:488 lib/designsettings.php:170
 msgid "Change colours"
@@ -1148,7 +1138,7 @@ msgstr "Links"
 
 #: actions/designadminpanel.php:577 lib/designsettings.php:247
 msgid "Use defaults"
-msgstr ""
+msgstr "Standardeinstellungen benutzen"
 
 #: actions/designadminpanel.php:578 lib/designsettings.php:248
 msgid "Restore default designs"
@@ -1161,8 +1151,9 @@ msgstr "Standard wiederherstellen"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1182,9 +1173,9 @@ msgid "Add to favorites"
 msgstr "Zu Favoriten hinzufügen"
 
 #: actions/doc.php:158
-#, fuzzy, php-format
+#, php-format
 msgid "No such document \"%s\""
-msgstr "Unbekanntes Dokument."
+msgstr "Unbekanntes Dokument \"%s\""
 
 #: actions/editapplication.php:54
 msgid "Edit Application"
@@ -1242,16 +1233,15 @@ msgstr "Homepage der Organisation ist erforderlich (Pflichtangabe)."
 
 #: actions/editapplication.php:218 actions/newapplication.php:206
 msgid "Callback is too long."
-msgstr ""
+msgstr "Antwort ist zu lang"
 
 #: actions/editapplication.php:225 actions/newapplication.php:215
 msgid "Callback URL is not valid."
-msgstr ""
+msgstr "Antwort URL ist nicht gültig"
 
 #: actions/editapplication.php:258
-#, fuzzy
 msgid "Could not update application."
-msgstr "Konnte Gruppe nicht aktualisieren."
+msgstr "Konnte Programm nicht aktualisieren."
 
 #: actions/editgroup.php:56
 #, php-format
@@ -1264,7 +1254,6 @@ msgstr "Du musst angemeldet sein, um eine Gruppe zu erstellen."
 
 #: actions/editgroup.php:107 actions/editgroup.php:172
 #: actions/groupdesignsettings.php:107 actions/grouplogo.php:109
-#, fuzzy
 msgid "You must be an admin to edit the group."
 msgstr "Du musst ein Administrator sein, um die Gruppe zu bearbeiten"
 
@@ -1281,7 +1270,7 @@ msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)."
 msgid "Could not update group."
 msgstr "Konnte Gruppe nicht aktualisieren."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Konnte keinen Favoriten erstellen."
 
@@ -1407,7 +1396,7 @@ msgid "Cannot normalize that email address"
 msgstr "Konnte diese E-Mail-Adresse nicht normalisieren"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Ungültige E-Mail-Adresse."
 
@@ -1498,12 +1487,16 @@ msgstr "Die momentan beliebtesten Nachrichten auf dieser Seite."
 #: actions/favorited.php:150
 msgid "Favorite notices appear on this page but no one has favorited one yet."
 msgstr ""
+"Favorisierte Mitteilungen werden auf dieser Seite angezeigt; es wurden aber "
+"noch keine Favoriten markiert."
 
 #: actions/favorited.php:153
 msgid ""
 "Be the first to add a notice to your favorites by clicking the fave button "
 "next to any notice you like."
 msgstr ""
+"Sei der erste der eine Nachricht favorisiert indem du auf die entsprechenden "
+"Schaltfläche neben der Nachricht klickst."
 
 #: actions/favorited.php:156
 #, php-format
@@ -1511,6 +1504,8 @@ msgid ""
 "Why not [register an account](%%action.register%%) and be the first to add a "
 "notice to your favorites!"
 msgstr ""
+"Warum [registrierst Du nicht einen Account](%%%%action.register%%%%) und "
+"bist der erste der eine Nachricht favorisiert!"
 
 #: actions/favoritesrss.php:111 actions/showfavorites.php:77
 #: lib/personalgroupnav.php:115
@@ -1534,9 +1529,9 @@ msgid "Featured users, page %d"
 msgstr "Top-Benutzer, Seite %d"
 
 #: actions/featured.php:99
-#, fuzzy, php-format
+#, php-format
 msgid "A selection of some great users on %s"
-msgstr "Eine Auswahl der tollen Benutzer auf %s"
+msgstr "Eine Auswahl toller Benutzer auf %s"
 
 #: actions/file.php:34
 msgid "No notice ID."
@@ -1594,6 +1589,23 @@ msgstr "Datei nicht gefunden."
 msgid "Cannot read file."
 msgstr "Datei konnte nicht gelesen werden."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Ungültige Aufgabe"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Diese Aufgabe ist reserviert und kann nicht gesetzt werden"
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Du kannst diesem Benutzer keine Nachricht schicken."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Nutzer hat diese Aufgabe bereits"
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1634,6 +1646,10 @@ msgid ""
 "will be removed from the group, unable to post, and unable to subscribe to "
 "the group in the future."
 msgstr ""
+"Bist du sicher, dass du den Benutzer \"%1$s\" in der Gruppe \"%2$s\" "
+"blockieren willst? Er wird aus der Gruppe gelöscht, kann keine Beiträge mehr "
+"abschicken und wird auch in Zukunft dieser Gruppe nicht mehr beitreten "
+"können."
 
 #: actions/groupblock.php:178
 msgid "Do not block this user from this group"
@@ -1648,7 +1664,6 @@ msgid "Database error blocking user from group."
 msgstr "Datenbank Fehler beim Versuch den Nutzer aus der Gruppe zu blockieren."
 
 #: actions/groupbyid.php:74 actions/userbyid.php:70
-#, fuzzy
 msgid "No ID."
 msgstr "Keine ID"
 
@@ -1665,6 +1680,8 @@ msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
 msgstr ""
+"Stelle ein wie die Gruppenseite aussehen soll. Hintergrundbild und "
+"Farbpalette frei wählbar."
 
 #: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
@@ -1688,7 +1705,6 @@ msgstr ""
 "s."
 
 #: actions/grouplogo.php:181
-#, fuzzy
 msgid "User without matching profile."
 msgstr "Benutzer ohne passendes Profil"
 
@@ -1710,9 +1726,9 @@ msgid "%s group members"
 msgstr "%s Gruppen-Mitglieder"
 
 #: actions/groupmembers.php:103
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s group members, page %2$d"
-msgstr "%s Gruppen-Mitglieder, Seite %d"
+msgstr "%1$s Gruppen-Mitglieder, Seite %2$d"
 
 #: actions/groupmembers.php:118
 msgid "A list of the users in this group."
@@ -1738,12 +1754,18 @@ msgstr "Zum Admin ernennen"
 msgid "Make this user an admin"
 msgstr "Diesen Benutzer zu einem Admin ernennen"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s Zeitleiste"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Aktualisierungen von %1$s auf %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Gruppen"
@@ -1762,6 +1784,11 @@ msgid ""
 "for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup"
 "%%%%)"
 msgstr ""
+"Finde und rede mit Gleichgesinnten in %%%%site.name%%%% Gruppen. Nachdem du "
+"einer Gruppe beigetreten bis kannst du mit \\\"!Gruppenname\\\" eine "
+"Nachricht an alle Gruppenmitglieder schicken. Du kannst nach einer [Gruppe "
+"suchen](%%%%action.groupsearch%%%%) oder deine eigene [Gruppe aufmachen!](%%%"
+"%action.newgroup%%%%)"
 
 #: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122
 msgid "Create a new group"
@@ -1817,7 +1844,6 @@ msgid "Error removing the block."
 msgstr "Fehler beim Freigeben des Benutzers."
 
 #: actions/imsettings.php:59
-#, fuzzy
 msgid "IM settings"
 msgstr "IM-Einstellungen"
 
@@ -1849,7 +1875,6 @@ msgstr ""
 "Freundesliste hinzugefügt?)"
 
 #: actions/imsettings.php:124
-#, fuzzy
 msgid "IM address"
 msgstr "IM-Adresse"
 
@@ -1915,9 +1940,9 @@ msgid "That is not your Jabber ID."
 msgstr "Dies ist nicht deine JabberID."
 
 #: actions/inbox.php:59
-#, fuzzy, php-format
+#, php-format
 msgid "Inbox for %1$s - page %2$d"
-msgstr "Posteingang von %s"
+msgstr "Posteingang von %s - Seite %2$d"
 
 #: actions/inbox.php:62
 #, php-format
@@ -2008,7 +2033,6 @@ msgstr ""
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Senden"
@@ -2079,14 +2103,13 @@ msgid "You must be logged in to join a group."
 msgstr "Du musst angemeldet sein, um Mitglied einer Gruppe zu werden."
 
 #: actions/joingroup.php:88 actions/leavegroup.php:88
-#, fuzzy
 msgid "No nickname or ID."
-msgstr "Kein Nutzername."
+msgstr "Kein Benutzername oder ID"
 
 #: actions/joingroup.php:141
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s joined group %2$s"
-msgstr "%s ist der Gruppe %s beigetreten"
+msgstr "%1$s ist der Gruppe %2$s beigetreten"
 
 #: actions/leavegroup.php:60
 msgid "You must be logged in to leave a group."
@@ -2097,9 +2120,9 @@ msgid "You are not a member of that group."
 msgstr "Du bist kein Mitglied dieser Gruppe."
 
 #: actions/leavegroup.php:137
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s left group %2$s"
-msgstr "%s hat die Gruppe %s verlassen"
+msgstr "%1$s hat die Gruppe %2$s verlassen"
 
 #: actions/login.php:80 actions/otp.php:62 actions/register.php:137
 msgid "Already logged in."
@@ -2156,9 +2179,9 @@ msgid "Only an admin can make another user an admin."
 msgstr "Nur Administratoren können andere Nutzer zu Administratoren ernennen."
 
 #: actions/makeadmin.php:96
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s is already an admin for group \"%2$s\"."
-msgstr "%s ist bereits ein Administrator der Gruppe „%s“."
+msgstr "%1$s ist bereits Administrator der Gruppe \"%2$s\"."
 
 #: actions/makeadmin.php:133
 #, fuzzy, php-format
@@ -2166,37 +2189,33 @@ msgid "Can't get membership record for %1$s in group %2$s."
 msgstr "Konnte Benutzer %s aus der Gruppe %s nicht entfernen"
 
 #: actions/makeadmin.php:146
-#, fuzzy, php-format
+#, php-format
 msgid "Can't make %1$s an admin for group %2$s."
-msgstr "Konnte %s nicht zum Administrator der Gruppe %s machen"
+msgstr "Konnte %1$s nicht zum Administrator der Gruppe %2$s machen"
 
 #: actions/microsummary.php:69
 msgid "No current status"
 msgstr "Kein aktueller Status"
 
 #: actions/newapplication.php:52
-#, fuzzy
 msgid "New Application"
-msgstr "Unbekannte Nachricht."
+msgstr "Neues Programm"
 
 #: actions/newapplication.php:64
-#, fuzzy
 msgid "You must be logged in to register an application."
-msgstr "Du musst angemeldet sein, um eine Gruppe zu erstellen."
+msgstr "Du musst angemeldet sein, um ein Programm zu registrieren."
 
 #: actions/newapplication.php:143
-#, fuzzy
 msgid "Use this form to register a new application."
-msgstr "Benutzer dieses Formular, um eine neue Gruppe zu erstellen."
+msgstr "Benutzer dieses Formular, um eine neues Programm zu erstellen."
 
 #: actions/newapplication.php:176
 msgid "Source URL is required."
-msgstr ""
+msgstr "Quell-URL ist erforderlich."
 
 #: actions/newapplication.php:258 actions/newapplication.php:267
-#, fuzzy
 msgid "Could not create application."
-msgstr "Konnte keinen Favoriten erstellen."
+msgstr "Konnte das Programm nicht erstellen."
 
 #: actions/newgroup.php:53
 msgid "New group"
@@ -2234,7 +2253,7 @@ msgid "Message sent"
 msgstr "Nachricht gesendet"
 
 #: actions/newmessage.php:185
-#, fuzzy, php-format
+#, php-format
 msgid "Direct message to %s sent."
 msgstr "Direkte Nachricht an %s abgeschickt"
 
@@ -2265,9 +2284,9 @@ msgid "Text search"
 msgstr "Volltextsuche"
 
 #: actions/noticesearch.php:91
-#, fuzzy, php-format
+#, php-format
 msgid "Search results for \"%1$s\" on %2$s"
-msgstr "Suchergebnisse für „%s“ auf %s"
+msgstr "Suchergebnisse für \"%1$s\" auf %2$s"
 
 #: actions/noticesearch.php:121
 #, php-format
@@ -2275,6 +2294,8 @@ msgid ""
 "Be the first to [post on this topic](%%%%action.newnotice%%%%?"
 "status_textarea=%s)!"
 msgstr ""
+"Sei der erste der [zu diesem Thema etwas schreibt](%%%%action.newnotice%%%%?"
+"status_textarea=%s)!"
 
 #: actions/noticesearch.php:124
 #, php-format
@@ -2282,6 +2303,9 @@ msgid ""
 "Why not [register an account](%%%%action.register%%%%) and be the first to "
 "[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!"
 msgstr ""
+"Warum [registrierst Du nicht einen Account](%%%%action.register%%%%) und "
+"bist der erste der [auf diese Nachricht antwortet](%%%%action.newnotice%%%%?"
+"status_textarea=%s)!"
 
 #: actions/noticesearchrss.php:96
 #, php-format
@@ -2309,9 +2333,8 @@ msgid "Nudge sent!"
 msgstr "Stups gesendet!"
 
 #: actions/oauthappssettings.php:59
-#, fuzzy
 msgid "You must be logged in to list your applications."
-msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten."
+msgstr "Du musst angemeldet sein, um deine Programm anzuzeigen"
 
 #: actions/oauthappssettings.php:74
 msgid "OAuth applications"
@@ -2319,38 +2342,41 @@ msgstr "OAuth-Anwendungen"
 
 #: actions/oauthappssettings.php:85
 msgid "Applications you have registered"
-msgstr ""
+msgstr "Registrierte Programme"
 
 #: actions/oauthappssettings.php:135
 #, php-format
 msgid "You have not registered any applications yet."
-msgstr ""
+msgstr "Du hast noch keine Programme registriert"
 
 #: actions/oauthconnectionssettings.php:72
 msgid "Connected applications"
-msgstr ""
+msgstr "Verbundene Programme"
 
 #: actions/oauthconnectionssettings.php:83
 msgid "You have allowed the following applications to access you account."
 msgstr ""
+"Du hast das folgende Programm die Erlaubnis erteilt sich mit deinem Profil "
+"zu verbinden."
 
 #: actions/oauthconnectionssettings.php:175
-#, fuzzy
 msgid "You are not a user of that application."
-msgstr "Du bist kein Mitglied dieser Gruppe."
+msgstr "Du bist kein Benutzer dieses Programms."
 
 #: actions/oauthconnectionssettings.php:186
 msgid "Unable to revoke access for app: "
-msgstr ""
+msgstr "Kann Zugang dieses Programm nicht entfernen: "
 
 #: actions/oauthconnectionssettings.php:198
 #, php-format
 msgid "You have not authorized any applications to use your account."
 msgstr ""
+"Du hast noch kein Programm die Erlaubnis gegeben dein Profil zu benutzen."
 
 #: actions/oauthconnectionssettings.php:211
 msgid "Developers can edit the registration settings for their applications "
 msgstr ""
+"Entwickler können die Registrierungseinstellungen ihrer Programme ändern "
 
 #: actions/oembed.php:79 actions/shownotice.php:100
 msgid "Notice has no profile"
@@ -2367,10 +2393,10 @@ msgstr "Content-Typ "
 
 #: actions/oembed.php:160
 msgid "Only "
-msgstr ""
+msgstr "Nur "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Kein unterstütztes Datenformat."
 
@@ -2392,7 +2418,7 @@ msgstr "Verwalte zahlreiche andere Einstellungen."
 
 #: actions/othersettings.php:108
 msgid " (free service)"
-msgstr ""
+msgstr "(kostenloser Dienst)"
 
 #: actions/othersettings.php:116
 msgid "Shorten URLs with"
@@ -2419,9 +2445,8 @@ msgid "No user ID specified."
 msgstr "Keine Benutzer ID angegeben"
 
 #: actions/otp.php:83
-#, fuzzy
 msgid "No login token specified."
-msgstr "Kein Profil angegeben."
+msgstr "Kein Zugangstoken angegeben."
 
 #: actions/otp.php:90
 #, fuzzy
@@ -2434,9 +2459,8 @@ msgid "Invalid login token specified."
 msgstr "Token ungültig oder abgelaufen."
 
 #: actions/otp.php:104
-#, fuzzy
 msgid "Login token expired."
-msgstr "An Seite anmelden"
+msgstr "Zugangstoken ist abgelaufen."
 
 #: actions/outbox.php:58
 #, php-format
@@ -2514,13 +2538,14 @@ msgstr "Konnte neues Passwort nicht speichern"
 msgid "Password saved."
 msgstr "Passwort gespeichert."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
-msgstr ""
+msgstr "Pfad"
 
 #: actions/pathsadminpanel.php:70
 msgid "Path and server settings for this StatusNet site."
-msgstr ""
+msgstr "Pfad- und Serverangaben für diese StatusNet Seite."
 
 #: actions/pathsadminpanel.php:157
 #, php-format
@@ -2540,7 +2565,7 @@ msgstr "Hintergrund Verzeichnis ist nicht beschreibbar: %s"
 #: actions/pathsadminpanel.php:177
 #, php-format
 msgid "Locales directory not readable: %s"
-msgstr ""
+msgstr "Sprachverzeichnis nicht lesbar: %s"
 
 #: actions/pathsadminpanel.php:183
 msgid "Invalid SSL server. The maximum length is 255 characters."
@@ -2568,11 +2593,11 @@ msgstr "Seitenpfad"
 
 #: actions/pathsadminpanel.php:246
 msgid "Path to locales"
-msgstr ""
+msgstr "Sprachverzeichnis"
 
 #: actions/pathsadminpanel.php:246
 msgid "Directory path to locales"
-msgstr ""
+msgstr "Pfad zu den Sprachen"
 
 #: actions/pathsadminpanel.php:250
 msgid "Fancy URLs"
@@ -2584,15 +2609,15 @@ msgstr "Schicke URLs (lesbarer und besser zu merken) verwenden?"
 
 #: actions/pathsadminpanel.php:259
 msgid "Theme"
-msgstr ""
+msgstr "Motiv"
 
 #: actions/pathsadminpanel.php:264
 msgid "Theme server"
-msgstr ""
+msgstr "Motiv-Server"
 
 #: actions/pathsadminpanel.php:268
 msgid "Theme path"
-msgstr ""
+msgstr "Motiv-Pfad"
 
 #: actions/pathsadminpanel.php:272
 msgid "Theme directory"
@@ -2634,7 +2659,7 @@ msgstr "Hintergrund Verzeichnis"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nie"
 
@@ -2690,11 +2715,11 @@ msgstr "Ungültiger Personen-Tag: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Benutzer die sich selbst mit %1$s getagged haben - Seite %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Ungültiger Nachrichteninhalt"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2768,16 +2793,16 @@ msgstr "Teile meine aktuelle Position wenn ich Nachrichten sende"
 #: actions/tagother.php:209 lib/subscriptionlist.php:106
 #: lib/subscriptionlist.php:108 lib/userprofile.php:209
 msgid "Tags"
-msgstr "Tags"
+msgstr "Stichwörter"
 
 #: actions/profilesettings.php:147
 msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
-"Tags über dich selbst (Buchstaben, Zahlen, -, ., und _) durch Kommas oder "
-"Leerzeichen getrennt"
+"Stichwörter über dich selbst (Buchstaben, Zahlen, -, ., und _) durch Kommas "
+"oder Leerzeichen getrennt"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Sprache"
 
@@ -2805,7 +2830,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Die Biografie ist zu lang (max. %d Zeichen)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Keine Zeitzone ausgewählt."
 
@@ -2816,7 +2841,7 @@ msgstr "Die eingegebene Sprache ist zu lang (maximal 50 Zeichen)"
 #: actions/profilesettings.php:253 actions/tagother.php:178
 #, php-format
 msgid "Invalid tag: \"%s\""
-msgstr "Ungültiger Tag: „%s“"
+msgstr "Ungültiges Stichwort: „%s“"
 
 #: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
@@ -2887,6 +2912,8 @@ msgstr "Sei der erste der etwas schreibt!"
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
+"Warum nicht ein [Benutzerkonto anlegen](%%action.register%%) und den ersten "
+"Beitrag abschicken!"
 
 #: actions/public.php:242
 #, php-format
@@ -2896,6 +2923,11 @@ msgid ""
 "tool. [Join now](%%action.register%%) to share notices about yourself with "
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
+"Das ist %%site.name%%, ein [Mikroblogging](http://de.wikipedia.org/wiki/"
+"Mikroblogging) Dienst auf Basis der freien Software [StatusNet](http://"
+"status.net/). [Melde dich jetzt an](%%action.register%%) und tausche "
+"Nachrichten mit deinen Freunden, Familie oder Kollegen aus! ([Mehr "
+"Informationen](%%doc.help%%))"
 
 #: actions/public.php:247
 #, php-format
@@ -2910,23 +2942,23 @@ msgstr ""
 
 #: actions/publictagcloud.php:57
 msgid "Public tag cloud"
-msgstr "Öffentliche Tag-Wolke"
+msgstr "Öffentliche Stichwort-Wolke"
 
 #: actions/publictagcloud.php:63
 #, php-format
 msgid "These are most popular recent tags on %s "
-msgstr "Das sind die beliebtesten Tags auf %s "
+msgstr "Das sind die beliebtesten Stichwörter auf %s "
 
 #: actions/publictagcloud.php:69
 #, php-format
 msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet."
 msgstr ""
-"Bis jetzt hat noch niemand eine Nachricht mit dem Tag [hashtag](%%doc.tags%"
-"%) gepostet."
+"Bis jetzt hat noch niemand eine Nachricht mit dem Stichwort [hashtag](%%doc."
+"tags%%) gepostet."
 
 #: actions/publictagcloud.php:72
 msgid "Be the first to post one!"
-msgstr ""
+msgstr "Sei der Erste der etwas schreibt!"
 
 #: actions/publictagcloud.php:75
 #, php-format
@@ -2934,10 +2966,12 @@ msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post "
 "one!"
 msgstr ""
+"Warum [registrierst Du nicht einen Account](%%%%action.register%%%%) und "
+"bist der erste der eine Nachricht abschickt!"
 
 #: actions/publictagcloud.php:134
 msgid "Tag cloud"
-msgstr "Tag-Wolke"
+msgstr "Stichwort-Wolke"
 
 #: actions/recoverpassword.php:36
 msgid "You are already logged in!"
@@ -2972,14 +3006,16 @@ msgid ""
 "If you have forgotten or lost your password, you can get a new one sent to "
 "the email address you have stored in your account."
 msgstr ""
+"Wenn du dein Passwort vergessen hast kannst du dir ein neues an deine "
+"hinterlegte Email schicken lassen."
 
 #: actions/recoverpassword.php:158
 msgid "You have been identified. Enter a new password below. "
-msgstr ""
+msgstr "Du wurdest identifiziert. Gib ein neues Passwort ein. "
 
 #: actions/recoverpassword.php:188
 msgid "Password recovery"
-msgstr ""
+msgstr "Password-Wiederherstellung"
 
 #: actions/recoverpassword.php:191
 msgid "Nickname or email address"
@@ -3099,6 +3135,8 @@ msgid ""
 "With this form you can create  a new account. You can then post notices and "
 "link up to friends and colleagues. "
 msgstr ""
+"Hier kannst du einen neuen Zugang einrichten. Danach kannst du Nachrichten "
+"und Links an deine Freunde und Kollegen schicken. "
 
 #: actions/register.php:425
 msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required."
@@ -3115,7 +3153,7 @@ msgid "Same as password above. Required."
 msgstr "Gleiches Passwort wie zuvor. Pflichteingabe."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-Mail"
 
@@ -3135,7 +3173,7 @@ msgstr "Meine Texte und Daten sind verfügbar unter"
 
 #: actions/register.php:496
 msgid "Creative Commons Attribution 3.0"
-msgstr ""
+msgstr "Creative Commons Namensnennung 3.0"
 
 #: actions/register.php:497
 msgid ""
@@ -3146,7 +3184,7 @@ msgstr ""
 "Telefonnummer."
 
 #: actions/register.php:538
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may "
 "want to...\n"
@@ -3203,7 +3241,6 @@ msgid "Remote subscribe"
 msgstr "Entferntes Abonnement"
 
 #: actions/remotesubscribe.php:124
-#, fuzzy
 msgid "Subscribe to a remote user"
 msgstr "Abonniere diesen Benutzer"
 
@@ -3224,7 +3261,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Profil-URL bei einem anderen kompatiblen Microbloggingdienst"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Abonnieren"
 
@@ -3258,19 +3295,16 @@ msgid "You can't repeat your own notice."
 msgstr "Du kannst deine eigene Nachricht nicht wiederholen."
 
 #: actions/repeat.php:90
-#, fuzzy
 msgid "You already repeated that notice."
-msgstr "Du hast diesen Benutzer bereits blockiert."
+msgstr "Nachricht bereits wiederholt"
 
 #: actions/repeat.php:114 lib/noticelist.php:674
-#, fuzzy
 msgid "Repeated"
-msgstr "Erstellt"
+msgstr "Wiederholt"
 
 #: actions/repeat.php:119
-#, fuzzy
 msgid "Repeated!"
-msgstr "Erstellt"
+msgstr "Wiederholt!"
 
 #: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
@@ -3299,12 +3333,12 @@ msgid "Replies feed for %s (Atom)"
 msgstr "Feed der Nachrichten von %s (Atom)"
 
 #: actions/replies.php:199
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
 "notice to his attention yet."
 msgstr ""
-"Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas "
+"Dies ist die Zeitleiste für %1$s und Freunde aber bisher hat niemand etwas "
 "gepostet."
 
 #: actions/replies.php:204
@@ -3315,12 +3349,12 @@ msgid ""
 msgstr ""
 
 #: actions/replies.php:206
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
 "attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 msgstr ""
-"Du kannst [%s in seinem Profil einen Stups geben](../%s) oder [ihm etwas "
+"Du kannst [%1$s in seinem Profil einen Stups geben](../%s) oder [ihm etwas "
 "posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit "
 "zu erregen."
 
@@ -3329,6 +3363,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Antworten an %1$s auf %2$s!"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Du kannst die Rollen von Nutzern dieser Seite nicht widerrufen."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Benutzer verfügt nicht über diese Rolle."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3339,44 +3381,43 @@ msgid "You cannot sandbox users on this site."
 msgstr "Du kannst diesem Benutzer keine Nachricht schicken."
 
 #: actions/sandbox.php:72
-#, fuzzy
 msgid "User is already sandboxed."
-msgstr "Dieser Benutzer hat dich blockiert."
+msgstr "Benutzer ist schon blockiert."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
-msgstr ""
+msgstr "Sitzung"
 
 #: actions/sessionsadminpanel.php:65
-#, fuzzy
 msgid "Session settings for this StatusNet site."
-msgstr "Design-Einstellungen für diese StatusNet-Website."
+msgstr "Sitzungs-Einstellungen für diese StatusNet-Website."
 
 #: actions/sessionsadminpanel.php:175
 msgid "Handle sessions"
-msgstr ""
+msgstr "Sitzung verwalten"
 
 #: actions/sessionsadminpanel.php:177
 msgid "Whether to handle sessions ourselves."
-msgstr ""
+msgstr "Sitzungsverwaltung selber übernehmen."
 
 #: actions/sessionsadminpanel.php:181
 msgid "Session debugging"
-msgstr ""
+msgstr "Sitzung untersuchen"
 
 #: actions/sessionsadminpanel.php:183
 msgid "Turn on debugging output for sessions."
-msgstr ""
+msgstr "Fehleruntersuchung für Sitzungen aktivieren"
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Site-Einstellungen speichern"
 
 #: actions/showapplication.php:82
-#, fuzzy
 msgid "You must be logged in to view an application."
-msgstr "Du musst angemeldet sein, um aus einer Gruppe auszutreten."
+msgstr "Du musst angemeldet sein, um aus dieses Programm zu betrachten."
 
 #: actions/showapplication.php:157
 #, fuzzy
@@ -3385,7 +3426,7 @@ msgstr "Nachricht hat kein Profil"
 
 #: actions/showapplication.php:159 lib/applicationeditform.php:180
 msgid "Icon"
-msgstr ""
+msgstr "Symbol"
 
 #: actions/showapplication.php:169 actions/version.php:195
 #: lib/applicationeditform.php:195
@@ -3393,36 +3434,35 @@ msgid "Name"
 msgstr "Name"
 
 #: actions/showapplication.php:178 lib/applicationeditform.php:222
-#, fuzzy
 msgid "Organization"
-msgstr "Seitenerstellung"
+msgstr "Organisation"
 
 #: actions/showapplication.php:187 actions/version.php:198
 #: lib/applicationeditform.php:209 lib/groupeditform.php:172
 msgid "Description"
 msgstr "Beschreibung"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistiken"
 
 #: actions/showapplication.php:203
 #, php-format
 msgid "Created by %1$s - %2$s access by default - %3$d users"
-msgstr ""
+msgstr "Erstellt von %1$s - %2$s Standard Zugang - %3$d Benutzer"
 
 #: actions/showapplication.php:213
 msgid "Application actions"
-msgstr ""
+msgstr "Programmaktionen"
 
 #: actions/showapplication.php:236
 msgid "Reset key & secret"
-msgstr ""
+msgstr "Schlüssel zurücksetzen"
 
 #: actions/showapplication.php:261
 msgid "Application info"
-msgstr ""
+msgstr "Programminformation"
 
 #: actions/showapplication.php:263
 msgid "Consumer key"
@@ -3434,32 +3474,32 @@ msgstr ""
 
 #: actions/showapplication.php:273
 msgid "Request token URL"
-msgstr ""
+msgstr "Anfrage-Token Adresse"
 
 #: actions/showapplication.php:278
 msgid "Access token URL"
-msgstr ""
+msgstr "Zugriffs-Token Adresse"
 
 #: actions/showapplication.php:283
-#, fuzzy
 msgid "Authorize URL"
-msgstr "Autor"
+msgstr "Autorisationadresse"
 
 #: actions/showapplication.php:288
 msgid ""
 "Note: We support HMAC-SHA1 signatures. We do not support the plaintext "
 "signature method."
 msgstr ""
+"Hinweis: Wir unterstützen HMAC-SHA1 Signaturen. Wir unterstützen keine "
+"Klartext Signaturen."
 
 #: actions/showapplication.php:309
-#, fuzzy
 msgid "Are you sure you want to reset your consumer key and secret?"
-msgstr "Bist du sicher, dass du diese Nachricht löschen möchtest?"
+msgstr "Bist du sicher, dass du den Schlüssel zurücksetzen willst?"
 
 #: actions/showfavorites.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s's favorite notices, page %2$d"
-msgstr "%ss favorisierte Nachrichten"
+msgstr "%1$ss favorisierte Nachrichten, Seite %2$d"
 
 #: actions/showfavorites.php:132
 msgid "Could not retrieve favorite notices."
@@ -3511,9 +3551,9 @@ msgid "%s group"
 msgstr "%s Gruppe"
 
 #: actions/showgroup.php:84
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s group, page %2$d"
-msgstr "%s Gruppen-Mitglieder, Seite %d"
+msgstr "%1$s Gruppe, Seite %d"
 
 #: actions/showgroup.php:226
 msgid "Group profile"
@@ -3531,51 +3571,51 @@ msgstr "Nachricht"
 
 #: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
-msgstr ""
+msgstr "Pseudonyme"
 
 #: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Gruppenaktionen"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Nachrichtenfeed der Gruppe %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Nachrichtenfeed der Gruppe %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Nachrichtenfeed der Gruppe %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Postausgang von %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Mitglieder"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Kein)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Alle Mitglieder"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Erstellt"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3585,7 +3625,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3598,7 +3638,7 @@ msgstr ""
 "Freien Software [StatusNet](http://status.net/). Seine Mitglieder erstellen "
 "kurze Nachrichten über Ihr Leben und Interessen. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administratoren"
 
@@ -3630,14 +3670,14 @@ msgid " tagged %s"
 msgstr "Nachrichten, die mit %s getagt sind"
 
 #: actions/showstream.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s, page %2$d"
-msgstr "%s blockierte Benutzerprofile, Seite %d"
+msgstr "%1$s, Seite %2$d"
 
 #: actions/showstream.php:122
-#, fuzzy, php-format
+#, php-format
 msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)"
-msgstr "Nachrichtenfeed der Gruppe %s"
+msgstr "Nachrichtenfeed für %1$s tagged %2$s (RSS 1.0)"
 
 #: actions/showstream.php:129
 #, php-format
@@ -3660,10 +3700,10 @@ msgid "FOAF for %s"
 msgstr "FOAF von %s"
 
 #: actions/showstream.php:200
-#, fuzzy, php-format
+#, php-format
 msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet."
 msgstr ""
-"Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas "
+"Dies ist die Zeitleiste für %1$s und Freunde aber bisher hat niemand etwas "
 "gepostet."
 
 #: actions/showstream.php:205
@@ -3671,16 +3711,17 @@ msgid ""
 "Seen anything interesting recently? You haven't posted any notices yet, now "
 "would be a good time to start :)"
 msgstr ""
+"In letzter Zeit irgendwas interessantes erlebt? Du hast noch nichts "
+"geschrieben, jetzt wäre doch ein guter Zeitpunkt los zu legen :)"
 
 #: actions/showstream.php:207
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "You can try to nudge %1$s or [post something to his or her attention](%%%%"
 "action.newnotice%%%%?status_textarea=%2$s)."
 msgstr ""
-"Du kannst [%s in seinem Profil einen Stups geben](../%s) oder [ihm etwas "
-"posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit "
-"zu erregen."
+"Du kannst %1$s in seinem Profil einen Stups geben oder [ihm etwas posten](%%%"
+"%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit zu erregen."
 
 #: actions/showstream.php:243
 #, php-format
@@ -3716,150 +3757,136 @@ msgid "User is already silenced."
 msgstr "Nutzer ist bereits ruhig gestellt."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr "Grundeinstellungen für diese StatusNet Seite."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Der Seiten Name darf nicht leer sein."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Du musst eine gültige E-Mail-Adresse haben."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Unbekannte Sprache „%s“"
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Minimale Textlänge ist 140 Zeichen."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
-msgstr ""
+msgstr "Duplikatlimit muss mehr als 1 Sekunde sein"
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
-msgstr ""
+msgstr "Allgemein"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Seitenname"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Der Name deiner Seite, sowas wie \"DeinUnternehmen Mircoblog\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
-msgstr ""
+msgstr "Erstellt von"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
+"Text der für den Credit-Link im Fußbereich auf jeder Seite benutzt wird"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
-msgstr ""
+msgstr "Erstellt von Adresse"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
+"Adresse die für den Credit-Link im Fußbereich auf jeder Seite benutzt wird"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Kontakt-E-Mail-Adresse für Deine Site."
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Lokale Ansichten"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
-msgstr ""
+msgstr "Standard Zeitzone"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
-msgstr ""
+msgstr "Standard Zeitzone für die Seite (meistens UTC)."
 
-#: actions/siteadminpanel.php:281
-#, fuzzy
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr "Bevorzugte Sprache"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr ""
+#: actions/siteadminpanel.php:271
+msgid "Limits"
+msgstr "Limit"
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
+msgstr "Textlimit"
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
+msgstr "Maximale Anzahl von Zeichen pro Nachricht"
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequenz"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
+msgstr "Wiederholungslimit"
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
+"Wie lange muss ein Benutzer warten bis er eine identische Nachricht "
+"abschicken kann (in Sekunden)."
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Seitenbenachrichtigung"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Neue Nachricht"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Konnte Seitenbenachrichtigung nicht speichern"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "Maximale Länge von Systembenachrichtigungen ist 255 Zeichen"
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Seitenbenachrichtigung"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr "Systembenachrichtigung (max. 255 Zeichen; HTML erlaubt)"
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Systemnachricht speichern"
 
 #: actions/smssettings.php:58
-#, fuzzy
 msgid "SMS settings"
 msgstr "SMS-Einstellungen"
 
@@ -3889,7 +3916,6 @@ msgid "Enter the code you received on your phone."
 msgstr "Gib den Code ein, den du auf deinem Handy via SMS bekommen hast."
 
 #: actions/smssettings.php:138
-#, fuzzy
 msgid "SMS phone number"
 msgstr "SMS-Telefonnummer"
 
@@ -3922,7 +3948,6 @@ msgid "That phone number already belongs to another user."
 msgstr "Diese Telefonnummer wird bereits von einem anderen Benutzer verwendet."
 
 #: actions/smssettings.php:347
-#, fuzzy
 msgid ""
 "A confirmation code was sent to the phone number you added. Check your phone "
 "for the code and instructions on how to use it."
@@ -3961,6 +3986,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Kein Code eingegeben"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Hauptnavigation"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Wann sollen Statistiken zum status.net Server geschickt werden"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequenz"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL melden"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Site-Einstellungen speichern"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Du hast dieses Profil nicht abonniert."
@@ -3972,17 +4057,15 @@ msgstr "Konnte Abonnement nicht erstellen."
 
 #: actions/subscribe.php:77
 msgid "This action only accepts POST requests."
-msgstr ""
+msgstr "Diese Aktion nimmt nur POST-Requests"
 
 #: actions/subscribe.php:107
-#, fuzzy
 msgid "No such profile."
-msgstr "Datei nicht gefunden."
+msgstr "Profil nicht gefunden."
 
 #: actions/subscribe.php:117
-#, fuzzy
 msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
-msgstr "Du hast dieses Profil nicht abonniert."
+msgstr "Du hast dieses OMB 0.1 Profil nicht abonniert."
 
 #: actions/subscribe.php:145
 msgid "Subscribed"
@@ -4092,9 +4175,8 @@ msgid "Notice feed for tag %s (Atom)"
 msgstr "Nachrichten Feed für Tag %s (Atom)"
 
 #: actions/tagother.php:39
-#, fuzzy
 msgid "No ID argument."
-msgstr "Kein id Argument."
+msgstr "Kein ID Argument."
 
 #: actions/tagother.php:65
 #, php-format
@@ -4119,8 +4201,8 @@ msgid ""
 "Tags for this user (letters, numbers, -, ., and _), comma- or space- "
 "separated"
 msgstr ""
-"Tags für diesen Benutzer (Buchstaben, Nummer, -, ., und _), durch Komma oder "
-"Leerzeichen getrennt"
+"Stichwörter für diesen Benutzer (Buchstaben, Nummer, -, ., und _), durch "
+"Komma oder Leerzeichen getrennt"
 
 #: actions/tagother.php:193
 msgid ""
@@ -4131,7 +4213,7 @@ msgstr ""
 
 #: actions/tagother.php:200
 msgid "Could not save tags."
-msgstr "Konnte Tags nicht speichern."
+msgstr "Konnte Stichwörter nicht speichern."
 
 #: actions/tagother.php:236
 msgid "Use this form to add tags to your subscribers or subscriptions."
@@ -4141,7 +4223,7 @@ msgstr ""
 
 #: actions/tagrss.php:35
 msgid "No such tag."
-msgstr "Tag nicht vorhanden."
+msgstr "Stichwort nicht vorhanden."
 
 #: actions/twitapitrends.php:85
 msgid "API method under construction."
@@ -4152,9 +4234,8 @@ msgid "You haven't blocked that user."
 msgstr "Du hast diesen Benutzer nicht blockiert."
 
 #: actions/unsandbox.php:72
-#, fuzzy
 msgid "User is not sandboxed."
-msgstr "Dieser Benutzer hat dich blockiert."
+msgstr "Benutzer ist nicht blockiert."
 
 #: actions/unsilence.php:72
 msgid "User is not silenced."
@@ -4168,17 +4249,16 @@ msgstr "Keine Profil-ID in der Anfrage."
 msgid "Unsubscribed"
 msgstr "Abbestellt"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
-#, fuzzy, php-format
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
+#, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
-"Die Nachrichtenlizenz '%s' ist nicht kompatibel mit der Lizenz der Seite '%"
-"s'."
+"Die Benutzerlizenz ‘%1$s’ ist nicht kompatibel mit der Lizenz der Seite ‘%2"
+"$s’."
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Benutzer"
@@ -4198,7 +4278,7 @@ msgstr "Willkommens-Nachricht ungültig. Maximale Länge sind 255 Zeichen."
 #: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
-msgstr ""
+msgstr "Ungültiges Abonnement: '%1$s' ist kein Benutzer"
 
 #: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
@@ -4207,11 +4287,11 @@ msgstr "Profil"
 
 #: actions/useradminpanel.php:222
 msgid "Bio Limit"
-msgstr ""
+msgstr "Bio Limit"
 
 #: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
-msgstr ""
+msgstr "Maximale Länge in Zeichen der Profil Bio."
 
 #: actions/useradminpanel.php:231
 msgid "New users"
@@ -4219,7 +4299,7 @@ msgstr "Neue Nutzer"
 
 #: actions/useradminpanel.php:235
 msgid "New user welcome"
-msgstr ""
+msgstr "Neue Benutzer empfangen"
 
 #: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
@@ -4277,9 +4357,8 @@ msgid "Reject"
 msgstr "Ablehnen"
 
 #: actions/userauthorization.php:220
-#, fuzzy
 msgid "Reject this subscription"
-msgstr "%s Abonnements"
+msgstr "Abonnement ablehnen"
 
 #: actions/userauthorization.php:232
 msgid "No authorization request!"
@@ -4290,29 +4369,27 @@ msgid "Subscription authorized"
 msgstr "Abonnement autorisiert"
 
 #: actions/userauthorization.php:256
-#, fuzzy
 msgid ""
 "The subscription has been authorized, but no callback URL was passed. Check "
 "with the site’s instructions for details on how to authorize the "
 "subscription. Your subscription token is:"
 msgstr ""
-"Das Abonnement wurde bestätigt, aber es wurde keine Callback-URL "
-"zurückgegeben. Lies nochmal die Anweisungen der Site, wie Abonnements "
-"bestätigt werden. Dein Abonnement-Token ist:"
+"Das Abonnement wurde bestätigt, aber es wurde keine Antwort-URL angegeben. "
+"Lies nochmal die Anweisungen auf der Seite wie Abonnements bestätigt werden. "
+"Dein Abonnement-Token ist:"
 
 #: actions/userauthorization.php:266
 msgid "Subscription rejected"
 msgstr "Abonnement abgelehnt"
 
 #: actions/userauthorization.php:268
-#, fuzzy
 msgid ""
 "The subscription has been rejected, but no callback URL was passed. Check "
 "with the site’s instructions for details on how to fully reject the "
 "subscription."
 msgstr ""
 "Das Abonnement wurde abgelehnt, aber es wurde keine Callback-URL "
-"zurückgegeben. Lies nochmal die Anweisungen der Site, wie Abonnements "
+"zurückgegeben. Lies nochmal die Anweisungen der Seite, wie Abonnements "
 "vollständig abgelehnt werden. Dein Abonnement-Token ist:"
 
 #: actions/userauthorization.php:303
@@ -4333,7 +4410,7 @@ msgstr ""
 #: actions/userauthorization.php:329
 #, php-format
 msgid "Profile URL ‘%s’ is for a local user."
-msgstr ""
+msgstr "Profiladresse '%s' ist für einen lokalen Benutzer."
 
 #: actions/userauthorization.php:345
 #, php-format
@@ -4359,34 +4436,43 @@ msgid ""
 "Customize the way your profile looks with a background image and a colour "
 "palette of your choice."
 msgstr ""
+"Stelle ein wie deine Profilseite aussehen soll. Hintergrundbild und "
+"Farbpalette sind frei wählbar."
 
 #: actions/userdesignsettings.php:282
 msgid "Enjoy your hotdog!"
-msgstr ""
+msgstr "Hab Spaß!"
 
 #: actions/usergroups.php:64
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s groups, page %2$d"
-msgstr "%s Gruppen-Mitglieder, Seite %d"
+msgstr "%1$s Gruppen, Seite %2$d"
 
 #: actions/usergroups.php:130
 msgid "Search for more groups"
 msgstr "Suche nach weiteren Gruppen"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s ist in keiner Gruppe Mitglied."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
+"Versuche [Gruppen zu finden](%%action.groupsearch%%) und diesen beizutreten."
+
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Aktualisierungen von %1$s auf %2$s!"
 
 #: actions/version.php:73
-#, fuzzy, php-format
+#, php-format
 msgid "StatusNet %s"
-msgstr "Statistiken"
+msgstr "StatusNet %s"
 
 #: actions/version.php:153
 #, php-format
@@ -4394,10 +4480,12 @@ msgid ""
 "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, "
 "Inc. and contributors."
 msgstr ""
+"Die Seite wird mit %1$s Version %2$s betrieben. Copyright 2008-2010 "
+"StatusNet, Inc. und Mitarbeiter"
 
 #: actions/version.php:161
 msgid "Contributors"
-msgstr ""
+msgstr "Mitarbeiter"
 
 #: actions/version.php:168
 msgid ""
@@ -4406,6 +4494,10 @@ msgid ""
 "Software Foundation, either version 3 of the License, or (at your option) "
 "any later version. "
 msgstr ""
+"StatusNet ist freie Software: Sie dürfen es weiter verteilen und/oder "
+"verändern unter Berücksichtigung der Regeln zur GNU General Public License "
+"wie veröffentlicht durch die Free Software Foundation, entweder Version 3 "
+"der Lizenz, oder jede höhere Version."
 
 #: actions/version.php:174
 msgid ""
@@ -4421,20 +4513,20 @@ msgid ""
 "You should have received a copy of the GNU Affero General Public License "
 "along with this program.  If not, see %s."
 msgstr ""
+"Du hast eine Kopie der GNU Affero General Public License zusammen mit diesem "
+"Programm erhalten. Wenn nicht, siehe %s."
 
 #: actions/version.php:189
 msgid "Plugins"
-msgstr ""
+msgstr "Erweiterungen"
 
-#: actions/version.php:196 lib/action.php:778
-#, fuzzy
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
-msgstr "Eigene"
+msgstr "Version"
 
 #: actions/version.php:197
-#, fuzzy
 msgid "Author(s)"
-msgstr "Autor"
+msgstr "Autor(en)"
 
 #: classes/File.php:144
 #, php-format
@@ -4442,34 +4534,34 @@ msgid ""
 "No file may be larger than %d bytes and the file you sent was %d bytes. Try "
 "to upload a smaller version."
 msgstr ""
+"Keine Datei darf größer als %d Bytes sein und die Datei die du verschicken "
+"wolltest ist %d Bytes groß. Bitte eine kleinere Datei hoch laden."
 
 #: classes/File.php:154
 #, php-format
 msgid "A file this large would exceed your user quota of %d bytes."
-msgstr ""
+msgstr "Eine Datei dieser Größe überschreitet deine User Quota von %d Byte."
 
 #: classes/File.php:161
 #, php-format
 msgid "A file this large would exceed your monthly quota of %d bytes."
 msgstr ""
+"Eine Datei dieser Größe würde deine monatliche Quota von %d Byte "
+"überschreiten."
 
 #: classes/Group_member.php:41
-#, fuzzy
 msgid "Group join failed."
-msgstr "Gruppenprofil"
+msgstr "Konnte Gruppe nicht beitreten"
 
 #: classes/Group_member.php:53
-#, fuzzy
 msgid "Not part of group."
-msgstr "Konnte Gruppe nicht aktualisieren."
+msgstr "Nicht Mitglied der Gruppe"
 
 #: classes/Group_member.php:60
-#, fuzzy
 msgid "Group leave failed."
-msgstr "Gruppenprofil"
+msgstr "Konnte Gruppe nicht verlassen"
 
 #: classes/Local_group.php:41
-#, fuzzy
 msgid "Could not update local group."
 msgstr "Konnte Gruppe nicht aktualisieren."
 
@@ -4479,9 +4571,8 @@ msgid "Could not create login token for %s"
 msgstr "Konnte keinen Favoriten erstellen."
 
 #: classes/Message.php:45
-#, fuzzy
 msgid "You are banned from sending direct messages."
-msgstr "Fehler beim Senden der Nachricht"
+msgstr "Direktes senden von Nachrichten wurde blockiert"
 
 #: classes/Message.php:61
 msgid "Could not insert message."
@@ -4496,23 +4587,22 @@ msgstr "Konnte Nachricht nicht mit neuer URI versehen."
 msgid "DB error inserting hashtag: %s"
 msgstr "Datenbankfehler beim Einfügen des Hashtags: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problem bei Speichern der Nachricht. Sie ist zu lang."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem bei Speichern der Nachricht. Unbekannter Benutzer."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Zu schnell zu viele Nachrichten; atme kurz durch und schicke sie erneut in "
 "ein paar Minuten ab."
 
-#: classes/Notice.php:254
-#, fuzzy
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4520,24 +4610,23 @@ msgstr ""
 "Zu schnell zu viele Nachrichten; atme kurz durch und schicke sie erneut in "
 "ein paar Minuten ab."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 "Du wurdest für das Schreiben von Nachrichten auf dieser Seite gesperrt."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problem bei Speichern der Nachricht."
 
-#: classes/Notice.php:911
-#, fuzzy
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problem bei Speichern der Nachricht."
 
-#: classes/Notice.php:1442
-#, fuzzy, php-format
+#: classes/Notice.php:1459
+#, php-format
 msgid "RT @%1$s %2$s"
-msgstr "%1$s (%2$s)"
+msgstr "RT @%1$s %2$s"
 
 #: classes/Subscription.php:66 lib/oauthstore.php:465
 msgid "You have been banned from subscribing."
@@ -4557,11 +4646,14 @@ msgid "Not subscribed!"
 msgstr "Nicht abonniert!"
 
 #: classes/Subscription.php:163
-#, fuzzy
 msgid "Couldn't delete self-subscription."
 msgstr "Konnte Abonnement nicht löschen."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Konnte OMB-Abonnement nicht löschen."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Konnte Abonnement nicht löschen."
 
@@ -4570,20 +4662,20 @@ msgstr "Konnte Abonnement nicht löschen."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Herzlich willkommen bei %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Konnte Gruppe nicht erstellen."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Konnte Gruppenmitgliedschaft nicht setzen."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Konnte Gruppenmitgliedschaft nicht setzen."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Konnte Abonnement nicht erstellen."
@@ -4605,9 +4697,8 @@ msgid "Change email handling"
 msgstr "Ändere die E-Mail-Verarbeitung"
 
 #: lib/accountsettingsaction.php:124
-#, fuzzy
 msgid "Design your profile"
-msgstr "Benutzerprofil"
+msgstr "Passe dein Profil an"
 
 #: lib/accountsettingsaction.php:128
 msgid "Other"
@@ -4618,203 +4709,178 @@ msgid "Other options"
 msgstr "Sonstige Optionen"
 
 #: lib/action.php:144
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s - %2$s"
-msgstr "%1$s (%2$s)"
+msgstr "%1$s - %2$s"
 
 #: lib/action.php:159
 msgid "Untitled page"
 msgstr "Seite ohne Titel"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Hauptnavigation"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persönliches Profil und Freundes-Zeitleiste"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Eigene"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
-msgstr "Ändere deine E-Mail, dein Avatar, Passwort, Profil"
-
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
+msgstr "Ändere deine E-Mail, Avatar, Passwort und Profil"
 
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr "Konnte nicht zum Server umleiten: %s"
+msgstr "Zum Dienst verbinden"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Verbinden"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr "Hauptnavigation"
+msgstr "Seiteneinstellung ändern"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
-msgstr "Admin"
+msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Lade Freunde und Kollegen ein dir auf %s zu folgen"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Einladen"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Von der Seite abmelden"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Abmelden"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Neues Konto erstellen"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrieren"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Auf der Seite anmelden"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Anmelden"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hilf mir!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hilfe"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Suche nach Leuten oder Text"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Suchen"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Seitennachricht"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Lokale Ansichten"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Neue Nachricht"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Unternavigation"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hilfe"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Über"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "AGB"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privatsphäre"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Quellcode"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
-#, fuzzy
+#: lib/action.php:771
 msgid "Badge"
-msgstr "Stups"
+msgstr "Plakette"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet-Software-Lizenz"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4823,12 +4889,12 @@ msgstr ""
 "**%%site.name%%** ist ein Microbloggingdienst von [%%site.broughtby%%](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** ist ein Microbloggingdienst."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4839,161 +4905,140 @@ msgstr ""
 "(Version %s) betrieben, die unter der [GNU Affero General Public License]"
 "(http://www.fsf.org/licensing/licenses/agpl-3.0.html) erhältlich ist."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "StatusNet-Software-Lizenz"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
+"Inhalt und Daten urheberrechtlich geschützt durch %1$s. Alle Rechte "
+"vorbehalten."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
-#, fuzzy
+#: lib/action.php:847
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "Lizenz."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Seitenerstellung"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Später"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Vorher"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
-msgstr ""
+msgstr "Kann eingebundenen XML Inhalt nicht verarbeiten."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:98
-#, fuzzy
 msgid "You cannot make changes to this site."
-msgstr "Du kannst diesem Benutzer keine Nachricht schicken."
+msgstr "Du kannst keine Änderungen an dieser Seite vornehmen."
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:110
-#, fuzzy
 msgid "Changes to that panel are not allowed."
-msgstr "Registrierung nicht gestattet"
+msgstr "Änderungen an dieser Seite sind nicht erlaubt."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() noch nicht implementiert."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() noch nicht implementiert."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Konnte die Design Einstellungen nicht löschen."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
-#, fuzzy
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
-msgstr "Bestätigung der E-Mail-Adresse"
+msgstr "Basis Seiteneinstellungen"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Seite"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
-#, fuzzy
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
-msgstr "SMS-Konfiguration"
+msgstr "Motiv-Konfiguration"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
-msgstr "Eigene"
+msgstr "Design"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
-#, fuzzy
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
-msgstr "SMS-Konfiguration"
+msgstr "Benutzereinstellung"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Benutzer"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
-#, fuzzy
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
-msgstr "SMS-Konfiguration"
-
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Zugang"
+msgstr "Zugangskonfiguration"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
-#, fuzzy
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
-msgstr "SMS-Konfiguration"
-
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Pfad"
+msgstr "Pfadkonfiguration"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
-#, fuzzy
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
-msgstr "SMS-Konfiguration"
+msgstr "Sitzungseinstellungen"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Seitennachricht bearbeiten"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Eigene"
+msgid "Snapshots configuration"
+msgstr "SMS-Konfiguration"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5006,40 +5051,36 @@ msgstr ""
 
 #: lib/applicationeditform.php:136
 msgid "Edit application"
-msgstr ""
+msgstr "Programm bearbeiten"
 
 #: lib/applicationeditform.php:184
 msgid "Icon for this application"
-msgstr ""
+msgstr "Programmsymbol"
 
 #: lib/applicationeditform.php:204
-#, fuzzy, php-format
+#, php-format
 msgid "Describe your application in %d characters"
-msgstr "Beschreibe die Gruppe oder das Thema in 140 Zeichen"
+msgstr "Beschreibe dein Programm in %d Zeichen"
 
 #: lib/applicationeditform.php:207
-#, fuzzy
 msgid "Describe your application"
-msgstr "Beschreibe die Gruppe oder das Thema in 140 Zeichen"
+msgstr "Beschreibe dein Programm"
 
 #: lib/applicationeditform.php:216
-#, fuzzy
 msgid "Source URL"
-msgstr "Quellcode"
+msgstr "Quelladresse"
 
 #: lib/applicationeditform.php:218
-#, fuzzy
 msgid "URL of the homepage of this application"
-msgstr "URL der Homepage oder Blogs der Gruppe oder des Themas"
+msgstr "Adresse der Homepage dieses Programms"
 
 #: lib/applicationeditform.php:224
 msgid "Organization responsible for this application"
 msgstr ""
 
 #: lib/applicationeditform.php:230
-#, fuzzy
 msgid "URL for the homepage of the organization"
-msgstr "URL der Homepage oder Blogs der Gruppe oder des Themas"
+msgstr "Homepage der Gruppe oder des Themas"
 
 #: lib/applicationeditform.php:236
 msgid "URL to redirect to after authentication"
@@ -5047,30 +5088,31 @@ msgstr ""
 
 #: lib/applicationeditform.php:258
 msgid "Browser"
-msgstr ""
+msgstr "Browser"
 
 #: lib/applicationeditform.php:274
 msgid "Desktop"
-msgstr ""
+msgstr "Arbeitsfläche"
 
 #: lib/applicationeditform.php:275
 msgid "Type of application, browser or desktop"
-msgstr ""
+msgstr "Typ der Anwendung, Browser oder Arbeitsfläche"
 
 #: lib/applicationeditform.php:297
 msgid "Read-only"
-msgstr ""
+msgstr "Schreibgeschützt"
 
 #: lib/applicationeditform.php:315
 msgid "Read-write"
-msgstr ""
+msgstr "Lese/Schreibzugriff"
 
 #: lib/applicationeditform.php:316
 msgid "Default access for this application: read-only, or read-write"
 msgstr ""
+"Standardeinstellung dieses Programms: Schreibgeschützt oder Lese/"
+"Schreibzugriff"
 
 #: lib/applicationlist.php:154
-#, fuzzy
 msgid "Revoke"
 msgstr "Entfernen"
 
@@ -5092,17 +5134,15 @@ msgstr "Nachrichten in denen dieser Anhang erscheint"
 
 #: lib/attachmenttagcloudsection.php:48
 msgid "Tags for this attachment"
-msgstr "Tags für diesen Anhang"
+msgstr "Stichworte für diesen Anhang"
 
 #: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
-#, fuzzy
 msgid "Password changing failed"
-msgstr "Passwort geändert"
+msgstr "Passwort konnte nicht geändert werden"
 
 #: lib/authenticationplugin.php:235
-#, fuzzy
 msgid "Password changing is not allowed"
-msgstr "Passwort geändert"
+msgstr "Passwort kann nicht geändert werden"
 
 #: lib/channel.php:138 lib/channel.php:158
 msgid "Command results"
@@ -5127,12 +5167,12 @@ msgstr "Die bestätigte E-Mail-Adresse konnte nicht gespeichert werden."
 
 #: lib/command.php:92
 msgid "It does not make a lot of sense to nudge yourself!"
-msgstr ""
+msgstr "Es macht keinen Sinn dich selbst anzustupsen!"
 
 #: lib/command.php:99
-#, fuzzy, php-format
+#, php-format
 msgid "Nudge sent to %s"
-msgstr "Stups abgeschickt"
+msgstr "Stups an %s geschickt"
 
 #: lib/command.php:126
 #, php-format
@@ -5141,6 +5181,9 @@ msgid ""
 "Subscribers: %2$s\n"
 "Notices: %3$s"
 msgstr ""
+"Abonnements: %1$s\n"
+"Abonnenten: %2$s\n"
+"Mitteilungen: %3$s"
 
 #: lib/command.php:152 lib/command.php:390 lib/command.php:451
 msgid "Notice with that id does not exist"
@@ -5184,12 +5227,12 @@ msgstr "%s hat die Gruppe %s verlassen"
 msgid "Fullname: %s"
 msgstr "Vollständiger Name: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Standort: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Homepage: %s"
@@ -5222,19 +5265,18 @@ msgid "Already repeated that notice"
 msgstr "Nachricht bereits wiederholt"
 
 #: lib/command.php:426
-#, fuzzy, php-format
+#, php-format
 msgid "Notice from %s repeated"
-msgstr "Nachricht hinzugefügt"
+msgstr "Nachricht von %s wiederholt"
 
 #: lib/command.php:428
-#, fuzzy
 msgid "Error repeating notice."
-msgstr "Problem beim Speichern der Nachricht."
+msgstr "Fehler beim Wiederholen der Nachricht"
 
 #: lib/command.php:482
-#, fuzzy, php-format
+#, php-format
 msgid "Notice too long - maximum is %d characters, you sent %d"
-msgstr "Nachricht zu lange - maximal 140 Zeichen erlaubt, du hast %s gesendet"
+msgstr "Nachricht zu lange - maximal %d Zeichen erlaubt, du hast %d gesendet"
 
 #: lib/command.php:491
 #, php-format
@@ -5289,22 +5331,21 @@ msgstr "Konnte Benachrichtigung nicht aktivieren."
 
 #: lib/command.php:654
 msgid "Login command is disabled"
-msgstr ""
+msgstr "Anmeldung ist abgeschaltet"
 
 #: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
-msgstr ""
+msgstr "Der Link ist nur einmal benutzbar und für eine Dauer von 2 Minuten: %s"
 
 #: lib/command.php:692
-#, fuzzy, php-format
+#, php-format
 msgid "Unsubscribed  %s"
 msgstr "%s nicht mehr abonniert"
 
 #: lib/command.php:709
-#, fuzzy
 msgid "You are not subscribed to anyone."
-msgstr "Du hast dieses Profil nicht abonniert."
+msgstr "Du hast niemanden abonniert."
 
 #: lib/command.php:711
 msgid "You are subscribed to this person:"
@@ -5384,12 +5425,11 @@ msgstr "Ich habe an folgenden Stellen nach Konfigurationsdateien gesucht: "
 
 #: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
-msgstr ""
+msgstr "Bitte die Installation erneut starten um das Problem zu beheben."
 
 #: lib/common.php:152
-#, fuzzy
 msgid "Go to the installer."
-msgstr "Auf der Seite anmelden"
+msgstr "Zur Installation gehen."
 
 #: lib/connectsettingsaction.php:110
 msgid "IM"
@@ -5404,13 +5444,12 @@ msgid "Updates by SMS"
 msgstr "Aktualisierungen via SMS"
 
 #: lib/connectsettingsaction.php:120
-#, fuzzy
 msgid "Connections"
-msgstr "Verbinden"
+msgstr "Verbindungen"
 
 #: lib/connectsettingsaction.php:121
 msgid "Authorized connected applications"
-msgstr ""
+msgstr "Programme mit Zugriffserlaubnis"
 
 #: lib/dberroraction.php:60
 msgid "Database error"
@@ -5429,15 +5468,13 @@ msgstr ""
 
 #: lib/designsettings.php:418
 msgid "Design defaults restored."
-msgstr ""
+msgstr "Standard Design wieder hergestellt."
 
 #: lib/disfavorform.php:114 lib/disfavorform.php:140
-#, fuzzy
 msgid "Disfavor this notice"
 msgstr "Aus Favoriten entfernen"
 
 #: lib/favorform.php:114 lib/favorform.php:140
-#, fuzzy
 msgid "Favor this notice"
 msgstr "Zu den Favoriten hinzufügen"
 
@@ -5467,44 +5504,45 @@ msgstr "Daten exportieren"
 
 #: lib/galleryaction.php:121
 msgid "Filter tags"
-msgstr "Tags filtern"
+msgstr "Stichworte filtern"
 
 #: lib/galleryaction.php:131
 msgid "All"
 msgstr "Alle"
 
 #: lib/galleryaction.php:139
-#, fuzzy
 msgid "Select tag to filter"
-msgstr "Wähle einen Netzanbieter"
+msgstr "Wähle ein Stichwort, um die Liste einzuschränken"
 
 #: lib/galleryaction.php:140
 msgid "Tag"
-msgstr "Tag"
+msgstr "Stichwort"
 
 #: lib/galleryaction.php:141
-#, fuzzy
 msgid "Choose a tag to narrow list"
-msgstr "Wähle einen Tag, um die Liste einzuschränken"
+msgstr "Wähle ein Stichwort, um die Liste einzuschränken"
 
 #: lib/galleryaction.php:143
 msgid "Go"
 msgstr "Los geht's"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Teile dem Benutzer die \"%s\" Rolle zu"
+
 #: lib/groupeditform.php:163
-#, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
-msgstr "URL der Homepage oder Blogs der Gruppe oder des Themas"
+msgstr "Adresse der Homepage oder Blogs der Gruppe oder des Themas"
 
 #: lib/groupeditform.php:168
-#, fuzzy
 msgid "Describe the group or topic"
-msgstr "Beschreibe die Gruppe oder das Thema in 140 Zeichen"
+msgstr "Beschreibe die Gruppe oder das Thema"
 
 #: lib/groupeditform.php:170
-#, fuzzy, php-format
+#, php-format
 msgid "Describe the group or topic in %d characters"
-msgstr "Beschreibe die Gruppe oder das Thema in 140 Zeichen"
+msgstr "Beschreibe die Gruppe oder das Thema in %d Zeichen"
 
 #: lib/groupeditform.php:179
 msgid ""
@@ -5560,7 +5598,7 @@ msgstr "Gruppen mit den meisten Beiträgen"
 #: lib/grouptagcloudsection.php:56
 #, php-format
 msgid "Tags in %s group's notices"
-msgstr "Tags in den Nachrichten der Gruppe %s"
+msgstr "Stichworte in den Nachrichten der Gruppe %s"
 
 #: lib/htmloutputter.php:103
 msgid "This page is not available in a media type you accept"
@@ -5629,11 +5667,11 @@ msgstr "Mit Nutzernamen und Passwort anmelden"
 msgid "Sign up for a new account"
 msgstr "Registriere ein neues Nutzerkonto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Bestätigung der E-Mail-Adresse"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5663,12 +5701,12 @@ msgstr ""
 "Vielen Dank!\n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s hat deine Nachrichten auf %2$s abonniert."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5694,17 +5732,17 @@ msgstr ""
 "Du kannst Deine E-Mail-Adresse und die Benachrichtigungseinstellungen auf %8"
 "$s ändern.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Biografie: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Neue E-Mail-Adresse um auf %s zu schreiben"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5725,21 +5763,21 @@ msgstr ""
 "Viele Grüße,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s Status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS-Konfiguration"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Du wurdest von %s angestupst"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5766,12 +5804,12 @@ msgstr ""
 "Mit freundlichen Grüßen,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Neue private Nachricht von %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5804,12 +5842,12 @@ msgstr ""
 "Mit freundlichen Grüßen,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) hat deine Nachricht als Favorit gespeichert"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5830,12 +5868,13 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
+"%s (@%s) hat dir eine Nachricht gesendet um deine Aufmerksamkeit zu erlangen"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5926,11 +5965,11 @@ msgstr "Upload der Datei wurde wegen der Dateiendung gestoppt."
 
 #: lib/mediafile.php:179 lib/mediafile.php:216
 msgid "File exceeds user's quota."
-msgstr ""
+msgstr "Dateigröße liegt über dem Benutzerlimit"
 
 #: lib/mediafile.php:196 lib/mediafile.php:233
 msgid "File could not be moved to destination directory."
-msgstr ""
+msgstr "Datei konnte nicht in das Zielverzeichnis verschoben werden."
 
 #: lib/mediafile.php:201 lib/mediafile.php:237
 #, fuzzy
@@ -5940,12 +5979,12 @@ msgstr "Konnte öffentlichen Stream nicht abrufen."
 #: lib/mediafile.php:270
 #, php-format
 msgid " Try using another %s format."
-msgstr ""
+msgstr "Versuche ein anderes %s Format."
 
 #: lib/mediafile.php:275
 #, php-format
 msgid "%s is not a supported file type on this server."
-msgstr ""
+msgstr "%s ist kein unterstütztes Dateiformat auf diesem Server."
 
 #: lib/messageform.php:120
 msgid "Send a direct notice"
@@ -5960,7 +5999,6 @@ msgid "Available characters"
 msgstr "Verfügbare Zeichen"
 
 #: lib/messageform.php:178 lib/noticeform.php:236
-#, fuzzy
 msgctxt "Send button for sending notice"
 msgid "Send"
 msgstr "Senden"
@@ -5976,11 +6014,11 @@ msgstr "Was ist los, %s?"
 
 #: lib/noticeform.php:192
 msgid "Attach"
-msgstr ""
+msgstr "Anhängen"
 
 #: lib/noticeform.php:196
 msgid "Attach a file"
-msgstr ""
+msgstr "Datei anhängen"
 
 #: lib/noticeform.php:212
 msgid "Share my location"
@@ -5995,6 +6033,8 @@ msgid ""
 "Sorry, retrieving your geo location is taking longer than expected, please "
 "try again later"
 msgstr ""
+"Es tut uns Leid, aber die Abfrage deiner GPS Position hat zu lange gedauert. "
+"Bitte versuche es später wieder."
 
 #: lib/noticelist.php:429
 #, php-format
@@ -6019,7 +6059,7 @@ msgstr "W"
 
 #: lib/noticelist.php:438
 msgid "at"
-msgstr ""
+msgstr "in"
 
 #: lib/noticelist.php:566
 msgid "in context"
@@ -6066,9 +6106,8 @@ msgid "Error inserting remote profile"
 msgstr "Fehler beim Einfügen des entfernten Profils"
 
 #: lib/oauthstore.php:345
-#, fuzzy
 msgid "Duplicate notice"
-msgstr "Notiz löschen"
+msgstr "Doppelte Nachricht"
 
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
@@ -6086,10 +6125,6 @@ msgstr "Antworten"
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Benutzer"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Posteingang"
@@ -6109,14 +6144,13 @@ msgstr "Deine gesendeten Nachrichten"
 #: lib/personaltagcloudsection.php:56
 #, php-format
 msgid "Tags in %s's notices"
-msgstr "Tags in %ss Nachrichten"
+msgstr "Stichworte in %ss Nachrichten"
 
 #: lib/plugin.php:114
-#, fuzzy
 msgid "Unknown"
 msgstr "Unbekannter Befehl"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abonnements"
 
@@ -6124,23 +6158,23 @@ msgstr "Abonnements"
 msgid "All subscriptions"
 msgstr "Alle Abonnements"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abonnenten"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Alle Abonnenten"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Nutzer ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Mitglied seit"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Alle Gruppen"
 
@@ -6151,7 +6185,7 @@ msgstr "Kein id Argument."
 
 #: lib/profileformaction.php:137
 msgid "Unimplemented method."
-msgstr ""
+msgstr "Nicht unterstützte Methode."
 
 #: lib/publicgroupnav.php:78
 msgid "Public"
@@ -6163,15 +6197,15 @@ msgstr "Benutzer-Gruppen"
 
 #: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85
 msgid "Recent tags"
-msgstr "Aktuelle Tags"
+msgstr "Aktuelle Stichworte"
 
 #: lib/publicgroupnav.php:88
 msgid "Featured"
-msgstr "Featured"
+msgstr "Beliebte Benutzer"
 
 #: lib/publicgroupnav.php:92
 msgid "Popular"
-msgstr "Beliebt"
+msgstr "Beliebte Beiträge"
 
 #: lib/repeatform.php:107
 msgid "Repeat this notice?"
@@ -6181,7 +6215,12 @@ msgstr "Diese Nachricht wiederholen?"
 msgid "Repeat this notice"
 msgstr "Diese Nachricht wiederholen"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Widerrufe die \"%s\" Rolle von diesem Benutzer"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6199,16 +6238,15 @@ msgstr "Site durchsuchen"
 
 #: lib/searchaction.php:126
 msgid "Keyword(s)"
-msgstr ""
+msgstr "Stichwort/Stichwörter"
 
 #: lib/searchaction.php:127
 msgid "Search"
 msgstr "Suchen"
 
 #: lib/searchaction.php:162
-#, fuzzy
 msgid "Search help"
-msgstr "Suchen"
+msgstr "Hilfe suchen"
 
 #: lib/searchgroupnav.php:80
 msgid "People"
@@ -6232,7 +6270,7 @@ msgstr "Abschnitt ohne Titel"
 
 #: lib/section.php:106
 msgid "More..."
-msgstr ""
+msgstr "Mehr..."
 
 #: lib/silenceform.php:67
 msgid "Silence"
@@ -6336,47 +6374,61 @@ msgstr "Nachricht"
 msgid "Moderate"
 msgstr "Moderieren"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Benutzerrolle"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "vor wenigen Sekunden"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "vor einer Minute"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "vor %d Minuten"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "vor einer Stunde"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "vor %d Stunden"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "vor einem Tag"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "vor %d Tagen"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "vor einem Monat"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "vor %d Monaten"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "vor einem Jahr"
 
index ed9ab78036a3b09191b13ceed85068ddeaea04fb..0ebe84fe7f958501aa952e4e3953b98f382e6ac0 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:33+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:37+0000\n"
 "Language-Team: Greek\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: el\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Πρόσβαση"
 
@@ -104,7 +105,7 @@ msgstr "Δεν υπάρχει τέτοια σελίδα"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +121,7 @@ msgstr "%s και οι φίλοι του/της"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -175,7 +176,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Εσείς και οι φίλοι σας"
 
@@ -202,11 +203,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Η μέθοδος του ΑΡΙ δε βρέθηκε!"
@@ -570,7 +571,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Λογαριασμός"
 
@@ -659,18 +660,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "χρονοδιάγραμμα του χρήστη %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -681,12 +670,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -706,7 +695,7 @@ msgstr ""
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -746,7 +735,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -934,7 +923,7 @@ msgid "Conversation"
 msgstr "Συζήτηση"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr ""
 
@@ -956,7 +945,7 @@ msgstr "Ομάδες με τα περισσότερα μέλη"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1152,8 +1141,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1278,7 +1268,7 @@ msgstr "Το βιογραφικό είναι πολύ μεγάλο (μέγιστ
 msgid "Could not update group."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
@@ -1404,7 +1394,7 @@ msgid "Cannot normalize that email address"
 msgstr "Αδυναμία κανονικοποίησης αυτής της email διεύθυνσης"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr ""
 
@@ -1596,6 +1586,24 @@ msgstr "Αδύνατη η αποθήκευση του προφίλ."
 msgid "Cannot read file."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Μήνυμα"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Ομάδες με τα περισσότερα μέλη"
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr ""
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1740,12 +1748,18 @@ msgstr "Διαχειριστής"
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "χρονοδιάγραμμα του χρήστη %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr ""
@@ -2314,8 +2328,8 @@ msgstr "Σύνδεση"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2461,7 +2475,8 @@ msgstr "Αδύνατη η αποθήκευση του νέου κωδικού"
 msgid "Password saved."
 msgstr "Ο κωδικός αποθηκεύτηκε."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2586,7 +2601,7 @@ msgstr ""
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Αποχώρηση"
@@ -2641,11 +2656,11 @@ msgstr ""
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr ""
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr ""
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2722,7 +2737,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr ""
 
@@ -2751,7 +2766,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Το βιογραφικό είναι πολύ μεγάλο (μέγιστο 140 χαρακτ.)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3054,7 +3069,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Email"
 
@@ -3159,7 +3174,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr ""
 
@@ -3260,6 +3275,15 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Απέτυχε η ενημέρωση του χρήστη."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr ""
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3273,7 +3297,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3297,7 +3323,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3331,8 +3357,8 @@ msgstr "Προσκλήσεις"
 msgid "Description"
 msgstr "Περιγραφή"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr ""
 
@@ -3466,45 +3492,45 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Μέλη"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Δημιουργημένος"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3514,7 +3540,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3523,7 +3549,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Διαχειριστές"
 
@@ -3634,147 +3660,134 @@ msgid "User is already silenced."
 msgstr ""
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Αδυναμία κανονικοποίησης αυτής της email διεύθυνσης"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr ""
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Η διεύθυνση του εισερχόμενου email αφαιρέθηκε."
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Τοπικός"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Διαγραφή μηνύματος"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Διαγραφή μηνύματος"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Ρυθμίσεις OpenID"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3874,6 +3887,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Επιβεβαίωση διεύθυνσης email"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Ρυθμίσεις OpenID"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -4071,7 +4144,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4266,16 +4339,22 @@ msgstr "Αδύνατη η αποθήκευση των νέων πληροφορ
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4319,7 +4398,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Προσωπικά"
@@ -4387,38 +4466,38 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr "Σφάλμα στη βάση δεδομένων κατά την εισαγωγή hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4445,7 +4524,12 @@ msgstr "Απέτυχε η συνδρομή."
 msgid "Couldn't delete self-subscription."
 msgstr "Απέτυχε η διαγραφή συνδρομής."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Απέτυχε η διαγραφή συνδρομής."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Απέτυχε η διαγραφή συνδρομής."
 
@@ -4454,21 +4538,21 @@ msgstr "Απέτυχε η διαγραφή συνδρομής."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Δεν ήταν δυνατή η δημιουργία ομάδας."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
@@ -4510,189 +4594,182 @@ msgstr ""
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Προσωπικά"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Αλλάξτε τον κωδικό σας"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Λογαριασμός"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Αδυναμία ανακατεύθηνσης στο διακομιστή: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Σύνδεση"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Διαχειριστής"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Προσκάλεσε φίλους και συναδέλφους σου να γίνουν μέλη στο %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Μήνυμα"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Αποσύνδεση"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Δημιουργία ενός λογαριασμού"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Περιγραφή"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Σύνδεση"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Βοηθήστε με!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Βοήθεια"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr ""
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Βοήθεια"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Περί"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Συχνές ερωτήσεις"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Επικοινωνία"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, fuzzy, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4701,13 +4778,13 @@ msgstr ""
 "To **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου) που "
 "έφερε κοντά σας το  [%%site.broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, fuzzy, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 "Το **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου). "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4715,53 +4792,53 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr ""
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4776,94 +4853,85 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Προσωπικά"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Πρόσβαση"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Προσωπικά"
+msgid "Edit site notice"
+msgstr "Διαγραφή μηνύματος"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Επιβεβαίωση διεύθυνσης email"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5051,12 +5119,12 @@ msgstr "ομάδες των χρηστών %s"
 msgid "Fullname: %s"
 msgstr "Ονοματεπώνυμο"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5356,6 +5424,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5492,11 +5565,11 @@ msgstr "Σύνδεση με όνομα χρήστη και κωδικό"
 msgid "Sign up for a new account"
 msgstr "Εγγραφή για ένα νέο λογαριασμό"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5513,12 +5586,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr ""
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5533,19 +5606,19 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Βιογραφικό: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5558,21 +5631,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Κατάσταση του/της %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5588,12 +5661,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5612,12 +5685,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr ""
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5638,12 +5711,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5887,10 +5960,6 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5916,7 +5985,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr ""
 
@@ -5924,23 +5993,23 @@ msgstr ""
 msgid "All subscriptions"
 msgstr "Όλες οι συνδρομές"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr ""
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr ""
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Μέλος από"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -5982,7 +6051,12 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος
 msgid "Repeat this notice"
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr ""
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6140,47 +6214,63 @@ msgstr "Μήνυμα"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
-msgid "a few seconds ago"
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Προφίλ χρήστη"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Διαχειριστές"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
 msgstr ""
 
 #: lib/util.php:1015
-msgid "about a minute ago"
+msgid "a few seconds ago"
 msgstr ""
 
 #: lib/util.php:1017
+msgid "about a minute ago"
+msgstr ""
+
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr ""
 
index d0ba439baa23dc630db25dbf14eccacc45c88fd0..8d846c4e21ef376e8e0884d9d7621e244dae5a7a 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Author@translatewiki.net: Bruce89
 # Author@translatewiki.net: CiaranG
+# Author@translatewiki.net: Reedy
 # --
 # This file is distributed under the same license as the StatusNet package.
 #
@@ -9,19 +10,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:36+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:40+0000\n"
 "Language-Team: British English\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: en-gb\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Access"
 
@@ -102,7 +104,7 @@ msgstr "No such page"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -118,7 +120,7 @@ msgstr "%1$s and friends, page %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +182,7 @@ msgstr ""
 "post a notice to his or her attention."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "You and friends"
 
@@ -207,11 +209,11 @@ msgstr "Updates from %1$s and friends on %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API method not found."
 
@@ -574,7 +576,7 @@ msgstr ""
 "the ability to <strong>%3$s</strong> your %4$s account data. You should only "
 "give access to your %4$s account to third parties you trust."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Account"
 
@@ -661,18 +663,6 @@ msgstr "%1$s / Favourites from %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s updates favourited by %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s timeline"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Updates from %1$s on %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -683,12 +673,12 @@ msgstr "%1$s / Updates mentioning %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s updates that reply to updates from %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s public timeline"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s updates from everyone!"
@@ -708,7 +698,7 @@ msgstr "Repeats of %s"
 msgid "Notices tagged with %s"
 msgstr "Notices tagged with %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Updates tagged with %1$s on %2$s!"
@@ -748,7 +738,7 @@ msgstr "You can upload your personal avatar. The maximum file size is %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "User without matching profile"
 
@@ -934,7 +924,7 @@ msgid "Conversation"
 msgstr "Conversation"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notices"
 
@@ -953,7 +943,7 @@ msgstr "You are not the owner of this application."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "There was a problem with your session token."
 
@@ -1149,8 +1139,9 @@ msgstr "Reset back to default"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1266,7 +1257,7 @@ msgstr "description is too long (max %d chars)."
 msgid "Could not update group."
 msgstr "Could not update group."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Could not create aliases"
 
@@ -1388,7 +1379,7 @@ msgid "Cannot normalize that email address"
 msgstr "Cannot normalise that e-mail address"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Not a valid e-mail address."
 
@@ -1579,6 +1570,25 @@ msgstr "No such file."
 msgid "Cannot read file."
 msgstr "Cannot read file."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Invalid token."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "You cannot sandbox users on this site."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "User is already silenced."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1725,12 +1735,18 @@ msgstr "Make admin"
 msgid "Make this user an admin"
 msgstr "Make this user an admin"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s timeline"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Updates from members of %1$s on %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Groups"
@@ -2339,8 +2355,8 @@ msgstr "content type "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Not a supported data format."
 
@@ -2479,7 +2495,8 @@ msgstr "Can't save new password."
 msgid "Password saved."
 msgstr "Password saved."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2599,7 +2616,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Never"
 
@@ -2654,11 +2671,11 @@ msgstr "Not a valid people tag: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Users self-tagged with %1$s - page %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Invalid notice content"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Notice licence ‘1%$s’ is not compatible with site licence ‘%2$s’."
@@ -2736,7 +2753,7 @@ msgid ""
 msgstr ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Language"
 
@@ -2763,7 +2780,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Bio is too long (max %d chars)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Timezone not selected."
 
@@ -3072,7 +3089,7 @@ msgid "Same as password above. Required."
 msgstr "Same as password above. Required."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mail"
 
@@ -3177,7 +3194,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL of your profile on another compatible microblogging service"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subscribe"
 
@@ -3277,6 +3294,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Replies to %1$s on %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "You cannot silence users on this site."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "User without matching profile."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3289,7 +3316,9 @@ msgstr "You cannot sandbox users on this site."
 msgid "User is already sandboxed."
 msgstr "User is already sandboxed."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3313,7 +3342,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Save site settings"
@@ -3344,8 +3373,8 @@ msgstr "Organization"
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistics"
 
@@ -3484,45 +3513,45 @@ msgstr ""
 msgid "Group actions"
 msgstr "Group actions"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Notice feed for %s group (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Notice feed for %s group (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Notice feed for %s group (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Outbox for %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Members"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(None)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "All members"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Created"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3537,7 +3566,7 @@ msgstr ""
 "their life and interests. [Join now](%%%%action.register%%%%) to become part "
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3550,7 +3579,7 @@ msgstr ""
 "[StatusNet](http://status.net/) tool. Its members share short messages about "
 "their life and interests. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Admins"
 
@@ -3665,145 +3694,136 @@ msgid "User is already silenced."
 msgstr "User is already silenced."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr ""
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
+msgstr "Design settings for this StausNet site."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "You must have a valid contact email address."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Minimum text limit is 140 characters."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Site name"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Contact e-mail address for your site"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Default site language"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Site notice"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "New message"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Unable to save your design settings!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Site notice"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Site notice"
 
 #: actions/smssettings.php:58
 msgid "SMS settings"
@@ -3904,6 +3924,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "No code entered"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Change site configuration"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Save site settings"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "You are not subscribed to that profile."
@@ -4100,7 +4180,7 @@ msgstr "No profile id in request."
 msgid "Unsubscribed"
 msgstr "Unsubscribed"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4287,6 +4367,8 @@ msgid ""
 "Customize the way your profile looks with a background image and a colour "
 "palette of your choice."
 msgstr ""
+"Customise the way your profile looks with a background image and a colour "
+"palette of your choice."
 
 #: actions/userdesignsettings.php:282
 msgid "Enjoy your hotdog!"
@@ -4301,16 +4383,22 @@ msgstr "%1$s groups, page %2$d"
 msgid "Search for more groups"
 msgstr "Search for more groups"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s is not a member of any group."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Updates from %1$s on %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4364,7 +4452,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Version"
 
@@ -4427,21 +4515,21 @@ msgstr "Could not update message with new URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "DB error inserting hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problem saving notice. Too long."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem saving notice. Unknown user."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4449,19 +4537,19 @@ msgstr ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "You are banned from posting notices on this site."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problem saving notice."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problem saving group inbox."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4487,7 +4575,12 @@ msgstr "Not subscribed!"
 msgid "Couldn't delete self-subscription."
 msgstr "Couldn't delete self-subscription."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Couldn't delete subscription."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Couldn't delete subscription."
 
@@ -4496,19 +4589,19 @@ msgstr "Couldn't delete subscription."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Welcome to %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Could not create group."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Could not set group URI."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Could not set group membership."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Could not save local group info."
 
@@ -4549,194 +4642,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Untitled page"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Primary site navigation"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personal profile and friends timeline"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Change your e-mail, avatar, password, profile"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Account"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Connect to services"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Connect"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Change site configuration"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Admin"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Invite friends and colleagues to join you on %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invite"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logout from the site"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Logout"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Create an account"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Register"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Login to the site"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Login"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Help me!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Help"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Search for people or text"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Search"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Site notice"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Local views"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Page notice"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Secondary site navigation"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Help"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "About"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "F.A.Q."
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Source"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Badge"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet software licence"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4745,12 +4831,12 @@ msgstr ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** is a microblogging service."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4761,53 +4847,53 @@ msgstr ""
 "s, available under the [GNU Affero General Public Licence](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Site content license"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "After"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Before"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4822,90 +4908,80 @@ msgid "Changes to that panel are not allowed."
 msgstr "Changes to that panel are not allowed."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() not implemented."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() not implemented."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Unable to delete design setting."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Basic site configuration"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Site"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Design configuration"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Design"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "User configuration"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "User"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Access configuration"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Access"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Paths configuration"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Sessions configuration"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Version"
+msgid "Edit site notice"
+msgstr "Site notice"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Paths configuration"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5089,12 +5165,12 @@ msgstr "%s left group %s"
 msgid "Fullname: %s"
 msgstr "Fullname: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Location: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Homepage: %s"
@@ -5387,6 +5463,11 @@ msgstr "Choose a tag to narrow list"
 msgid "Go"
 msgstr "Go"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL of the homepage or blog of the group or topic"
@@ -5523,11 +5604,11 @@ msgstr "Login with a username and password"
 msgid "Sign up for a new account"
 msgstr "Sign up for a new account"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "E-mail address confirmation"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5544,12 +5625,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s is now listening to your notices on %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5574,17 +5655,17 @@ msgstr ""
 "----\n"
 "Change your email address or notification options at %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Bio: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "New e-mail address for posting to %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5605,21 +5686,21 @@ msgstr ""
 "Faithfully yours,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS confirmation"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "You've been nudged by %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5635,12 +5716,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "New private message from %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5659,12 +5740,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) added your notice as a favorite"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5685,12 +5766,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5929,10 +6010,6 @@ msgstr "Replies"
 msgid "Favorites"
 msgstr "Favourites"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "User"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Inbox"
@@ -5958,7 +6035,7 @@ msgstr "Tags in %s's notices"
 msgid "Unknown"
 msgstr "Unknown"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subscriptions"
 
@@ -5966,23 +6043,23 @@ msgstr "Subscriptions"
 msgid "All subscriptions"
 msgstr "All subscriptions"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subscribers"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "All subscribers"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "User ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Member since"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "All groups"
 
@@ -6022,7 +6099,12 @@ msgstr "Repeat this notice?"
 msgid "Repeat this notice"
 msgstr "Repeat this notice"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Block this user from this group"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6176,47 +6258,63 @@ msgstr "Message"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "User profile"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Admins"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "a few seconds ago"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "about a minute ago"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "about %d minutes ago"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "about an hour ago"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "about %d hours ago"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "about a day ago"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "about %d days ago"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "about a month ago"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "about %d months ago"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "about a year ago"
 
index fe861905dbe7bc820350fa0c126ae3f53659a251..cdc0184e43e2579184b30e141d820f5a716e0be2 100644 (file)
@@ -13,19 +13,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:39+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:43+0000\n"
 "Language-Team: Spanish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: es\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Acceder"
 
@@ -106,7 +107,7 @@ msgstr "No existe tal página"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -122,7 +123,7 @@ msgstr "%1$s y amigos, página %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -185,7 +186,7 @@ msgstr ""
 "su atención ](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Tú y amigos"
 
@@ -212,11 +213,11 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método de API no encontrado."
 
@@ -582,7 +583,7 @@ msgstr ""
 "permiso para <strong>%3$s</strong> la información de tu cuenta %4$s. Sólo "
 "debes dar acceso a tu cuenta %4$s a terceras partes en las que confíes."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Cuenta"
 
@@ -671,18 +672,6 @@ msgstr "%1$s / Favoritos de %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s actualizaciones favoritas de %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "línea temporal de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "¡Actualizaciones de %1$s en %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -693,12 +682,12 @@ msgstr "%1$s / Actualizaciones que mencionan %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "actualizaciones de %1$s en respuesta a las de %2$s / %3$s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "línea temporal pública de %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "¡Actualizaciones de todos en %s!"
@@ -718,7 +707,7 @@ msgstr "Repeticiones de %s"
 msgid "Notices tagged with %s"
 msgstr "Avisos marcados con %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualizaciones etiquetadas con %1$s en %2$s!"
@@ -758,7 +747,7 @@ msgstr "Puedes subir tu imagen personal. El tamaño máximo de archivo es %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Usuario sin perfil equivalente"
 
@@ -945,7 +934,7 @@ msgid "Conversation"
 msgstr "Conversación"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Avisos"
 
@@ -964,7 +953,7 @@ msgstr "No eres el propietario de esta aplicación."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Hubo problemas con tu clave de sesión."
 
@@ -1160,8 +1149,9 @@ msgstr "Volver a los valores predeterminados"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1277,7 +1267,7 @@ msgstr "La descripción es muy larga (máx. %d caracteres)."
 msgid "Could not update group."
 msgstr "No se pudo actualizar el grupo."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "No fue posible crear alias."
 
@@ -1402,7 +1392,7 @@ msgid "Cannot normalize that email address"
 msgstr "No se puede normalizar esta dirección de correo electrónico."
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Correo electrónico no válido"
 
@@ -1595,6 +1585,25 @@ msgstr "No existe tal archivo."
 msgid "Cannot read file."
 msgstr "No se puede leer archivo."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Token inválido."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "No puedes enviar mensaje a este usuario."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "El usuario te ha bloqueado."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1744,12 +1753,18 @@ msgstr "Convertir en administrador"
 msgid "Make this user an admin"
 msgstr "Convertir a este usuario en administrador"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "línea temporal de %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "¡Actualizaciones de miembros de %1$s en %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupos"
@@ -2374,8 +2389,8 @@ msgstr "tipo de contenido "
 msgid "Only "
 msgstr "Sólo "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "No es un formato de dato soportado"
 
@@ -2515,7 +2530,8 @@ msgstr "No se puede guardar la nueva contraseña."
 msgid "Password saved."
 msgstr "Se guardó Contraseña."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Rutas"
 
@@ -2637,7 +2653,7 @@ msgstr "Directorio del fondo"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nunca"
 
@@ -2693,11 +2709,11 @@ msgstr "No es una etiqueta válida para personas: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Usuarios auto marcados con %s - página %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "El contenido del aviso es inválido"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2776,7 +2792,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr "Tags para ti (letras, números, -, ., y _), coma - o espacio - separado"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Idioma"
 
@@ -2804,7 +2820,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "La biografía es muy larga (máx. %d caracteres)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Zona horaria no seleccionada"
 
@@ -3121,7 +3137,7 @@ msgid "Same as password above. Required."
 msgstr "Igual a la contraseña de arriba. Requerida"
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Correo electrónico"
 
@@ -3228,7 +3244,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "El URL de tu perfil en otro servicio de microblogueo compatible"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Suscribirse"
 
@@ -3326,6 +3342,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Respuestas a %1$s en %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "No puedes enviar mensaje a este usuario."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Usuario sin perfil coincidente."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3340,7 +3366,9 @@ msgstr "No puedes enviar mensaje a este usuario."
 msgid "User is already sandboxed."
 msgstr "El usuario te ha bloqueado."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sesiones"
 
@@ -3364,7 +3392,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Guardar la configuración del sitio"
@@ -3396,8 +3424,8 @@ msgstr "Organización"
 msgid "Description"
 msgstr "Descripción"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Estadísticas"
 
@@ -3530,46 +3558,46 @@ msgstr "Alias"
 msgid "Group actions"
 msgstr "Acciones del grupo"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Bandeja de salida para %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Miembros"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ninguno)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Todos los miembros"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Creado"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3579,7 +3607,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3590,7 +3618,7 @@ msgstr ""
 "**%s** es un grupo de usuarios en %%%%site.name%%%%, un servicio [micro-"
 "blogging](http://en.wikipedia.org/wiki/Micro-blogging) "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administradores"
 
@@ -3705,149 +3733,140 @@ msgid "User is already silenced."
 msgstr "El usuario te ha bloqueado."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Configuración básica de este sitio StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "No es una dirección de correo electrónico válida"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Idioma desconocido \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "La frecuencia de captura debe ser un número."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "General"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nombre del sitio"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Nueva dirección de correo para postear a %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Vistas locales"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Zona horaria predeterminada"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Zona horaria predeterminada del sitio; generalmente UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Idioma predeterminado del sitio"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Capturas"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "En un trabajo programado"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Capturas de datos"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frecuencia"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Las capturas se enviarán a este URL"
-
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Límites"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Límite de texto"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Cantidad máxima de caracteres para los mensajes."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr "Cuántos segundos es necesario esperar para publicar lo mismo de nuevo."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Aviso de sitio"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nuevo Mensaje "
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "No se pudo grabar tu configuración de diseño."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Aviso de sitio"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Aviso de sitio"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Configuración de SMS"
@@ -3950,6 +3969,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "No ingresó código"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Capturas"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Cambiar la configuración del sitio"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "La frecuencia de captura debe ser un número."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "En un trabajo programado"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Capturas de datos"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frecuencia"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Las capturas se enviarán a este URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Guardar la configuración del sitio"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "No te has suscrito a ese perfil."
@@ -4152,7 +4231,7 @@ msgstr "No hay id de perfil solicitado."
 msgid "Unsubscribed"
 msgstr "Desuscrito"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4354,16 +4433,22 @@ msgstr "Miembros del grupo %s, página %d"
 msgid "Search for more groups"
 msgstr "Buscar más grupos"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "No eres miembro de ese grupo"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "¡Actualizaciones de %1$s en %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4409,7 +4494,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Complementos"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Sesiones"
@@ -4476,22 +4561,22 @@ msgstr "No se pudo actualizar mensaje con nuevo URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Error de la BD al insertar la etiqueta clave: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Ha habido un problema al guardar el mensaje. Es muy largo."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Ha habido un problema al guardar el mensaje. Usuario desconocido."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos "
 "minutos."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4500,20 +4585,20 @@ msgstr ""
 "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos "
 "minutos."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Tienes prohibido publicar avisos en este sitio."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Hubo un problema al guardar el aviso."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Hubo un problema al guardar el aviso."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4540,7 +4625,12 @@ msgstr "¡No estás suscrito!"
 msgid "Couldn't delete self-subscription."
 msgstr "No se pudo eliminar la suscripción."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "No se pudo eliminar la suscripción."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "No se pudo eliminar la suscripción."
 
@@ -4549,21 +4639,21 @@ msgstr "No se pudo eliminar la suscripción."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bienvenido a %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "No se pudo crear grupo."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "No se pudo configurar miembros de grupo."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "No se pudo configurar miembros de grupo."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "No se ha podido guardar la suscripción."
@@ -4605,194 +4695,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Página sin título"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navegación de sitio primario"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil personal y línea de tiempo de amigos"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambia tu correo electrónico, avatar, contraseña, perfil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Cuenta"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Conectar a los servicios"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Conectarse"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Cambiar la configuración del sitio"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Admin"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Invita a amigos y colegas a unirse a %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invitar"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Salir de sitio"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Salir"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear una cuenta"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrarse"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Ingresar a sitio"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Inicio de sesión"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ayúdame!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Ayuda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Buscar personas o texto"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Buscar"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Aviso de sitio"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Vistas locales"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Aviso de página"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navegación de sitio secundario"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Ayuda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Acerca de"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Preguntas Frecuentes"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacidad"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Fuente"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Ponerse en contacto"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Insignia"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licencia de software de StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4801,12 +4884,12 @@ msgstr ""
 "**%%site.name%%** es un servicio de microblogueo de [%%site.broughtby%%**](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** es un servicio de microblogueo."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4817,55 +4900,55 @@ msgstr ""
 "disponible bajo la [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licencia de contenido del sitio"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Derechos de autor de contenido y datos por los colaboradores. Todos los "
 "derechos reservados."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Todo"
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "Licencia."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginación"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Después"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Antes"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4881,95 +4964,84 @@ msgid "Changes to that panel are not allowed."
 msgstr "Registro de usuario no permitido."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Todavía no se implementa comando."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Todavía no se implementa comando."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "¡No se pudo guardar tu configuración de Twitter!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuración básica del sitio"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Sitio"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuración del diseño"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Diseño"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Configuración de usuario"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Usuario"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Configuración de acceso"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Acceder"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS confirmación"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Rutas"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Configuración de sesiones"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sesiones"
+msgid "Edit site notice"
+msgstr "Aviso de sitio"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS confirmación"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5158,12 +5230,12 @@ msgstr "%s dejó grupo %s"
 msgid "Fullname: %s"
 msgstr "Nombre completo: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Lugar: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Página de inicio: %s"
@@ -5462,6 +5534,11 @@ msgstr "Elegir tag para reducir lista"
 msgid "Go"
 msgstr "Ir"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5600,11 +5677,11 @@ msgstr "Ingresar con un nombre de usuario y contraseña."
 msgid "Sign up for a new account"
 msgstr "Registrarse para una nueva cuenta"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmación de correo electrónico"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5621,12 +5698,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s ahora está escuchando tus avisos en %2$s"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5647,19 +5724,19 @@ msgstr ""
 "Atentamente,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Bio: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nueva dirección de correo para postear a %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5680,21 +5757,21 @@ msgstr ""
 "Attentamente, \n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "estado de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS confirmación"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s te mandó un zumbido "
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5710,12 +5787,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nuevo mensaje privado de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5734,12 +5811,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) agregó tu aviso como un  favorito"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5760,12 +5837,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6012,10 +6089,6 @@ msgstr "Respuestas"
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Usuario"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Bandeja de Entrada"
@@ -6042,7 +6115,7 @@ msgstr "Tags en avisos de %s"
 msgid "Unknown"
 msgstr "Acción desconocida"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Suscripciones"
 
@@ -6050,24 +6123,24 @@ msgstr "Suscripciones"
 msgid "All subscriptions"
 msgstr "Todas las suscripciones"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Suscriptores"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "Todos los suscriptores"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID de usuario"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Miembro desde"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Todos los grupos"
 
@@ -6110,7 +6183,12 @@ msgstr "Responder este aviso."
 msgid "Repeat this notice"
 msgstr "Responder este aviso."
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Bloquear este usuario de este grupo"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6271,47 +6349,64 @@ msgstr "Mensaje"
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Perfil de usuario"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administradores"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderar"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "hace unos segundos"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "hace un minuto"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "hace %d minutos"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "hace una hora"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "hace %d horas"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "hace un día"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "hace %d días"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "hace un mes"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "hace %d meses"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "hace un año"
 
index bb453f582bd4141eec87c52eef84d74f768f56f7..955efd243b9e477fc76e7fd6622c0ba8c6d8494c 100644 (file)
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:45+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:48+0000\n"
 "Last-Translator: Ahmad Sufi Mahmudi\n"
 "Language-Team: Persian\n"
 "MIME-Version: 1.0\n"
@@ -20,11 +20,12 @@ msgstr ""
 "X-Language-Code: fa\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "دسترسی"
 
@@ -108,7 +109,7 @@ msgstr "چنین صفحه‌ای وجود ندارد"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -124,7 +125,7 @@ msgstr "%s کاربران مسدود شده، صفحه‌ی %d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -185,7 +186,7 @@ msgstr ""
 "را جلب کنید."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "شما و دوستان"
 
@@ -212,11 +213,11 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "رابط مورد نظر پیدا نشد."
 
@@ -574,7 +575,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "حساب کاربری"
 
@@ -663,18 +664,6 @@ msgstr "%s / دوست داشتنی از %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s به روز رسانی های دوست داشتنی %s / %s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "خط زمانی %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "به روز رسانی‌های %1$s در %2$s"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -685,12 +674,12 @@ msgstr "%$1s / به روز رسانی های شامل %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s به روز رسانی هایی که در پاسخ به $2$s / %3$s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s خط‌زمانی عمومی"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s به روز رسانی های عموم"
@@ -710,7 +699,7 @@ msgstr "تکرار %s"
 msgid "Notices tagged with %s"
 msgstr "پیام‌هایی که با %s نشانه گزاری شده اند."
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "پیام‌های نشانه گزاری شده با %1$s در %2$s"
@@ -751,7 +740,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "کاربر بدون مشخصات"
 
@@ -939,7 +928,7 @@ msgid "Conversation"
 msgstr "مکالمه"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "پیام‌ها"
 
@@ -961,7 +950,7 @@ msgstr "شما یک عضو این گروه نیستید."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1160,8 +1149,9 @@ msgstr "برگشت به حالت پیش گزیده"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1287,7 +1277,7 @@ msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)."
 msgid "Could not update group."
 msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "نمی‌توان نام‌های مستعار را ساخت."
 
@@ -1410,7 +1400,7 @@ msgid "Cannot normalize that email address"
 msgstr "نمی‌توان نشانی را قانونی کرد"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "یک آدرس ایمیل معتبر نیست."
 
@@ -1600,6 +1590,25 @@ msgstr "چنین پرونده‌ای وجود ندارد."
 msgid "Cannot read file."
 msgstr "نمی‌توان پرونده را خواند."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "اندازه‌ی نادرست"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "شما نمی توانید کاربری را در این سایت ساکت کنید."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "کاربر قبلا ساکت شده است."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1741,12 +1750,18 @@ msgstr "مدیر شود"
 msgid "Make this user an admin"
 msgstr "این کاربر یک مدیر شود"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "خط زمانی %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "به روز رسانی کابران %1$s در %2$s"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "گروه‌ها"
@@ -2340,8 +2355,8 @@ msgstr "نوع محتوا "
 msgid "Only "
 msgstr " فقط"
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "یک قالب دادهٔ پشتیبانی‌شده نیست."
 
@@ -2487,7 +2502,8 @@ msgstr "نمی‌توان گذرواژه جدید را ذخیره کرد."
 msgid "Password saved."
 msgstr "گذرواژه ذخیره شد."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "مسیر ها"
 
@@ -2607,7 +2623,7 @@ msgstr "شاخهٔ تصاویر پیش‌زمینه"
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "هیچ وقت"
 
@@ -2663,11 +2679,11 @@ msgstr "یک برچسب کاربری معتبر نیست: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "کاربران خود برچسب‌گذاری شده با %s - صفحهٔ %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "محتوای آگهی نامعتبر"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2745,7 +2761,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "زبان"
 
@@ -2771,7 +2787,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr ""
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "منطقه‌ی زمانی انتخاب نشده است."
 
@@ -3073,7 +3089,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "پست الکترونیکی"
 
@@ -3161,7 +3177,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr ""
 
@@ -3259,6 +3275,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "شما نمی توانید کاربری را در این سایت ساکت کنید."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "کاربر بدون مشخصات"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3272,7 +3298,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3297,7 +3325,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr ""
@@ -3332,8 +3360,8 @@ msgstr "صفحه بندى"
 msgid "Description"
 msgstr ""
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "آمار"
 
@@ -3467,45 +3495,45 @@ msgstr "نام های مستعار"
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "اعضا"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "هیچ"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "همه ی اعضا"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "ساخته شد"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3515,7 +3543,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3524,7 +3552,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3638,149 +3666,140 @@ msgid "User is already silenced."
 msgstr "کاربر قبلا ساکت شده است."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "تنظیمات پایه ای برای این سایت StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "نام سایت باید طولی غیر صفر داشته باشد."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "شما باید یک آدرس ایمیل قابل قبول برای ارتباط داشته باشید"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "نام وب‌گاه"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "نام وب‌گاه شما، مانند «میکروبلاگ شرکت شما»"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "أورده شده به وسیله ی"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr ""
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "محلی"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "منطقه ی زمانی پیش فرض"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "منظقه ی زمانی پیش فرض برای سایت؛ معمولا UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "زبان پیش فرض سایت"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr ""
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr ""
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "محدودیت ها"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "محدودیت متن"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "بیشینهٔ تعداد حروف برای آگهی‌ها"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "چه مدت کاربران باید منتظر بمانند ( به ثانیه ) تا همان چیز را مجددا ارسال "
 "کنند."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "خبر سایت"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "پیام جدید"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "نمی‌توان تنظیمات طرح‌تان را ذخیره کرد."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "خبر سایت"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "خبر سایت"
+
 #: actions/smssettings.php:58
 #, fuzzy
 msgid "SMS settings"
@@ -3877,6 +3896,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "کدی وارد نشد"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "تغییر پیکربندی سایت"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "تنظیمات چهره"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "شما به این پروفيل متعهد نشدید"
@@ -4072,7 +4151,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4263,16 +4342,22 @@ msgstr "اعضای گروه %s، صفحهٔ %d"
 msgid "Search for more groups"
 msgstr "جستجو برای گروه های بیشتر"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "به روز رسانی‌های %1$s در %2$s"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4316,7 +4401,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "شخصی"
@@ -4383,22 +4468,22 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "مشکل در ذخیره کردن پیام. بسیار طولانی."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "مشکل در ذخیره کردن پیام. کاربر نا شناخته."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "تعداد خیلی زیاد آگهی و بسیار سریع؛ استراحت کنید و مجددا دقایقی دیگر ارسال "
 "کنید."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4406,20 +4491,20 @@ msgstr ""
 "تعداد زیاد پیام های دو نسخه ای و بسرعت؛ استراحت کنید و دقایقی دیگر مجددا "
 "ارسال کنید."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "شما از فرستادن پست در این سایت مردود شدید ."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4444,7 +4529,12 @@ msgstr "تایید نشده!"
 msgid "Couldn't delete self-subscription."
 msgstr ""
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "نمی‌توان تصدیق پست الکترونیک را پاک کرد."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr ""
 
@@ -4453,20 +4543,20 @@ msgstr ""
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "خوش امدید به %1$s , @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "نمیتوان گروه را تشکیل داد"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "نمیتوان گروه را تشکیل داد"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr ""
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "نمی‌توان شناس‌نامه را ذخیره کرد."
@@ -4508,205 +4598,198 @@ msgstr "%s گروه %s را ترک کرد."
 msgid "Untitled page"
 msgstr "صفحه ی بدون عنوان"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "شخصی"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "آدرس ایمیل، آواتار، کلمه ی عبور، پروفایل خود را تغییر دهید"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "حساب کاربری"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "متصل شدن به خدمات"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "وصل‌شدن"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "تغییر پیکربندی سایت"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "مدیر"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr " به شما ملحق شوند  %s دوستان و همکاران را دعوت کنید تا در"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "دعوت‌کردن"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "خارج شدن از سایت ."
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "خروج"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "یک حساب کاربری بسازید"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "ثبت نام"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "ورود به وب‌گاه"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "ورود"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "به من کمک کنید!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "کمک"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "جستجو برای شخص با متن"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "جست‌وجو"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "خبر سایت"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "دید محلی"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "خبر صفحه"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "کمک"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "دربارهٔ"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "سوال‌های رایج"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "خصوصی"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "منبع"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "تماس"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet مجوز نرم افزار"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4714,53 +4797,53 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "مجوز محتویات سایت"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "همه "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "مجوز."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "صفحه بندى"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "بعد از"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "قبل از"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4776,94 +4859,83 @@ msgid "Changes to that panel are not allowed."
 msgstr "اجازه‌ی ثبت نام داده نشده است."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "نمی توان تنظیمات طراحی شده را پاک کرد ."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "پیکره بندی اصلی سایت"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "سایت"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "طرح"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "پیکره بندی اصلی سایت"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "کاربر"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "دسترسی"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "مسیر ها"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "شخصی"
+msgid "Edit site notice"
+msgstr "خبر سایت"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "پیکره بندی اصلی سایت"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5054,12 +5126,12 @@ msgstr "%s گروه %s را ترک کرد."
 msgid "Fullname: %s"
 msgstr "نام کامل : %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "موقعیت : %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "صفحه خانگی : %s"
@@ -5354,6 +5426,11 @@ msgstr ""
 msgid "Go"
 msgstr "برو"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5490,11 +5567,11 @@ msgstr "وارد شدن با یک نام کاربری و کلمه ی عبور"
 msgid "Sign up for a new account"
 msgstr "عضویت برای حساب کاربری جدید"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "تاییدیه ی آدرس ایمیل"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5511,12 +5588,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%2$s از حالا به خبر های شما گوش میده  %1$s"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5531,17 +5608,17 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "موقعیت : %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "%s ادرس ایمیل جدید برای"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5560,21 +5637,21 @@ msgstr ""
 ", ازروی وفاداری خود شما \n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "وضعیت %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "تایید پیامک"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5590,12 +5667,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5614,12 +5691,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr " خبر شما را به علایق خود اضافه کرد %s (@%s)"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5640,12 +5717,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "به توجه شما یک خبر فرستاده شده %s (@%s)"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5889,10 +5966,6 @@ msgstr "پاسخ ها"
 msgid "Favorites"
 msgstr "چیزهای مورد علاقه"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "کاربر"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق دریافتی"
@@ -5918,7 +5991,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "اشتراک‌ها"
 
@@ -5926,23 +5999,23 @@ msgstr "اشتراک‌ها"
 msgid "All subscriptions"
 msgstr "تمام اشتراک‌ها"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "مشترک‌ها"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "تمام مشترک‌ها"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "شناسه کاربر"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "عضو شده از"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "تمام گروه‌ها"
 
@@ -5983,7 +6056,12 @@ msgstr "به این آگهی جواب دهید"
 msgid "Repeat this notice"
 msgstr ""
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "دسترسی کاربر را به گروه مسدود کن"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6137,47 +6215,62 @@ msgstr "پیام"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "پروفایل کاربر"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "چند ثانیه پیش"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "حدود یک دقیقه پیش"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "حدود %d دقیقه پیش"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "حدود یک ساعت پیش"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "حدود %d ساعت پیش"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "حدود یک روز پیش"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "حدود %d روز پیش"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "حدود یک ماه پیش"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "حدود %d ماه پیش"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "حدود یک سال پیش"
 
index 97ab7038b90a96a66b8132d8d844fcc1e7359c3b..68a63537b0e813551d6f298ef7fdda491d84dfcc 100644 (file)
@@ -10,19 +10,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:42+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:46+0000\n"
 "Language-Team: Finnish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: fi\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Hyväksy"
@@ -109,7 +110,7 @@ msgstr "Sivua ei ole."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -125,7 +126,7 @@ msgstr "%s ja kaverit, sivu %d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -186,7 +187,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Sinä ja kaverit"
 
@@ -213,11 +214,11 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metodia ei löytynyt!"
@@ -589,7 +590,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Käyttäjätili"
 
@@ -680,18 +681,6 @@ msgstr "%s / Käyttäjän %s suosikit"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr " Palvelun %s päivitykset, jotka %s / %s on merkinnyt suosikikseen."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s aikajana"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Käyttäjän %1$s päivitykset palvelussa %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -703,12 +692,12 @@ msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 "%1$s -päivitykset, jotka on vastauksia käyttäjän %2$s / %3$s päivityksiin."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s julkinen aikajana"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s päivitykset kaikilta!"
@@ -728,7 +717,7 @@ msgstr "Vastaukset käyttäjälle %s"
 msgid "Notices tagged with %s"
 msgstr "Päivitykset joilla on tagi %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Käyttäjän %1$s päivitykset palvelussa %2$s!"
@@ -768,7 +757,7 @@ msgstr "Voit ladata oman profiilikuvasi. Maksimikoko on %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Käyttäjälle ei löydy profiilia"
 
@@ -954,7 +943,7 @@ msgid "Conversation"
 msgstr "Keskustelu"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Päivitykset"
 
@@ -977,7 +966,7 @@ msgstr "Sinä et kuulu tähän ryhmään."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Istuntoavaimesi kanssa oli ongelma."
 
@@ -1178,8 +1167,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1308,7 +1298,7 @@ msgstr "kuvaus on liian pitkä (max %d merkkiä)."
 msgid "Could not update group."
 msgstr "Ei voitu päivittää ryhmää."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Ei voitu lisätä aliasta."
 
@@ -1435,7 +1425,7 @@ msgid "Cannot normalize that email address"
 msgstr "Ei voida normalisoida sähköpostiosoitetta"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Tuo ei ole kelvollinen sähköpostiosoite."
 
@@ -1629,6 +1619,25 @@ msgstr "Tiedostoa ei ole."
 msgid "Cannot read file."
 msgstr "Tiedostoa ei voi lukea."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Koko ei kelpaa."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Et voi lähettää viestiä tälle käyttäjälle."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Käyttäjä on asettanut eston sinulle."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1773,12 +1782,18 @@ msgstr "Tee ylläpitäjäksi"
 msgid "Make this user an admin"
 msgstr "Tee tästä käyttäjästä ylläpitäjä"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s aikajana"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Ryhmän  %1$s käyttäjien päivitykset palvelussa %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Ryhmät"
@@ -2403,8 +2418,8 @@ msgstr "Yhdistä"
 msgid "Only "
 msgstr "Vain "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Tuo ei ole tuettu tietomuoto."
 
@@ -2550,7 +2565,8 @@ msgstr "Uutta salasanaa ei voida tallentaa."
 msgid "Password saved."
 msgstr "Salasana tallennettu."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Polut"
 
@@ -2678,7 +2694,7 @@ msgstr "Taustakuvan hakemisto"
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Palauta"
@@ -2739,11 +2755,11 @@ msgstr "Ei sallittu henkilötagi: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Käyttäjät joilla henkilötagi %s - sivu %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Päivityksen sisältö ei kelpaa"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2825,7 +2841,7 @@ msgstr ""
 "Kuvaa itseäsi henkilötageilla (sanoja joissa voi olla muita kirjaimia kuin "
 "ääkköset, numeroita, -, ., ja _), pilkulla tai välilyönnillä erotettuna"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Kieli"
 
@@ -2853,7 +2869,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "\"Tietoja\" on liian pitkä (max 140 merkkiä)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Aikavyöhykettä ei ole valittu."
 
@@ -3162,7 +3178,7 @@ msgid "Same as password above. Required."
 msgstr "Sama kuin ylläoleva salasana. Pakollinen."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Sähköposti"
 
@@ -3272,7 +3288,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Profiilisi URL-osoite toisessa yhteensopivassa mikroblogauspalvelussa"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Tilaa"
 
@@ -3382,6 +3398,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Viesti käyttäjälle %1$s, %2$s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Et voi lähettää viestiä tälle käyttäjälle."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Käyttäjälle ei löydy profiilia"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3397,7 +3423,9 @@ msgstr "Et voi lähettää viestiä tälle käyttäjälle."
 msgid "User is already sandboxed."
 msgstr "Käyttäjä on asettanut eston sinulle."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3422,7 +3450,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3458,8 +3486,8 @@ msgstr "Sivutus"
 msgid "Description"
 msgstr "Kuvaus"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Tilastot"
 
@@ -3592,45 +3620,45 @@ msgstr "Aliakset"
 msgid "Group actions"
 msgstr "Ryhmän toiminnot"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Syöte ryhmän %s päivityksille (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Syöte ryhmän %s päivityksille (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Syöte ryhmän %s päivityksille (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Käyttäjän %s lähetetyt viestit"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Jäsenet"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Tyhjä)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Kaikki jäsenet"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Luotu"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3640,7 +3668,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3651,7 +3679,7 @@ msgstr ""
 "**%s** on ryhmä palvelussa %%%%site.name%%%%, joka on [mikroblogauspalvelu]"
 "(http://en.wikipedia.org/wiki/Micro-blogging)"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Ylläpitäjät"
 
@@ -3769,150 +3797,140 @@ msgid "User is already silenced."
 msgstr "Käyttäjä on asettanut eston sinulle."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr ""
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
+msgstr "Ulkoasuasetukset tälle StatusNet palvelulle."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Tuo ei ole kelvollinen sähköpostiosoite"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Palvelun ilmoitus"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Uusi sähköpostiosoite päivityksien lähettämiseen palveluun %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Paikalliset näkymät"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "Ensisijainen kieli"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Palvelun ilmoitus"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Uusi viesti"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Twitter-asetuksia ei voitu tallentaa!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Palvelun ilmoitus"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Palvelun ilmoitus"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -4016,6 +4034,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Koodia ei ole syötetty."
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Ensisijainen sivunavigointi"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Profiilikuva-asetukset"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Et ole tilannut tämän käyttäjän päivityksiä."
@@ -4221,7 +4299,7 @@ msgstr "Ei profiili id:tä kyselyssä."
 msgid "Unsubscribed"
 msgstr "Tilaus lopetettu"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4432,16 +4510,22 @@ msgstr "Ryhmän %s jäsenet, sivu %d"
 msgid "Search for more groups"
 msgstr "Hae lisää ryhmiä"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Sinä et kuulu tähän ryhmään."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Käyttäjän %1$s päivitykset palvelussa %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4485,7 +4569,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Omat"
@@ -4554,23 +4638,23 @@ msgstr "Viestin päivittäminen uudella URI-osoitteella ei onnistunut."
 msgid "DB error inserting hashtag: %s"
 msgstr "Tietokantavirhe tallennettaessa risutagiä: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Virhe tapahtui päivityksen tallennuksessa. Tuntematon käyttäjä."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Liian monta päivitystä liian nopeasti; pidä pieni hengähdystauko ja jatka "
 "päivityksien lähettämista muutaman minuutin päästä."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4578,20 +4662,20 @@ msgstr ""
 "Liian monta päivitystä liian nopeasti; pidä pieni hengähdystauko ja jatka "
 "päivityksien lähettämista muutaman minuutin päästä."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Päivityksesi tähän palveluun on estetty."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4619,7 +4703,12 @@ msgstr "Ei ole tilattu!."
 msgid "Couldn't delete self-subscription."
 msgstr "Ei voitu poistaa tilausta."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Ei voitu poistaa tilausta."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Ei voitu poistaa tilausta."
 
@@ -4628,20 +4717,20 @@ msgstr "Ei voitu poistaa tilausta."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Viesti käyttäjälle %1$s, %2$s"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Ryhmän luonti ei onnistunut."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Ryhmän jäsenyystietoja ei voitu asettaa."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Ryhmän jäsenyystietoja ei voitu asettaa."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Tilausta ei onnistuttu tallentamaan."
@@ -4684,195 +4773,188 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "Nimetön sivu"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Ensisijainen sivunavigointi"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Henkilökohtainen profiili ja kavereiden aikajana"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Omat"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Muuta sähköpostiosoitettasi, kuvaasi, salasanaasi, profiiliasi"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Käyttäjätili"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Ei voitu uudelleenohjata palvelimelle: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Yhdistä"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Ensisijainen sivunavigointi"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Ylläpito"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Kutsu kavereita ja työkavereita liittymään palveluun %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Kutsu"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Kirjaudu ulos palvelusta"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Kirjaudu ulos"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Luo uusi käyttäjätili"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Rekisteröidy"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Kirjaudu sisään palveluun"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Kirjaudu sisään"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Auta minua!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Ohjeet"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Hae ihmisiä tai tekstiä"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Haku"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Palvelun ilmoitus"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Paikalliset näkymät"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Sivuilmoitus"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Toissijainen sivunavigointi"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Ohjeet"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Tietoa"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "UKK"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Yksityisyys"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Lähdekoodi"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Ota yhteyttä"
 
-#: lib/action.php:782
+#: lib/action.php:771
 #, fuzzy
 msgid "Badge"
 msgstr "Tönäise"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet-ohjelmiston lisenssi"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4881,12 +4963,12 @@ msgstr ""
 "**%%site.name%%** on mikroblogipalvelu, jonka tarjoaa [%%site.broughtby%%](%%"
 "site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** on mikroblogipalvelu. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4897,54 +4979,54 @@ msgstr ""
 "versio %s, saatavilla lisenssillä [GNU Affero General Public License](http://"
 "www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNet-ohjelmiston lisenssi"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Kaikki "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "lisenssi."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Sivutus"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Myöhemmin"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Aiemmin"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4961,100 +5043,89 @@ msgid "Changes to that panel are not allowed."
 msgstr "Rekisteröityminen ei ole sallittu."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Komentoa ei ole vielä toteutettu."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Komentoa ei ole vielä toteutettu."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Twitter-asetuksia ei voitu tallentaa!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Sähköpostiosoitteen vahvistus"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Kutsu"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS vahvistus"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Ulkoasu"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS vahvistus"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Käyttäjä"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS vahvistus"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Hyväksy"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS vahvistus"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Polut"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS vahvistus"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Omat"
+msgid "Edit site notice"
+msgstr "Palvelun ilmoitus"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS vahvistus"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5247,12 +5318,12 @@ msgstr "%s erosi ryhmästä %s"
 msgid "Fullname: %s"
 msgstr "Koko nimi: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Kotipaikka: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Kotisivu: %s"
@@ -5557,6 +5628,11 @@ msgstr "Valitse tagi lyhentääksesi listaa"
 msgid "Go"
 msgstr "Mene"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "Ryhmän tai aiheen kotisivun tai blogin osoite"
@@ -5696,11 +5772,11 @@ msgstr "Kirjaudu sisään käyttäjätunnuksella ja salasanalla"
 msgid "Sign up for a new account"
 msgstr "Luo uusi käyttäjätili"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Sähköpostiosoitteen vahvistus"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5717,12 +5793,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s seuraa nyt päivityksiäsi palvelussa %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5747,19 +5823,19 @@ msgstr ""
 "----\n"
 "Voit vaihtaa sähköpostiosoitetta tai ilmoitusasetuksiasi %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Tietoja: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Uusi sähköpostiosoite päivityksien lähettämiseen palveluun %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5780,21 +5856,21 @@ msgstr ""
 "Terveisin,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s päivitys"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS vahvistus"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s tönäisi sinua"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5810,12 +5886,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Uusi yksityisviesti käyttäjältä %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5834,12 +5910,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s lisäsi päivityksesi suosikkeihinsa"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5860,12 +5936,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6114,10 +6190,6 @@ msgstr "Vastaukset"
 msgid "Favorites"
 msgstr "Suosikit"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Käyttäjä"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Saapuneet"
@@ -6144,7 +6216,7 @@ msgstr "Tagit käyttäjän %s päivityksissä"
 msgid "Unknown"
 msgstr "Tuntematon toiminto"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Tilaukset"
 
@@ -6152,24 +6224,24 @@ msgstr "Tilaukset"
 msgid "All subscriptions"
 msgstr "Kaikki tilaukset"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Tilaajat"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Kaikki tilaajat"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "Käyttäjä"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Käyttäjänä alkaen"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Kaikki ryhmät"
 
@@ -6212,7 +6284,12 @@ msgstr "Vastaa tähän päivitykseen"
 msgid "Repeat this notice"
 msgstr "Vastaa tähän päivitykseen"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Estä tätä käyttäjää osallistumassa tähän ryhmään"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6376,47 +6453,63 @@ msgstr "Viesti"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Käyttäjän profiili"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Ylläpitäjät"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "muutama sekunti sitten"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "noin minuutti sitten"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "noin %d minuuttia sitten"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "noin tunti sitten"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "noin %d tuntia sitten"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "noin päivä sitten"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "noin %d päivää sitten"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "noin kuukausi sitten"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "noin %d kuukautta sitten"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "noin vuosi sitten"
 
index 68e210ff1c88ba37230b47967fae3a8a9df104f2..4c9429e21651140617cdfc04d7e5a8f115224684 100644 (file)
@@ -14,19 +14,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:48+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:51+0000\n"
 "Language-Team: French\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: fr\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Accès"
 
@@ -47,7 +48,6 @@ msgstr "Interdire aux utilisateurs anonymes (non connectés) de voir le site ?"
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Privé"
@@ -78,7 +78,6 @@ msgid "Save access settings"
 msgstr "Sauvegarder les paramètres d’accès"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Enregistrer"
@@ -107,7 +106,7 @@ msgstr "Page non trouvée"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +122,7 @@ msgstr "%1$s et ses amis, page %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -187,7 +186,7 @@ msgstr ""
 "un clin d’œil à %s ou poster un avis à son intention."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Vous et vos amis"
 
@@ -214,11 +213,11 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Méthode API non trouvée !"
 
@@ -590,7 +589,7 @@ msgstr ""
 "devriez donner l’accès à votre compte %4$s qu’aux tiers à qui vous faites "
 "confiance."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Compte"
 
@@ -679,18 +678,6 @@ msgstr "%1$s / Favoris de %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s statuts favoris de %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Activité de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Statuts de %1$s dans %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -701,12 +688,12 @@ msgstr "%1$s / Mises à jour mentionnant %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s statuts en réponses aux statuts de %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Activité publique %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s statuts de tout le monde !"
@@ -726,7 +713,7 @@ msgstr "Reprises de %s"
 msgid "Notices tagged with %s"
 msgstr "Avis marqués avec %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Mises à jour marquées avec %1$s dans %2$s !"
@@ -768,7 +755,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Utilisateur sans profil correspondant"
 
@@ -954,7 +941,7 @@ msgid "Conversation"
 msgstr "Conversation"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Avis"
 
@@ -973,7 +960,7 @@ msgstr "Vous n’êtes pas le propriétaire de cette application."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Un problème est survenu avec votre jeton de session."
 
@@ -1169,8 +1156,9 @@ msgstr "Revenir aux valeurs par défaut"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1286,7 +1274,7 @@ msgstr "la description est trop longue (%d caractères maximum)."
 msgid "Could not update group."
 msgstr "Impossible de mettre à jour le groupe."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Impossible de créer les alias."
 
@@ -1410,7 +1398,7 @@ msgid "Cannot normalize that email address"
 msgstr "Impossible d’utiliser cette adresse courriel"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Adresse courriel invalide."
 
@@ -1602,6 +1590,22 @@ msgstr "Fichier non trouvé."
 msgid "Cannot read file."
 msgstr "Impossible de lire le fichier"
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Rôle invalide."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Ce rôle est réservé et ne peut pas être défini."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Vous ne pouvez pas attribuer des rôles aux utilisateurs sur ce site."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "L'utilisateur a déjà ce rôle."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1750,12 +1754,18 @@ msgstr "Faire un administrateur"
 msgid "Make this user an admin"
 msgstr "Faire de cet utilisateur un administrateur"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Activité de %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Mises à jour des membres de %1$s dans %2$s !"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Groupes"
@@ -2023,7 +2033,6 @@ msgstr "Ajouter un message personnel à l’invitation (optionnel)."
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Envoyer"
@@ -2394,8 +2403,8 @@ msgstr "type de contenu "
 msgid "Only "
 msgstr "Seulement "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Format de données non supporté."
 
@@ -2535,7 +2544,8 @@ msgstr "Impossible de sauvegarder le nouveau mot de passe."
 msgid "Password saved."
 msgstr "Mot de passe enregistré."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Chemins"
 
@@ -2655,7 +2665,7 @@ msgstr "Dossier des arrière plans"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Jamais"
 
@@ -2711,11 +2721,11 @@ msgstr "Cette marque est invalide : %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Utilisateurs marqués par eux-mêmes avec %1$s - page %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Contenu de l’avis invalide"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2797,7 +2807,7 @@ msgstr ""
 "Marques pour vous-même (lettres, chiffres, -, ., et _), séparées par des "
 "virgules ou des espaces"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Langue"
 
@@ -2825,7 +2835,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "La bio est trop longue (%d caractères maximum)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Aucun fuseau horaire n’a été choisi."
 
@@ -3148,7 +3158,7 @@ msgid "Same as password above. Required."
 msgstr "Identique au mot de passe ci-dessus. Requis."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Courriel"
 
@@ -3257,7 +3267,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL de votre profil sur un autre service de micro-blogging compatible"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "S’abonner"
 
@@ -3362,6 +3372,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Réponses à %1$s sur %2$s !"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Vous ne pouvez pas révoquer les rôles des utilisateurs sur ce site."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "L'utilisateur ne possède pas ce rôle."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3375,7 +3393,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr "L’utilisateur est déjà dans le bac à sable."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessions"
 
@@ -3399,7 +3419,7 @@ msgstr "Déboguage de session"
 msgid "Turn on debugging output for sessions."
 msgstr "Activer la sortie de déboguage pour les sessions."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Sauvegarder les paramètres du site"
@@ -3430,8 +3450,8 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistiques"
 
@@ -3573,45 +3593,45 @@ msgstr "Alias"
 msgid "Group actions"
 msgstr "Actions du groupe"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fil des avis du groupe %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fil des avis du groupe %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fil des avis du groupe %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "ami d’un ami pour le groupe %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membres"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(aucun)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Tous les membres"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Créé"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3627,7 +3647,7 @@ msgstr ""
 "action.register%%%%) pour devenir membre de ce groupe et bien plus ! ([En "
 "lire plus](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3640,7 +3660,7 @@ msgstr ""
 "logiciel libre [StatusNet](http://status.net/). Ses membres partagent des "
 "messages courts à propos de leur vie et leurs intérêts. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administrateurs"
 
@@ -3765,148 +3785,135 @@ msgid "User is already silenced."
 msgstr "Cet utilisateur est déjà réduit au silence."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Paramètres basiques pour ce site StatusNet."
+msgid "Basic settings for this StatusNet site"
+msgstr "Paramètres basiques pour ce site StatusNet"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Le nom du site ne peut pas être vide."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Vous devez avoir une adresse électronique de contact valide."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Langue « %s » inconnue."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "URL de rapport d’instantanés invalide."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Valeur de lancement d’instantanés invalide."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "La fréquence des instantanés doit être un nombre."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "La limite minimale de texte est de 140 caractères."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "La limite de doublon doit être d’une seconde ou plus."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Général"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nom du site"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Le nom de votre site, comme « Microblog de votre compagnie »"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Apporté par"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Texte utilisé pour le lien de crédits au bas de chaque page"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "Apporté par URL"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL utilisée pour le lien de crédits au bas de chaque page"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Adresse de courriel de contact de votre site"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Zone horaire par défaut"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Zone horaire par défaut pour ce site ; généralement UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr "Langue du site par défaut"
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Instantanés"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Au hasard lors des requêtes web"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Dans une tâche programée"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Instantanés de données"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Quand envoyer des données statistiques aux serveurs status.net"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
+msgstr "Langue par défaut"
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Fréquence"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Les instantanés seront envoyés une fois tous les N requêtes"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL de rapport"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Les instantanés seront envoyés à cette URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+"Langue du site lorsque la détection automatique des paramètres du navigateur "
+"n'est pas disponible"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limites"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Limite de texte"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Nombre maximal de caractères pour les avis."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Limite de doublons"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Combien de temps (en secondes) les utilisateurs doivent attendre pour poster "
 "la même chose de nouveau."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Avis du site"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Modifier un message portant sur tout le site"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Impossible d'enregistrer l'avis du site."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "La longueur maximale pour l'avis du site est de 255 caractères"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Texte de l'avis du site"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+"Texte de l'avis portant sur tout le site (max. 255 caractères ; HTML activé)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Enregistrer l'avis du site"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Paramètres SMS"
@@ -4010,6 +4017,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Aucun code entré"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Instantanés"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Gérer la configuration des instantanés"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Valeur de lancement d’instantanés invalide."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "La fréquence des instantanés doit être un nombre."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "URL de rapport d’instantanés invalide."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Au hasard lors des requêtes web"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Dans une tâche programée"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Instantanés de données"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Quand envoyer des données statistiques aux serveurs status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Fréquence"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Les instantanés seront envoyés une fois tous les N requêtes"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL de rapport"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Les instantanés seront envoyés à cette URL"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Sauvegarder les paramètres des instantanés"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Vous n’êtes pas abonné(e) à ce profil."
@@ -4220,7 +4285,7 @@ msgstr "Aucune identité de profil dans la requête."
 msgid "Unsubscribed"
 msgstr "Désabonné"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4230,7 +4295,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Utilisateur"
@@ -4427,18 +4491,24 @@ msgstr "Groupes %1$s, page %2$d"
 msgid "Search for more groups"
 msgstr "Rechercher pour plus de groupes"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s n’est pas membre d’un groupe."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Essayez de [rechercher un groupe](%%action.groupsearch%%) et de vous y "
 "inscrire."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Statuts de %1$s dans %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4494,7 +4564,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Extensions"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Version"
 
@@ -4559,22 +4629,22 @@ msgstr "Impossible de mettre à jour le message avec un nouvel URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erreur de base de donnée en insérant la marque (hashtag) : %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problème lors de l’enregistrement de l’avis ; trop long."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Erreur lors de l’enregistrement de l’avis. Utilisateur inconnu."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Trop d’avis, trop vite ! Faites une pause et publiez à nouveau dans quelques "
 "minutes."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4582,19 +4652,19 @@ msgstr ""
 "Trop de messages en double trop vite ! Prenez une pause et publiez à nouveau "
 "dans quelques minutes."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Il vous est interdit de poster des avis sur ce site."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problème lors de l’enregistrement de l’avis."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problème lors de l’enregistrement de la boîte de réception du groupe."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4619,7 +4689,11 @@ msgstr "Pas abonné !"
 msgid "Couldn't delete self-subscription."
 msgstr "Impossible de supprimer l’abonnement à soi-même."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Impossible de supprimer le jeton OMB de l'abonnement ."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Impossible de cesser l’abonnement"
 
@@ -4628,20 +4702,19 @@ msgstr "Impossible de cesser l’abonnement"
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bienvenue à %1$s, @%2$s !"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Impossible de créer le groupe."
 
-#: classes/User_group.php:471
-#, fuzzy
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Impossible de définir l'URI du groupe."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Impossible d’établir l’inscription au groupe."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Impossible d’enregistrer les informations du groupe local."
 
@@ -4682,194 +4755,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Page sans nom"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navigation primaire du site"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profil personnel et flux des amis"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personnel"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
-msgstr "Modifier votre courriel, avatar, mot de passe, profil"
-
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Compte"
+msgstr "Modifier votre adresse électronique, avatar, mot de passe, profil"
 
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Se connecter aux services"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Connecter"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modifier la configuration du site"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrer"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
-msgstr "Inviter des amis et collègues à vous rejoindre dans %s"
+msgstr "Inviter des amis et collègues à vous rejoindre sur %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Inviter"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Fermer la session"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
-msgstr "Fermeture de session"
+msgstr "Déconnexion"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Créer un compte"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
-msgstr "Créer un compte"
+msgstr "S'inscrire"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Ouvrir une session"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
-msgstr "Ouvrir une session"
+msgstr "Connexion"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "À l’aide !"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Aide"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Rechercher des personnes ou du texte"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Rechercher"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Notice du site"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Vues locales"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Avis de la page"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navigation secondaire du site"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Aide"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "À propos"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "CGU"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Confidentialité"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Source"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Insigne"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licence du logiciel StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4878,12 +4927,12 @@ msgstr ""
 "**%%site.name%%** est un service de microblogging qui vous est proposé par  "
 "[%%site.broughtby%%](%%site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** est un service de micro-blogging."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4894,57 +4943,57 @@ msgstr ""
 "version %s, disponible sous la licence [GNU Affero General Public License] "
 "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licence du contenu du site"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Le contenu et les données de %1$s sont privés et confidentiels."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Le contenu et les données sont sous le droit d’auteur de %1$s. Tous droits "
 "réservés."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Le contenu et les données sont sous le droit d’auteur du contributeur. Tous "
 "droits réservés."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Tous "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Après"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Avant"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Impossible de gérer le contenu distant pour le moment."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Impossible de gérer le contenu XML embarqué pour le moment."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Impossible de gérer le contenu en Base64 embarqué pour le moment."
 
@@ -4959,91 +5008,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "La modification de ce panneau n’est pas autorisée."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() n’a pas été implémentée."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() n’a pas été implémentée."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Impossible de supprimer les paramètres de conception."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuration basique du site"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Site"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuration de la conception"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Conception"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Configuration utilisateur"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Utilisateur"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Configuration d’accès"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Accès"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configuration des chemins"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Chemins"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Configuration des sessions"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessions"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Modifier l'avis du site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Configuration des instantanés"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5236,12 +5270,12 @@ msgstr "%s a quitté le groupe %s"
 msgid "Fullname: %s"
 msgstr "Nom complet : %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Emplacement : %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Site Web : %s"
@@ -5581,6 +5615,11 @@ msgstr "Choissez une marque pour réduire la liste"
 msgid "Go"
 msgstr "Aller"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Accorder le rôle « %s » à cet utilisateur"
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL du site Web ou blogue du groupe ou sujet "
@@ -5721,11 +5760,11 @@ msgstr "Ouvrez une session avec un identifiant et un mot de passe"
 msgid "Sign up for a new account"
 msgstr "Créer un nouveau compte"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmation de l’adresse courriel"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5755,12 +5794,12 @@ msgstr ""
 "Merci de votre attention,\n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s suit maintenant vos avis sur %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5785,17 +5824,17 @@ msgstr ""
 "----\n"
 "Changez votre adresse de courriel ou vos options de notification sur %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Bio : %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nouvelle adresse courriel pour poster dans %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5816,21 +5855,21 @@ msgstr ""
 "Cordialement,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Statut de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmation SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Vous avez reçu un clin d’œil de %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5857,12 +5896,12 @@ msgstr ""
 "Bien à vous,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nouveau message personnel de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5895,12 +5934,12 @@ msgstr ""
 "Bien à vous,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) a ajouté un de vos avis à ses favoris"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5938,12 +5977,12 @@ msgstr ""
 "Cordialement,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) vous a envoyé un avis"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6075,7 +6114,6 @@ msgid "Available characters"
 msgstr "Caractères restants"
 
 #: lib/messageform.php:178 lib/noticeform.php:236
-#, fuzzy
 msgctxt "Send button for sending notice"
 msgid "Send"
 msgstr "Envoyer"
@@ -6202,10 +6240,6 @@ msgstr "Réponses"
 msgid "Favorites"
 msgstr "Favoris"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Utilisateur"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Boîte de réception"
@@ -6231,7 +6265,7 @@ msgstr "Marques dans les avis de %s"
 msgid "Unknown"
 msgstr "Inconnu"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abonnements"
 
@@ -6239,23 +6273,23 @@ msgstr "Abonnements"
 msgid "All subscriptions"
 msgstr "Tous les abonnements"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abonnés"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Tous les abonnés"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID de l’utilisateur"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membre depuis"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Tous les groupes"
 
@@ -6295,7 +6329,12 @@ msgstr "Reprendre cet avis ?"
 msgid "Repeat this notice"
 msgstr "Reprendre cet avis"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Révoquer le rôle « %s » de cet utilisateur"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Aucun utilisateur unique défini pour le mode mono-utilisateur."
 
@@ -6449,47 +6488,61 @@ msgstr "Message"
 msgid "Moderate"
 msgstr "Modérer"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Rôle de l'utilisateur"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrateur"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Modérateur"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "il y a quelques secondes"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "il y a 1 minute"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "il y a %d minutes"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "il y a 1 heure"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "il y a %d heures"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "il y a 1 jour"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "il y a %d jours"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "il y a 1 mois"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "il y a %d mois"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "il y a environ 1 an"
 
index 0b62fe337c5f366aff2d5ca0b284d422301ea7ea..dea9dd11c1a04e4e4bd9d0e353e0b3d1c9b30675 100644 (file)
@@ -8,12 +8,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:51+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:54+0000\n"
 "Language-Team: Irish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ga\n"
 "X-Message-Group: out-statusnet\n"
@@ -21,7 +21,8 @@ msgstr ""
 "4;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Aceptar"
@@ -109,7 +110,7 @@ msgstr "Non existe a etiqueta."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -125,7 +126,7 @@ msgstr "%s e amigos"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +181,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s e amigos"
@@ -208,11 +209,11 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Método da API non atopado"
@@ -585,7 +586,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "Sobre"
@@ -679,18 +680,6 @@ msgstr "%s / Favoritos dende %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s updates favorited by %s / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Liña de tempo de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Actualizacións dende %1$s en %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -701,12 +690,12 @@ msgstr "%1$s / Chíos que respostan a %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "Hai %1$s chíos en resposta a chíos dende %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Liña de tempo pública de %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s chíos de calquera!"
@@ -726,7 +715,7 @@ msgstr "Replies to %s"
 msgid "Notices tagged with %s"
 msgstr "Chíos tagueados con %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualizacións dende %1$s en %2$s!"
@@ -767,7 +756,7 @@ msgstr "Podes actualizar a túa información do perfil persoal aquí"
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Usuario sen un perfil que coincida."
 
@@ -965,7 +954,7 @@ msgid "Conversation"
 msgstr "Código de confirmación."
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Chíos"
 
@@ -987,7 +976,7 @@ msgstr "Non estás suscrito a ese perfil"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "Houbo un problema co teu token de sesión. Tentao de novo, anda..."
@@ -1196,8 +1185,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1329,7 +1319,7 @@ msgstr "O teu Bio é demasiado longo (max 140 car.)."
 msgid "Could not update group."
 msgstr "Non se puido actualizar o usuario."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Non se puido crear o favorito."
@@ -1457,7 +1447,7 @@ msgid "Cannot normalize that email address"
 msgstr "Esa dirección de correo non se pode normalizar "
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Non é un enderezo de correo válido."
 
@@ -1653,6 +1643,25 @@ msgstr "Ningún chío."
 msgid "Cannot read file."
 msgstr "Bloqueo de usuario fallido."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Tamaño inválido."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Non podes enviar mensaxes a este usurio."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "O usuario bloqueoute."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1807,12 +1816,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Liña de tempo de %s"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Actualizacións dende %1$s en %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr ""
@@ -2434,8 +2449,8 @@ msgstr "Conectar"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Non é un formato de datos soportado."
 
@@ -2583,7 +2598,8 @@ msgstr "Non se pode gardar a contrasinal."
 msgid "Password saved."
 msgstr "Contrasinal gardada."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2711,7 +2727,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Recuperar"
@@ -2770,11 +2786,11 @@ msgstr "%s non é unha etiqueta de xente válida"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Usuarios auto-etiquetados como %s - páxina %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Contido do chío inválido"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2857,7 +2873,7 @@ msgstr ""
 "Etiquetas para o teu usuario (letras, números, -, ., e _), separados por "
 "coma ou espazo"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Linguaxe"
 
@@ -2885,7 +2901,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "O teu Bio é demasiado longo (max 140 car.)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Fuso Horario non seleccionado"
 
@@ -3205,7 +3221,7 @@ msgid "Same as password above. Required."
 msgstr "A mesma contrasinal que arriba. Requerido."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Correo Electrónico"
 
@@ -3313,7 +3329,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Enderezo do teu perfil en outro servizo de microblogaxe compatíbel"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subscribir"
 
@@ -3418,6 +3434,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Mensaxe de %1$s en %2$s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Non podes enviar mensaxes a este usurio."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Usuario sen un perfil que coincida."
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3433,7 +3459,9 @@ msgstr "Non podes enviar mensaxes a este usurio."
 msgid "User is already sandboxed."
 msgstr "O usuario bloqueoute."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3457,7 +3485,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3494,8 +3522,8 @@ msgstr "Invitación(s) enviada(s)."
 msgid "Description"
 msgstr "Subscricións"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Estatísticas"
 
@@ -3631,48 +3659,48 @@ msgstr ""
 msgid "Group actions"
 msgstr "Outras opcions"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Band. Saída para %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Membro dende"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 #, fuzzy
 msgid "(None)"
 msgstr "(nada)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Crear"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3686,7 +3714,7 @@ msgstr ""
 "(http://status.net/). [Únete agora](%%action.register%%) para compartir "
 "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3699,7 +3727,7 @@ msgstr ""
 "(http://status.net/). [Únete agora](%%action.register%%) para compartir "
 "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3820,150 +3848,139 @@ msgid "User is already silenced."
 msgstr "O usuario bloqueoute."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Non é unha dirección de correo válida"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Novo chío"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Nova dirección de email para posterar en %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Localización"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "Linguaxe preferida"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Novo chío"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nova mensaxe"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Non se puideron gardar os teus axustes de Twitter!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Novo chío"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Novo chío"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -4068,6 +4085,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Non se inseriu ningún código"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Navegación de subscricións"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Configuracións de Twitter"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Non estás suscrito a ese perfil"
@@ -4275,7 +4352,7 @@ msgstr "Non hai identificador de perfil na peticion."
 msgid "Unsubscribed"
 msgstr "De-suscribido"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4488,16 +4565,22 @@ msgstr "Tódalas subscricións"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "%1s non é unha orixe fiable."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Actualizacións dende %1$s en %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4541,7 +4624,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Persoal"
@@ -4610,23 +4693,23 @@ msgstr "Non se puido actualizar a mensaxe coa nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro ó inserir o hashtag na BD: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Aconteceu un erro ó gardar o chío. Usuario descoñecido."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Demasiados chíos en pouco tempo; tomate un respiro e envíao de novo dentro "
 "duns minutos."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4635,20 +4718,20 @@ msgstr ""
 "Demasiados chíos en pouco tempo; tomate un respiro e envíao de novo dentro "
 "duns minutos."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Tes restrinxido o envio de chíos neste sitio."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4676,7 +4759,12 @@ msgstr "Non está suscrito!"
 msgid "Couldn't delete self-subscription."
 msgstr "Non se pode eliminar a subscrición."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Non se pode eliminar a subscrición."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Non se pode eliminar a subscrición."
 
@@ -4685,22 +4773,22 @@ msgstr "Non se pode eliminar a subscrición."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Mensaxe de %1$s en %2$s"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "Non se puido crear o favorito."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Non se pode gardar a subscrición."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Non se pode gardar a subscrición."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Non se pode gardar a subscrición."
@@ -4744,62 +4832,54 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Persoal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambiar contrasinal"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Sobre"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Non se pode redireccionar ao servidor: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Conectar"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Navegación de subscricións"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
@@ -4807,131 +4887,132 @@ msgstr ""
 "Emprega este formulario para invitar ós teus amigos e colegas a empregar "
 "este servizo."
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invitar"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Sair"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear nova conta"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Rexistrar"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Inicio de sesión"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Axuda"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Axuda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Buscar"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "Novo chío"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "Novo chío"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Navegación de subscricións"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Axuda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Preguntas frecuentes"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4940,12 +5021,12 @@ msgstr ""
 "**%%site.name%%** é un servizo de microbloguexo que che proporciona [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é un servizo de microbloguexo."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4956,57 +5037,57 @@ msgstr ""
 "%s, dispoñible baixo licenza [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "Atopar no contido dos chíos"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 #, fuzzy
 msgid "All "
 msgstr "Todos"
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "« Despois"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "Antes »"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -5023,99 +5104,89 @@ msgid "Changes to that panel are not allowed."
 msgstr "Non se permite o rexistro neste intre."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Comando non implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Comando non implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Non se puideron gardar os teus axustes de Twitter!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Confirmar correo electrónico"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Invitar"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "Confirmación de SMS"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Persoal"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Confirmación de SMS"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Usuario"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Confirmación de SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Aceptar"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Confirmación de SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Confirmación de SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Persoal"
+msgid "Edit site notice"
+msgstr "Novo chío"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Confirmación de SMS"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5312,12 +5383,12 @@ msgstr "%s / Favoritos dende %s"
 msgid "Fullname: %s"
 msgstr "Nome completo: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Ubicación: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Páxina persoal: %s"
@@ -5659,6 +5730,11 @@ msgstr "Elixe unha etiqueta para reducila lista"
 msgid "Go"
 msgstr "Ir"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5805,11 +5881,11 @@ msgstr "Accede co teu nome de usuario e contrasinal."
 msgid "Sign up for a new account"
 msgstr "Crear nova conta"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmar correo electrónico"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5838,12 +5914,12 @@ msgstr ""
 "Grazas polo teu tempo, \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s está a escoitar os teus chíos %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5864,17 +5940,17 @@ msgstr ""
 "Atentamente todo seu,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "Ubicación: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nova dirección de email para posterar en %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5895,21 +5971,21 @@ msgstr ""
 "Sempre teu...,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Estado de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmación de SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s douche un toque"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5935,12 +6011,12 @@ msgstr ""
 "With kind regards,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "%s enviouche unha nova mensaxe privada"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5973,12 +6049,12 @@ msgstr ""
 "With kind regards,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s gustoulle o teu chío"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, fuzzy, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -6011,12 +6087,12 @@ msgstr ""
 "Fielmente teu,\n"
 "%5$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6273,10 +6349,6 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Usuario"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Band. Entrada"
@@ -6303,7 +6375,7 @@ msgstr "O usuario non ten último chio."
 msgid "Unknown"
 msgstr "Acción descoñecida"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subscricións"
 
@@ -6311,25 +6383,25 @@ msgstr "Subscricións"
 msgid "All subscriptions"
 msgstr "Tódalas subscricións"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subscritores"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "Subscritores"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "Usuario"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membro dende"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 #, fuzzy
 msgid "All groups"
 msgstr "Tódalas etiquetas"
@@ -6374,7 +6446,12 @@ msgstr "Non se pode eliminar este chíos."
 msgid "Repeat this notice"
 msgstr "Non se pode eliminar este chíos."
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr ""
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6546,47 +6623,62 @@ msgstr "Nova mensaxe"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "O usuario non ten perfil."
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "fai uns segundos"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "fai un minuto"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fai %d minutos"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "fai unha hora"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "fai %d horas"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "fai un día"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "fai %d días"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "fai un mes"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "fai %d meses"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "fai un ano"
 
index 89fd4dd7adccb702cbdbde9a3d56f051b43bf3ca..49f229a96a00c6d2454bbe776b220e7bb4ea71fb 100644 (file)
@@ -7,19 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:54+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:49:57+0000\n"
 "Language-Team: Hebrew\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: he\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "קבל"
@@ -106,7 +107,7 @@ msgstr "אין הודעה כזו."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -122,7 +123,7 @@ msgstr "%s וחברים"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -177,7 +178,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s וחברים"
@@ -205,11 +206,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "קוד האישור לא נמצא."
@@ -578,7 +579,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "אודות"
@@ -670,18 +671,6 @@ msgstr "הסטטוס של %1$s ב-%2$s "
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "מיקרובלוג מאת %s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -692,12 +681,12 @@ msgstr "הסטטוס של %1$s ב-%2$s "
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -717,7 +706,7 @@ msgstr "תגובת עבור %s"
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "מיקרובלוג מאת %s"
@@ -759,7 +748,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -954,7 +943,7 @@ msgid "Conversation"
 msgstr "מיקום"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "הודעות"
 
@@ -976,7 +965,7 @@ msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1180,8 +1169,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1307,7 +1297,7 @@ msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיו
 msgid "Could not update group."
 msgstr "עידכון המשתמש נכשל."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "שמירת מידע התמונה נכשל"
@@ -1431,7 +1421,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr ""
 
@@ -1626,6 +1616,25 @@ msgstr "אין הודעה כזו."
 msgid "Cannot read file."
 msgstr "אין הודעה כזו."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "גודל לא חוקי."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "לא שלחנו אלינו את הפרופיל הזה"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "למשתמש אין פרופיל."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1778,12 +1787,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "מיקרובלוג מאת %s"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "קבוצות"
@@ -2365,8 +2380,8 @@ msgstr "התחבר"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2514,7 +2529,8 @@ msgstr "לא ניתן לשמור את הסיסמה"
 msgid "Password saved."
 msgstr "הסיסמה נשמרה."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2641,7 +2657,7 @@ msgstr ""
 msgid "SSL"
 msgstr "סמס"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "שיחזור"
@@ -2700,11 +2716,11 @@ msgstr "לא עומד בכללים ל-OpenID."
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "מיקרובלוג מאת %s"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "תוכן ההודעה לא חוקי"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2782,7 +2798,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "שפה"
 
@@ -2808,7 +2824,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיות)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3113,7 +3129,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr ""
 
@@ -3201,7 +3217,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "כתובת הפרופיל שלך בשרות ביקרובלוג תואם אחר"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "הירשם כמנוי"
 
@@ -3304,6 +3320,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "תגובת עבור %s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "לא שלחנו אלינו את הפרופיל הזה"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "למשתמש אין פרופיל."
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3319,7 +3345,9 @@ msgstr "לא שלחנו אלינו את הפרופיל הזה"
 msgid "User is already sandboxed."
 msgstr "למשתמש אין פרופיל."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3343,7 +3371,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3379,8 +3407,8 @@ msgstr "מיקום"
 msgid "Description"
 msgstr "הרשמות"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "סטטיסטיקה"
 
@@ -3514,47 +3542,47 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "חבר מאז"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "צור"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3564,7 +3592,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3573,7 +3601,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3685,147 +3713,136 @@ msgid "User is already silenced."
 msgstr "למשתמש אין פרופיל."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr ""
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "הודעה חדשה"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr ""
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "מיקום"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "הודעה חדשה"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "הודעה חדשה"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "בעיה בשמירת ההודעה."
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "הודעה חדשה"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "הודעה חדשה"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3922,6 +3939,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "הרשמות"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "הגדרות"
+
 #: actions/subedit.php:70
 #, fuzzy
 msgid "You are not subscribed to that profile."
@@ -4130,7 +4207,7 @@ msgstr "השרת לא החזיר כתובת פרופיל"
 msgid "Unsubscribed"
 msgstr "בטל מנוי"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4337,16 +4414,22 @@ msgstr "כל המנויים"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4390,7 +4473,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "אישי"
@@ -4458,41 +4541,41 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4520,7 +4603,12 @@ msgstr "לא מנוי!"
 msgid "Couldn't delete self-subscription."
 msgstr "מחיקת המנוי לא הצליחה."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "מחיקת המנוי לא הצליחה."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "מחיקת המנוי לא הצליחה."
 
@@ -4529,22 +4617,22 @@ msgstr "מחיקת המנוי לא הצליחה."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "שמירת מידע התמונה נכשל"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "יצירת המנוי נכשלה."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "יצירת המנוי נכשלה."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "יצירת המנוי נכשלה."
@@ -4588,192 +4676,185 @@ msgstr "הסטטוס של %1$s ב-%2$s "
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "אישי"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "שנה סיסמה"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "אודות"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "נכשלה ההפניה לשרת: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "התחבר"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "הרשמות"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "גודל לא חוקי."
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "צא"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "צור חשבון חדש"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "הירשם"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "היכנס"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "עזרה"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "עזרה"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "חיפוש"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "הרשמות"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "עזרה"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "אודות"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "רשימת שאלות נפוצות"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "פרטיות"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "מקור"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "צור קשר"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4782,12 +4863,12 @@ msgstr ""
 "**%%site.name%%** הוא שרות ביקרובלוג הניתן על ידי [%%site.broughtby%%](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** הוא שרות ביקרובלוג."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4798,56 +4879,56 @@ msgstr ""
 "s, המופצת תחת רשיון [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)"
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "<< אחרי"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "לפני >>"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4862,95 +4943,85 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "הרשמות"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "הודעה חדשה"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "אישי"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "הרשמות"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "מתשמש"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "הרשמות"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "קבל"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "הרשמות"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "הרשמות"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "אישי"
+msgid "Edit site notice"
+msgstr "הודעה חדשה"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "הרשמות"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5145,12 +5216,12 @@ msgstr "הסטטוס של %1$s ב-%2$s "
 msgid "Fullname: %s"
 msgstr "שם מלא"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5455,6 +5526,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5600,11 +5676,11 @@ msgstr "שם המשתמש או הסיסמה לא חוקיים"
 msgid "Sign up for a new account"
 msgstr "צור חשבון חדש"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr ""
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5621,12 +5697,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s כעת מאזין להודעות שלך ב-%2$s"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5646,17 +5722,17 @@ msgstr ""
 " שלך,\n"
 " %4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "אודות: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5669,21 +5745,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr ""
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5699,12 +5775,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5723,12 +5799,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%1$s כעת מאזין להודעות שלך ב-%2$s"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5749,12 +5825,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6005,10 +6081,6 @@ msgstr "תגובות"
 msgid "Favorites"
 msgstr "מועדפים"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "מתשמש"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -6034,7 +6106,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "הרשמות"
 
@@ -6042,25 +6114,25 @@ msgstr "הרשמות"
 msgid "All subscriptions"
 msgstr "כל המנויים"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "מנויים"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "מנויים"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "מתשמש"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "חבר מאז"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -6104,7 +6176,12 @@ msgstr "אין הודעה כזו."
 msgid "Repeat this notice"
 msgstr "אין הודעה כזו."
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "אין משתמש כזה."
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6269,47 +6346,62 @@ msgstr "הודעה חדשה"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "למשתמש אין פרופיל."
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "לפני מספר שניות"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "לפני כדקה"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "לפני כ-%d דקות"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "לפני כשעה"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "לפני כ-%d שעות"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "לפני כיום"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "לפני כ-%d ימים"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "לפני כחודש"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "לפני כ-%d חודשים"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "לפני כשנה"
 
index f46e7357ad184577bac5f806137118722361c7aa..91d9c9c73cd564930d44f1c657f497dce29f0e45 100644 (file)
@@ -9,12 +9,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:02:57+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:00+0000\n"
 "Language-Team: Dutch\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: hsb\n"
 "X-Message-Group: out-statusnet\n"
@@ -22,7 +22,8 @@ msgstr ""
 "n%100==4) ? 2 : 3)\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Přistup"
 
@@ -106,7 +107,7 @@ msgstr "Strona njeeksistuje"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -122,7 +123,7 @@ msgstr "%1$s a přećeljo, strona %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -177,7 +178,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Ty a přećeljo"
 
@@ -204,11 +205,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metoda njenamakana."
 
@@ -563,7 +564,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -650,18 +651,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -672,12 +661,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -697,7 +686,7 @@ msgstr ""
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -738,7 +727,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Wužiwar bjez hodźaceho so profila"
 
@@ -921,7 +910,7 @@ msgid "Conversation"
 msgstr "Konwersacija"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Zdźělenki"
 
@@ -942,7 +931,7 @@ msgstr "Njejsy wobsedźer tuteje aplikacije."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1133,8 +1122,9 @@ msgstr "Na standard wróćo stajić"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1252,7 +1242,7 @@ msgstr "wopisanje je předołho (maks. %d znamješkow)."
 msgid "Could not update group."
 msgstr "Skupina njeje so dała aktualizować."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Aliasy njejsu so dali wutworić."
 
@@ -1372,7 +1362,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Njepłaćiwa e-mejlowa adresa."
 
@@ -1556,6 +1546,25 @@ msgstr "Dataja njeeksistuje."
 msgid "Cannot read file."
 msgstr "Dataja njeda so čitać."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Njepłaćiwa wulkosć."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Njemóžeš tutomu wužiwarju powěsć pósłać."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Wužiwar nima profil."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1698,12 +1707,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr "Tutoho wužiwarja k administratorej činić"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Skupiny"
@@ -2258,8 +2273,8 @@ msgstr ""
 msgid "Only "
 msgstr "Jenož "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Njeje podpěrany datowy format."
 
@@ -2398,7 +2413,8 @@ msgstr ""
 msgid "Password saved."
 msgstr "Hesło składowane."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Šćežki"
 
@@ -2518,7 +2534,7 @@ msgstr "Pozadkowy zapis"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Ženje"
 
@@ -2571,11 +2587,11 @@ msgstr ""
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr ""
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Njepłaćiwy wobsah zdźělenki"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2651,7 +2667,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Rěč"
 
@@ -2677,7 +2693,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Biografija je předołha (maks. %d znamješkow)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Časowe pasmo njeje wubrane."
 
@@ -2976,7 +2992,7 @@ msgid "Same as password above. Required."
 msgstr "Jenake kaž hesło horjeka. Trěbne."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mejl"
 
@@ -3060,7 +3076,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Abonować"
 
@@ -3156,6 +3172,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Njemóžeš tutomu wužiwarju powěsć pósłać."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Wužiwar bjez hodźaceho so profila."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3168,7 +3194,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Posedźenja"
 
@@ -3193,7 +3221,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Sydłowe nastajenja składować"
@@ -3224,8 +3252,8 @@ msgstr "Organizacija"
 msgid "Description"
 msgstr "Wopisanje"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistika"
 
@@ -3358,45 +3386,45 @@ msgstr "Aliasy"
 msgid "Group actions"
 msgstr "Skupinske akcije"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Čłonojo"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Žadyn)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Wšitcy čłonojo"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Wutworjeny"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3406,7 +3434,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3415,7 +3443,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administratorojo"
 
@@ -3525,146 +3553,137 @@ msgid "User is already silenced."
 msgstr ""
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr ""
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
+msgstr "Designowe nastajenja za tute sydło StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Dyrbiš płaćiwu kontaktowu e-mejlowu adresu měć."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Njeznata rěč \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Powšitkowny"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Sydłowe mjeno"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr ""
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Lokalny"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Standardne časowe pasmo"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Standardna sydłowa rěč"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr ""
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frekwenca"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limity"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Tekstowy limit"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Maksimalna ličba znamješkow za zdźělenki."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Zdźělenki"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nowa powěsć"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Wužiwar nima poslednju powěsć"
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Njepłaćiwy wobsah zdźělenki"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Sydłowe nastajenja składować"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "SMS-nastajenja"
@@ -3757,6 +3776,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Žadyn kod zapodaty"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "SMS-wobkrućenje"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frekwenca"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Sydłowe nastajenja składować"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Njejsy tón profil abonował."
@@ -3952,7 +4031,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr "Wotskazany"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4143,16 +4222,22 @@ msgstr "%1$s skupinskich čłonow, strona %2$d"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4196,7 +4281,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Wersija"
 
@@ -4260,38 +4345,38 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4316,7 +4401,12 @@ msgstr "Njeje abonowany!"
 msgid "Couldn't delete self-subscription."
 msgstr "Sebjeabonement njeje so dał zničić."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Abonoment njeje so dał zničić."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Abonoment njeje so dał zničić."
 
@@ -4325,20 +4415,20 @@ msgstr "Abonoment njeje so dał zničić."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Skupina njeje so dała aktualizować."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr ""
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Profil njeje so składować dał."
@@ -4380,63 +4470,55 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Strona bjez titula"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Wosobinski"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Změń swoje hesło."
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Zwiski"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Zwjazać"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "SMS-wobkrućenje"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
@@ -4444,143 +4526,144 @@ msgstr ""
 "Wužij tutón formular, zo by swojich přećelow a kolegow přeprosył, zo bychu "
 "tutu słužbu wužiwali."
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Přeprosyć"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Šat za sydło."
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Logo"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Konto załožić"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrować"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Při sydle přizjewić"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Přizjewić"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomhaj!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Pomoc"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Za ludźimi abo tekstom pytać"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Pytać"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Pomoc"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Wo"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Huste prašenja"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Priwatnosć"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Žórło"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4588,53 +4671,53 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr ""
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4649,94 +4732,83 @@ msgid "Changes to that panel are not allowed."
 msgstr "Změny na tutym woknje njejsu dowolene."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Sydło"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Design"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS-wobkrućenje"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Wužiwar"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS-wobkrućenje"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Přistup"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Šćežki"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS-wobkrućenje"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Posedźenja"
+msgid "Edit site notice"
+msgstr "Dwójna zdźělenka"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS-wobkrućenje"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -4920,12 +4992,12 @@ msgstr "%s je skupinu %s wopušćił"
 msgid "Fullname: %s"
 msgstr "Dospołne mjeno: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Městno: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5224,6 +5296,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5359,11 +5436,11 @@ msgstr "Přizjewjenje z wužiwarskim mjenom a hesłom"
 msgid "Sign up for a new account"
 msgstr "Nowe konto registrować"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Wobkrućenje e-mejloweje adresy"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5380,12 +5457,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr ""
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5400,17 +5477,17 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Biografija: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5423,21 +5500,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr ""
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS-wobkrućenje"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5453,12 +5530,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nowa priwatna powěsć wot %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5477,12 +5554,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) je twoju zdźělenku jako faworit přidał"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5503,12 +5580,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5748,10 +5825,6 @@ msgstr "Wotmołwy"
 msgid "Favorites"
 msgstr "Fawority"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Wužiwar"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5777,7 +5850,7 @@ msgstr ""
 msgid "Unknown"
 msgstr "Njeznaty"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abonementy"
 
@@ -5785,23 +5858,23 @@ msgstr "Abonementy"
 msgid "All subscriptions"
 msgstr "Wšě abonementy"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abonenća"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Wšitcy abonenća"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Wužiwarski ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Čłon wot"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Wšě skupiny"
 
@@ -5841,7 +5914,12 @@ msgstr "Tutu zdźělenku wospjetować?"
 msgid "Repeat this notice"
 msgstr "Tutu zdźělenku wospjetować"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Tutoho wužiwarja za tutu skupinu blokować"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5995,47 +6073,63 @@ msgstr "Powěsć"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Wužiwarski profil"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administratorojo"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "před něšto sekundami"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "před něhdźe jednej mjeńšinu"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "před %d mjeńšinami"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "před něhdźe jednej hodźinu"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "před něhdźe %d hodźinami"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "před něhdźe jednym dnjom"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "před něhdźe %d dnjemi"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "před něhdźe jednym měsacom"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "před něhdźe %d měsacami"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "před něhdźe jednym lětom"
 
index cc6af7f0f783c84e92c61bfaadb3a84488d56123..7a96686ed2fc293f85ef044e5d22042a2736756d 100644 (file)
@@ -8,19 +8,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:00+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:08+0000\n"
 "Language-Team: Interlingua\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ia\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Accesso"
 
@@ -101,7 +102,7 @@ msgstr "Pagina non existe"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -117,7 +118,7 @@ msgstr "%1$s e amicos, pagina %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +181,7 @@ msgstr ""
 "pulsata a %s o publicar un message a su attention."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Tu e amicos"
 
@@ -207,11 +208,11 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Methodo API non trovate."
 
@@ -575,7 +576,7 @@ msgstr ""
 "<strong>%3$s</strong> le datos de tu conto de %4$s. Tu debe solmente dar "
 "accesso a tu conto de %4$s a tertie personas in le quales tu ha confidentia."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Conto"
 
@@ -665,18 +666,6 @@ msgstr "%1$s / Favorites de %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s actualisationes favoritisate per %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Chronologia de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Actualisationes de %1$s in %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -688,12 +677,12 @@ msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 "Actualisationes de %1$s que responde al actualisationes de %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Chronologia public de %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Actualisationes de totes in %s!"
@@ -713,7 +702,7 @@ msgstr "Repetitiones de %s"
 msgid "Notices tagged with %s"
 msgstr "Notas con etiquetta %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualisationes con etiquetta %1$s in %2$s!"
@@ -754,7 +743,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Usator sin profilo correspondente"
 
@@ -940,7 +929,7 @@ msgid "Conversation"
 msgstr "Conversation"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notas"
 
@@ -959,7 +948,7 @@ msgstr "Tu non es le proprietario de iste application."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Il habeva un problema con tu indicio de session."
 
@@ -1155,8 +1144,9 @@ msgstr "Revenir al predefinitiones"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1272,7 +1262,7 @@ msgstr "description es troppo longe (max %d chars)."
 msgid "Could not update group."
 msgstr "Non poteva actualisar gruppo."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Non poteva crear aliases."
 
@@ -1395,7 +1385,7 @@ msgid "Cannot normalize that email address"
 msgstr "Non pote normalisar iste adresse de e-mail"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Adresse de e-mail invalide."
 
@@ -1587,6 +1577,25 @@ msgstr "File non existe."
 msgid "Cannot read file."
 msgstr "Non pote leger file."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Indicio invalide."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Tu non pote mitter usatores in le cassa de sablo in iste sito."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Usator es ja silentiate."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1734,12 +1743,18 @@ msgstr "Facer administrator"
 msgid "Make this user an admin"
 msgstr "Facer iste usator administrator"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Chronologia de %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Actualisationes de membros de %1$s in %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Gruppos"
@@ -2366,8 +2381,8 @@ msgstr "typo de contento "
 msgid "Only "
 msgstr "Solmente "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Formato de datos non supportate."
 
@@ -2507,7 +2522,8 @@ msgstr "Non pote salveguardar le nove contrasigno."
 msgid "Password saved."
 msgstr "Contrasigno salveguardate."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Camminos"
 
@@ -2627,7 +2643,7 @@ msgstr "Directorio al fundos"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nunquam"
 
@@ -2682,11 +2698,11 @@ msgstr "Etiquetta de personas invalide: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Usatores auto-etiquettate con %1$s - pagina %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Le contento del nota es invalide"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2768,7 +2784,7 @@ msgstr ""
 "Etiquettas pro te (litteras, numeros, -, ., e _), separate per commas o "
 "spatios"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Lingua"
 
@@ -2795,7 +2811,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Bio es troppo longe (max %d chars)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Fuso horari non seligite."
 
@@ -3112,7 +3128,7 @@ msgid "Same as password above. Required."
 msgstr "Identic al contrasigno hic supra. Requirite."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mail"
 
@@ -3219,7 +3235,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL de tu profilo in un altere servicio de microblogging compatibile"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subscriber"
 
@@ -3323,6 +3339,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Responsas a %1$s in %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Tu non pote silentiar usatores in iste sito."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Usator sin profilo correspondente"
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3335,7 +3361,9 @@ msgstr "Tu non pote mitter usatores in le cassa de sablo in iste sito."
 msgid "User is already sandboxed."
 msgstr "Usator es ja in cassa de sablo."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessiones"
 
@@ -3359,7 +3387,7 @@ msgstr "Cercar defectos de session"
 msgid "Turn on debugging output for sessions."
 msgstr "Producer informationes technic pro cercar defectos in sessiones."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salveguardar configurationes del sito"
@@ -3390,8 +3418,8 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statisticas"
 
@@ -3533,45 +3561,45 @@ msgstr "Aliases"
 msgid "Group actions"
 msgstr "Actiones del gruppo"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Syndication de notas pro le gruppo %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Syndication de notas pro le gruppo %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Syndication de notas pro le gruppo %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Amico de un amico pro le gruppo %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nulle)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Tote le membros"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Create"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3586,7 +3614,7 @@ msgstr ""
 "lor vita e interesses. [Crea un conto](%%%%action.register%%%%) pro devenir "
 "parte de iste gruppo e multe alteres! ([Lege plus](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3599,7 +3627,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Su membros condivide breve messages super "
 "lor vita e interesses. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administratores"
 
@@ -3722,148 +3750,139 @@ msgid "User is already silenced."
 msgstr "Usator es ja silentiate."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Configurationes de base pro iste sito de StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Le longitude del nomine del sito debe esser plus que zero."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Tu debe haber un valide adresse de e-mail pro contacto."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Lingua \"%s\" incognite."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Le URL pro reportar instantaneos es invalide."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Valor de execution de instantaneo invalide."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Le frequentia de instantaneos debe esser un numero."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Le limite minimal del texto es 140 characteres."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Le limite de duplicatos debe esser 1 o plus secundas."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "General"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nomine del sito"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Le nomine de tu sito, como \"Le microblog de TuCompania\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Realisate per"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Le texto usate pro le ligamine al creditos in le pede de cata pagina"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL pro \"Realisate per\""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL usate pro le ligamine al creditos in le pede de cata pagina"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Le adresse de e-mail de contacto pro tu sito"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Fuso horari predefinite"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Fuso horari predefinite pro le sito; normalmente UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Lingua predefinite del sito"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Instantaneos"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Aleatorimente durante un accesso web"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "In un processo planificate"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Instantaneos de datos"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Quando inviar datos statistic al servitores de status.net"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequentia"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Un instantaneo essera inviate a cata N accessos web"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL pro reporto"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Le instantaneos essera inviate a iste URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limites"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Limite de texto"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Numero maximal de characteres pro notas."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Limite de duplicatos"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Quante tempore (in secundas) le usatores debe attender ante de poter "
 "publicar le mesme cosa de novo."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Aviso del sito"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nove message"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Impossibile salveguardar le configurationes del apparentia."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Aviso del sito"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Aviso del sito"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Parametros de SMS"
@@ -3963,6 +3982,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Nulle codice entrate"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Instantaneos"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Modificar le configuration del sito"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Valor de execution de instantaneo invalide."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Le frequentia de instantaneos debe esser un numero."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Le URL pro reportar instantaneos es invalide."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Aleatorimente durante un accesso web"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "In un processo planificate"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Instantaneos de datos"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Quando inviar datos statistic al servitores de status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequentia"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Un instantaneo essera inviate a cata N accessos web"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL pro reporto"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Le instantaneos essera inviate a iste URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Salveguardar configurationes del sito"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Tu non es subscribite a iste profilo."
@@ -4173,7 +4252,7 @@ msgstr "Nulle ID de profilo in requesta."
 msgid "Unsubscribed"
 msgstr "Subscription cancellate"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4376,17 +4455,23 @@ msgstr "Gruppos %1$s, pagina %2$d"
 msgid "Search for more groups"
 msgstr "Cercar altere gruppos"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s non es membro de alcun gruppo."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Tenta [cercar gruppos](%%action.groupsearch%%) e facer te membro de illos."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Actualisationes de %1$s in %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4442,7 +4527,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plug-ins"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Version"
 
@@ -4508,22 +4593,22 @@ msgstr "Non poteva actualisar message con nove URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Error in base de datos durante insertion del marca (hashtag): %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problema salveguardar nota. Troppo longe."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema salveguardar nota. Usator incognite."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Troppo de notas troppo rapidemente; face un pausa e publica de novo post "
 "alcun minutas."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4531,19 +4616,19 @@ msgstr ""
 "Troppo de messages duplicate troppo rapidemente; face un pausa e publica de "
 "novo post alcun minutas."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Il te es prohibite publicar notas in iste sito."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problema salveguardar nota."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problema salveguardar le cassa de entrata del gruppo."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4568,7 +4653,12 @@ msgstr "Non subscribite!"
 msgid "Couldn't delete self-subscription."
 msgstr "Non poteva deler auto-subscription."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Non poteva deler subscription."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Non poteva deler subscription."
 
@@ -4577,20 +4667,20 @@ msgstr "Non poteva deler subscription."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Benvenite a %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Non poteva crear gruppo."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Non poteva configurar le membrato del gruppo."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Non poteva configurar le membrato del gruppo."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Non poteva salveguardar le subscription."
@@ -4632,194 +4722,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Pagina sin titulo"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navigation primari del sito"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profilo personal e chronologia de amicos"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambiar tu e-mail, avatar, contrasigno, profilo"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Conto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Connecter con servicios"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Connecter"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modificar le configuration del sito"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Invitar amicos e collegas a accompaniar te in %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invitar"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Terminar le session del sito"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Clauder session"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear un conto"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Crear conto"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Identificar te a iste sito"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Aperir session"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Adjuta me!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Adjuta"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cercar personas o texto"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Cercar"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Aviso del sito"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Vistas local"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Aviso de pagina"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navigation secundari del sito"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Adjuta"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "A proposito"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "CdS"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Confidentialitate"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Insignia"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licentia del software StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4828,12 +4911,12 @@ msgstr ""
 "**%%site.name%%** es un servicio de microblog offerite per [%%site.broughtby%"
 "%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** es un servicio de microblog. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4844,54 +4927,54 @@ msgstr ""
 "net/), version %s, disponibile sub le [GNU Affero General Public License]"
 "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licentia del contento del sito"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Le contento e datos de %1$s es private e confidential."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr "Contento e datos sub copyright de %1$s. Tote le derectos reservate."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Contento e datos sub copyright del contributores. Tote le derectos reservate."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Totes "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licentia."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Post"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Ante"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4906,91 +4989,80 @@ msgid "Changes to that panel are not allowed."
 msgstr "Le modification de iste pannello non es permittite."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() non implementate."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() non implementate."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Impossibile deler configuration de apparentia."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuration basic del sito"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Sito"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuration del apparentia"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Apparentia"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Configuration del usator"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Usator"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Configuration del accesso"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Accesso"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configuration del camminos"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Camminos"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Configuration del sessiones"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessiones"
+msgid "Edit site notice"
+msgstr "Aviso del sito"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Configuration del camminos"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5183,12 +5255,12 @@ msgstr "%s quitava le gruppo %s"
 msgid "Fullname: %s"
 msgstr "Nomine complete: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Loco: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Pagina personal: %s"
@@ -5522,6 +5594,11 @@ msgstr "Selige etiquetta pro reducer lista"
 msgid "Go"
 msgstr "Ir"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL del pagina initial o blog del gruppo o topico"
@@ -5659,11 +5736,11 @@ msgstr "Aperir session con nomine de usator e contrasigno"
 msgid "Sign up for a new account"
 msgstr "Crear un nove conto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmation del adresse de e-mail"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5692,12 +5769,12 @@ msgstr ""
 "Gratias pro tu attention,\n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s seque ora tu notas in %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5722,17 +5799,17 @@ msgstr ""
 "----\n"
 "Cambia tu adresse de e-mail o optiones de notification a %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Bio: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nove adresse de e-mail pro publicar in %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5753,21 +5830,21 @@ msgstr ""
 "Cordialmente,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Stato de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmation SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s te ha pulsate"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5794,12 +5871,12 @@ msgstr ""
 "Con salutes cordial,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nove message private de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5832,12 +5909,12 @@ msgstr ""
 "Con salutes cordial,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) ha addite tu nota como favorite"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5875,12 +5952,12 @@ msgstr ""
 "Cordialmente,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) ha inviate un nota a tu attention"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6140,10 +6217,6 @@ msgstr "Responsas"
 msgid "Favorites"
 msgstr "Favorites"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Usator"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Cassa de entrata"
@@ -6169,7 +6242,7 @@ msgstr "Etiquettas in le notas de %s"
 msgid "Unknown"
 msgstr "Incognite"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subscriptiones"
 
@@ -6177,23 +6250,23 @@ msgstr "Subscriptiones"
 msgid "All subscriptions"
 msgstr "Tote le subscriptiones"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subscriptores"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Tote le subscriptores"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID del usator"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membro depost"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Tote le gruppos"
 
@@ -6233,7 +6306,12 @@ msgstr "Repeter iste nota?"
 msgid "Repeat this notice"
 msgstr "Repeter iste nota"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Blocar iste usator de iste gruppo"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Nulle signule usator definite pro le modo de singule usator."
 
@@ -6387,47 +6465,64 @@ msgstr "Message"
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Profilo del usator"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administratores"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderar"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "alcun secundas retro"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "circa un minuta retro"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minutas retro"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "circa un hora retro"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d horas retro"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "circa un die retro"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d dies retro"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "circa un mense retro"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d menses retro"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "circa un anno retro"
 
index aaf79c8f7f8feea9f6464900c55ddac1022945b2..3c8f33565d0ea03741519e57a3af0dbfd51a7c21 100644 (file)
@@ -8,12 +8,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:04+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:12+0000\n"
 "Language-Team: Icelandic\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: is\n"
 "X-Message-Group: out-statusnet\n"
@@ -22,7 +22,8 @@ msgstr ""
 "n % 100 != 81 && n % 100 != 91);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Samþykkja"
@@ -109,7 +110,7 @@ msgstr "Ekkert þannig merki."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -125,7 +126,7 @@ msgstr "%s og vinirnir, síða %d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +181,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr ""
 
@@ -207,11 +208,11 @@ msgstr "Færslur frá %1$s og vinum á %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Aðferð í forritsskilum fannst ekki!"
@@ -580,7 +581,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Aðgangur"
 
@@ -671,18 +672,6 @@ msgstr "%s / Uppáhaldsbabl frá %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s færslur gerðar að uppáhaldsbabli af %s / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Rás %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Færslur frá %1$s á %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -693,12 +682,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s færslur sem svara færslum frá %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Almenningsrás %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s færslur frá öllum!"
@@ -718,7 +707,7 @@ msgstr "Svör við %s"
 msgid "Notices tagged with %s"
 msgstr "Babl merkt með %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -758,7 +747,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Notandi með enga persónulega síðu sem passar við"
 
@@ -947,7 +936,7 @@ msgid "Conversation"
 msgstr ""
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Babl"
 
@@ -969,7 +958,7 @@ msgstr "Þú ert ekki meðlimur í þessum hópi."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Það komu upp vandamál varðandi setutókann þinn."
 
@@ -1169,8 +1158,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1298,7 +1288,7 @@ msgstr "Lýsing er of löng (í mesta lagi 140 tákn)."
 msgid "Could not update group."
 msgstr "Gat ekki uppfært hóp."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr ""
 
@@ -1422,7 +1412,7 @@ msgid "Cannot normalize that email address"
 msgstr "Get ekki staðlað þetta tölvupóstfang"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Ekki tækt tölvupóstfang."
 
@@ -1618,6 +1608,25 @@ msgstr "Ekkert svoleiðis babl."
 msgid "Cannot read file."
 msgstr "Týndum skránni okkar"
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Ótæk stærð."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Þú getur ekki sent þessum notanda skilaboð."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Notandi hefur enga persónulega síðu."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1760,12 +1769,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Rás %s"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Færslur frá %1$s á %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Hópar"
@@ -2385,8 +2400,8 @@ msgstr ""
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Enginn stuðningur við gagnasnið."
 
@@ -2533,7 +2548,8 @@ msgstr "Get ekki vistað nýja lykilorðið."
 msgid "Password saved."
 msgstr "Lykilorð vistað."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2660,7 +2676,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Endurheimta"
@@ -2719,11 +2735,11 @@ msgstr "Ekki gilt persónumerki: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Notendur sjálfmerktir með %s - síða %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Ótækt bablinnihald"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2806,7 +2822,7 @@ msgstr ""
 "Merki fyrir þig (bókstafir, tölustafir, -, ., og _), aðskilin með kommu eða "
 "bili"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Tungumál"
 
@@ -2834,7 +2850,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Lýsingin er of löng (í mesta lagi 140 tákn)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Tímabelti ekki valið."
 
@@ -3138,7 +3154,7 @@ msgid "Same as password above. Required."
 msgstr "Sama og lykilorðið hér fyrir ofan. Nauðsynlegt."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Tölvupóstur"
 
@@ -3243,7 +3259,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Veffang persónulegrar síðu á samvirkandi örbloggsþjónustu"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Gerast áskrifandi"
 
@@ -3349,6 +3365,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Skilaboð til %1$s á %2$s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Þú getur ekki sent þessum notanda skilaboð."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Notandi með enga persónulega síðu sem passar við"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3363,7 +3389,9 @@ msgstr "Þú getur ekki sent þessum notanda skilaboð."
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3387,7 +3415,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3423,8 +3451,8 @@ msgstr "Uppröðun"
 msgid "Description"
 msgstr "Lýsing"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Tölfræði"
 
@@ -3557,45 +3585,45 @@ msgstr ""
 msgid "Group actions"
 msgstr "Hópsaðgerðir"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "%s hópurinn"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Meðlimir"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ekkert)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Allir meðlimir"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr ""
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3605,7 +3633,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3614,7 +3642,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3726,150 +3754,139 @@ msgid "User is already silenced."
 msgstr ""
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Ekki tækt tölvupóstfang"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Babl vefsíðunnar"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Nýtt tölvupóstfang til að senda á %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Staðbundin sýn"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "Tungumál (ákjósanlegt)"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Babl vefsíðunnar"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Ný skilaboð"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Vandamál komu upp við að vista babl."
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Babl vefsíðunnar"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Babl vefsíðunnar"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3971,6 +3988,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Enginn lykill sleginn inn"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Stikl aðalsíðu"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Stillingar fyrir mynd"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Þú ert ekki áskrifandi."
@@ -4176,7 +4253,7 @@ msgstr "Ekkert einkenni persónulegrar síðu í beiðni."
 msgid "Unsubscribed"
 msgstr "Ekki lengur áskrifandi"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4385,16 +4462,22 @@ msgstr "Hópmeðlimir %s, síða %d"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Færslur frá %1$s á %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4438,7 +4521,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Persónulegt"
@@ -4507,41 +4590,41 @@ msgstr "Gat ekki uppfært skilaboð með nýju veffangi."
 msgid "DB error inserting hashtag: %s"
 msgstr "Gagnagrunnsvilla við innsetningu myllumerkis: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Gat ekki vistað babl. Óþekktur notandi."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Of mikið babl í einu; slakaðu aðeins á og haltu svo áfram eftir nokkrar "
 "mínútur."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Það hefur verið lagt bann við babli frá þér á þessari síðu."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Vandamál komu upp við að vista babl."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Vandamál komu upp við að vista babl."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4569,7 +4652,12 @@ msgstr "Ekki í áskrift!"
 msgid "Couldn't delete self-subscription."
 msgstr "Gat ekki eytt áskrift."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Gat ekki eytt áskrift."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Gat ekki eytt áskrift."
 
@@ -4578,20 +4666,20 @@ msgstr "Gat ekki eytt áskrift."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Gat ekki búið til hóp."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Gat ekki skráð hópmeðlimi."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Gat ekki skráð hópmeðlimi."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Gat ekki vistað áskrift."
@@ -4633,25 +4721,25 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "Ónafngreind síða"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Stikl aðalsíðu"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persónuleg síða og vinarás"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Persónulegt"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
@@ -4659,170 +4747,163 @@ msgstr ""
 "Breyttu tölvupóstinum þínum, einkennismyndinni þinni, lykilorðinu þínu, "
 "persónulegu síðunni þinni"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Aðgangur"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Gat ekki framsent til vefþjóns: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Tengjast"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Stikl aðalsíðu"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Stjórnandi"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Bjóða vinum og vandamönnum að slást í hópinn á %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Bjóða"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Skrá þig út af síðunni"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Útskráning"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Búa til aðgang"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Nýskrá"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Skrá þig inn á síðuna"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Innskráning"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjálp!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hjálp"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Leita að fólki eða texta"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Leita"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Babl vefsíðunnar"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Staðbundin sýn"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Babl síðunnar"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Stikl undirsíðu"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hjálp"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Um"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Spurt og svarað"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Friðhelgi"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Frumþula"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Tengiliður"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Hugbúnaðarleyfi StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4831,12 +4912,12 @@ msgstr ""
 "**%%site.name%%** er örbloggsþjónusta í boði [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er örbloggsþjónusta."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4847,54 +4928,54 @@ msgstr ""
 "sem er gefinn út undir [GNU Affero almenningsleyfinu](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "Hugbúnaðarleyfi StatusNet"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Allt "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "leyfi."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Uppröðun"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Eftir"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Áður"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4911,98 +4992,88 @@ msgid "Changes to that panel are not allowed."
 msgstr "Nýskráning ekki leyfð."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Skipun hefur ekki verið fullbúin"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Skipun hefur ekki verið fullbúin"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Staðfesting tölvupóstfangs"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Bjóða"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS staðfesting"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Persónulegt"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS staðfesting"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Notandi"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS staðfesting"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Samþykkja"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS staðfesting"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS staðfesting"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Persónulegt"
+msgid "Edit site notice"
+msgstr "Babl vefsíðunnar"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS staðfesting"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5194,12 +5265,12 @@ msgstr "%s gekk úr hópnum %s"
 msgid "Fullname: %s"
 msgstr "Fullt nafn: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Staðsetning: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Heimasíða: %s"
@@ -5503,6 +5574,11 @@ msgstr "Veldu merki til að þrengja lista"
 msgid "Go"
 msgstr "Áfram"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "Vefslóð vefsíðu hópsins eða umfjöllunarefnisins"
@@ -5640,11 +5716,11 @@ msgstr "Skráðu þig inn með notendanafni og lykilorði"
 msgid "Sign up for a new account"
 msgstr "Búðu til nýjan aðgang"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Staðfesting tölvupóstfangs"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5661,12 +5737,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s er að hlusta á bablið þitt á %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5681,19 +5757,19 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Lýsing: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nýtt tölvupóstfang til að senda á %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5714,21 +5790,21 @@ msgstr ""
 "Með kærri kveðju,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Staða %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS staðfesting"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s ýtti við þér"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5744,12 +5820,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Ný persónuleg skilaboð frá %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5768,12 +5844,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s heldur upp á babl frá þér"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5794,12 +5870,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6047,10 +6123,6 @@ msgstr "Svör"
 msgid "Favorites"
 msgstr "Uppáhald"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Notandi"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Innhólf"
@@ -6077,7 +6149,7 @@ msgstr "Merki í babli %s"
 msgid "Unknown"
 msgstr "Óþekkt aðgerð"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Áskriftir"
 
@@ -6085,23 +6157,23 @@ msgstr "Áskriftir"
 msgid "All subscriptions"
 msgstr "Allar áskriftir"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Áskrifendur"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Allir áskrifendur"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Meðlimur síðan"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Allir hópar"
 
@@ -6144,7 +6216,12 @@ msgstr "Svara þessu babli"
 msgid "Repeat this notice"
 msgstr "Svara þessu babli"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr ""
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6304,47 +6381,62 @@ msgstr "Skilaboð"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Persónuleg síða notanda"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "fyrir nokkrum sekúndum"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "fyrir um einni mínútu síðan"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fyrir um %d mínútum síðan"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "fyrir um einum klukkutíma síðan"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "fyrir um %d klukkutímum síðan"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "fyrir um einum degi síðan"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "fyrir um %d dögum síðan"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "fyrir um einum mánuði síðan"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "fyrir um %d mánuðum síðan"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "fyrir um einu ári síðan"
 
index 61d4cfaf91d636f57603e64f132ea35359630c80..1bd3f26adb43bd98786072313385ec9eadb50fa4 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:07+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:15+0000\n"
 "Language-Team: Italian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: it\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Accesso"
 
@@ -44,7 +45,6 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Privato"
@@ -75,7 +75,6 @@ msgid "Save access settings"
 msgstr "Salva impostazioni di accesso"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Salva"
@@ -104,7 +103,7 @@ msgstr "Pagina inesistente."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +119,7 @@ msgstr "%1$s e amici, pagina %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -184,7 +183,7 @@ msgstr ""
 "un messaggio alla sua attenzione."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Tu e i tuoi amici"
 
@@ -211,11 +210,11 @@ msgstr "Messaggi da %1$s e amici su %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Metodo delle API non trovato."
 
@@ -579,7 +578,7 @@ msgstr ""
 "<strong>%3$s</strong> ai dati del tuo account %4$s. È consigliato fornire "
 "accesso al proprio account %4$s solo ad applicazioni di cui ci si può fidare."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Account"
 
@@ -667,18 +666,6 @@ msgstr "%1$s / Preferiti da %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s aggiornamenti preferiti da %2$s / %3$s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Attività di %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Messaggi da %1$s su %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -689,12 +676,12 @@ msgstr "%1$s / Messaggi che citano %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s messaggi in risposta a quelli da %2$s / %3$s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Attività pubblica di %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Aggiornamenti di %s da tutti!"
@@ -714,7 +701,7 @@ msgstr "Ripetizioni di %s"
 msgid "Notices tagged with %s"
 msgstr "Messaggi etichettati con %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Messaggi etichettati con %1$s su %2$s!"
@@ -755,7 +742,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Utente senza profilo corrispondente"
 
@@ -941,7 +928,7 @@ msgid "Conversation"
 msgstr "Conversazione"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Messaggi"
 
@@ -960,7 +947,7 @@ msgstr "Questa applicazione non è di tua proprietà."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Si è verificato un problema con il tuo token di sessione."
 
@@ -1155,8 +1142,9 @@ msgstr "Reimposta i valori predefiniti"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1272,7 +1260,7 @@ msgstr "La descrizione è troppo lunga (max %d caratteri)."
 msgid "Could not update group."
 msgstr "Impossibile aggiornare il gruppo."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Impossibile creare gli alias."
 
@@ -1398,7 +1386,7 @@ msgid "Cannot normalize that email address"
 msgstr "Impossibile normalizzare quell'indirizzo email"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Non è un indirizzo email valido."
 
@@ -1591,6 +1579,22 @@ msgstr "Nessun file."
 msgid "Cannot read file."
 msgstr "Impossibile leggere il file."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Ruolo non valido."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Questo ruolo è riservato e non può essere impostato."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Non puoi concedere i ruoli agli utenti su questo sito."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "L'utente ricopre già questo ruolo."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1738,12 +1742,18 @@ msgstr "Rendi amm."
 msgid "Make this user an admin"
 msgstr "Rende questo utente un amministratore"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Attività di %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Messaggi dai membri di %1$s su %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Gruppi"
@@ -2004,7 +2014,6 @@ msgstr "Puoi aggiungere un messaggio personale agli inviti."
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Invia"
@@ -2363,8 +2372,8 @@ msgstr "tipo di contenuto "
 msgid "Only "
 msgstr "Solo "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Non è un formato di dati supportato."
 
@@ -2505,7 +2514,8 @@ msgstr "Impossibile salvare la nuova password."
 msgid "Password saved."
 msgstr "Password salvata."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Percorsi"
 
@@ -2625,7 +2635,7 @@ msgstr "Directory dello sfondo"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Mai"
 
@@ -2680,11 +2690,11 @@ msgstr "Non è un'etichetta valida di persona: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Utenti auto-etichettati con %1$s - pagina %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Contenuto del messaggio non valido"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2766,7 +2776,7 @@ msgid ""
 msgstr ""
 "Le tue etichette (lettere, numeri, -, . e _), separate da virgole o spazi"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Lingua"
 
@@ -2794,7 +2804,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "La biografia è troppo lunga (max %d caratteri)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Fuso orario non selezionato"
 
@@ -3111,7 +3121,7 @@ msgid "Same as password above. Required."
 msgstr "Stessa password di sopra; richiesta"
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Email"
 
@@ -3218,7 +3228,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL del tuo profilo su un altro servizio di microblog compatibile"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Abbonati"
 
@@ -3322,6 +3332,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Risposte a %1$s su %2$s!"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Non puoi revocare i ruoli degli utenti su questo sito."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "L'utente non ricopre questo ruolo."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3334,7 +3352,9 @@ msgstr "Non puoi mettere in \"sandbox\" gli utenti su questo sito."
 msgid "User is already sandboxed."
 msgstr "L'utente è già nella \"sandbox\"."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessioni"
 
@@ -3358,7 +3378,7 @@ msgstr "Debug delle sessioni"
 msgid "Turn on debugging output for sessions."
 msgstr "Abilita il debug per le sessioni"
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salva impostazioni"
@@ -3389,8 +3409,8 @@ msgstr "Organizzazione"
 msgid "Description"
 msgstr "Descrizione"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistiche"
 
@@ -3531,45 +3551,45 @@ msgstr "Alias"
 msgid "Group actions"
 msgstr "Azioni dei gruppi"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed dei messaggi per il gruppo %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed dei messaggi per il gruppo %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed dei messaggi per il gruppo %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF per il gruppo %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membri"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(nessuno)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Tutti i membri"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Creato"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3585,7 +3605,7 @@ msgstr ""
 "stesso](%%%%action.register%%%%) per far parte di questo gruppo e di molti "
 "altri! ([Maggiori informazioni](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3597,7 +3617,7 @@ msgstr ""
 "(http://it.wikipedia.org/wiki/Microblogging) basato sul software libero "
 "[StatusNet](http://status.net/)."
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Amministratori"
 
@@ -3719,148 +3739,134 @@ msgid "User is already silenced."
 msgstr "L'utente è già stato zittito."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Impostazioni di base per questo sito StatusNet."
+msgid "Basic settings for this StatusNet site"
+msgstr "Impostazioni di base per questo sito StatusNet"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Il nome del sito non deve avere lunghezza parti a zero."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Devi avere un'email di contatto valida."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Lingua \"%s\" sconosciuta."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "URL di segnalazione snapshot non valido."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Valore di esecuzione dello snapshot non valido."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "La frequenza degli snapshot deve essere un numero."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Il limite minimo del testo è di 140 caratteri."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Il limite per i duplicati deve essere di 1 o più secondi."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Generale"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nome del sito"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Il nome del tuo sito, topo \"Acme Microblog\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Offerto da"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Testo usato per i crediti nel piè di pagina di ogni pagina"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL per offerto da"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL usato per i crediti nel piè di pagina di ogni pagina"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Indirizzo email di contatto per il sito"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Locale"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Fuso orario predefinito"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Fuso orario predefinito; tipicamente UTC"
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr "Lingua predefinita"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Snapshot"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "A caso quando avviene un web hit"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "In un job pianificato"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Snapshot dei dati"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Quando inviare dati statistici a status.net"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequenza"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Gli snapshot verranno inviati ogni N web hit"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL per la segnalazione"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Gli snapshot verranno inviati a questo URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+"Lingua del sito quando il rilevamento automatico del browser non è "
+"disponibile"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limiti"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Limiti del testo"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Numero massimo di caratteri per messaggo"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Limite duplicati"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Quanto tempo gli utenti devono attendere (in secondi) prima di inviare "
 "nuovamente lo stesso messaggio"
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Messaggio del sito"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Modifica il messaggio del sito"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Impossibile salvare il messaggio del sito."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "La dimensione massima del messaggio del sito è di 255 caratteri"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Testo messaggio del sito"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr "Testo messaggio del sito (massimo 255 caratteri, HTML consentito)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Salva messaggio"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Impostazioni SMS"
@@ -3960,6 +3966,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Nessun codice inserito"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Snapshot"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Gestisci configurazione snapshot"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Valore di esecuzione dello snapshot non valido."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "La frequenza degli snapshot deve essere un numero."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "URL di segnalazione snapshot non valido."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "A caso quando avviene un web hit"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "In un job pianificato"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Snapshot dei dati"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Quando inviare dati statistici a status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequenza"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Gli snapshot verranno inviati ogni N web hit"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL per la segnalazione"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Gli snapshot verranno inviati a questo URL"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Salva impostazioni snapshot"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Non hai una abbonamento a quel profilo."
@@ -4169,7 +4233,7 @@ msgstr "Nessun ID di profilo nella richiesta."
 msgid "Unsubscribed"
 msgstr "Abbonamento annullato"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4179,7 +4243,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Utente"
@@ -4373,16 +4436,22 @@ msgstr "Gruppi di %1$s, pagina %2$d"
 msgid "Search for more groups"
 msgstr "Cerca altri gruppi"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s non fa parte di alcun gruppo."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr "Prova a [cercare dei gruppi](%%action.groupsearch%%) e iscriviti."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Messaggi da %1$s su %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4438,7 +4507,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugin"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Versione"
 
@@ -4505,22 +4574,22 @@ msgstr "Impossibile aggiornare il messaggio con il nuovo URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Errore del DB nell'inserire un hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problema nel salvare il messaggio. Troppo lungo."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema nel salvare il messaggio. Utente sconosciuto."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Troppi messaggi troppo velocemente; fai una pausa e scrivi di nuovo tra "
 "qualche minuto."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4528,19 +4597,19 @@ msgstr ""
 "Troppi messaggi duplicati troppo velocemente; fai una pausa e scrivi di "
 "nuovo tra qualche minuto."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Ti è proibito inviare messaggi su questo sito."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problema nel salvare il messaggio."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problema nel salvare la casella della posta del gruppo."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4565,7 +4634,11 @@ msgstr "Non hai l'abbonamento!"
 msgid "Couldn't delete self-subscription."
 msgstr "Impossibile eliminare l'auto-abbonamento."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Impossibile eliminare il token di abbonamento OMB."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Impossibile eliminare l'abbonamento."
 
@@ -4574,19 +4647,19 @@ msgstr "Impossibile eliminare l'abbonamento."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Benvenuti su %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Impossibile creare il gruppo."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Impossibile impostare l'URI del gruppo."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Impossibile impostare la membership al gruppo."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Impossibile salvare le informazioni del gruppo locale."
 
@@ -4627,194 +4700,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Pagina senza nome"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Esplorazione sito primaria"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profilo personale e attività degli amici"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personale"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Modifica la tua email, immagine, password o il tuo profilo"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Account"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Connettiti con altri servizi"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Connetti"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modifica la configurazione del sito"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Amministra"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Invita amici e colleghi a seguirti su %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invita"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Termina la tua sessione sul sito"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Esci"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crea un account"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrati"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Accedi al sito"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Accedi"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Aiutami!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Aiuto"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cerca persone o del testo"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Cerca"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Messaggio del sito"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Viste locali"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Pagina messaggio"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Esplorazione secondaria del sito"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Aiuto"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Informazioni"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Sorgenti"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contatti"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Badge"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licenza del software StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4823,12 +4872,12 @@ msgstr ""
 "**%%site.name%%** è un servizio di microblog offerto da [%%site.broughtby%%]"
 "(%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** è un servizio di microblog. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4839,56 +4888,56 @@ msgstr ""
 "s, disponibile nei termini della licenza [GNU Affero General Public License]"
 "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licenza del contenuto del sito"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "I contenuti e i dati di %1$s sono privati e confidenziali."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "I contenuti e i dati sono copyright di %1$s. Tutti i diritti riservati."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "I contenuti e i dati sono forniti dai collaboratori. Tutti i diritti "
 "riservati."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Tutti "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licenza."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginazione"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Successivi"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Precedenti"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Impossibile gestire contenuti remoti."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Impossibile gestire contenuti XML incorporati."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Impossibile gestire contenuti Base64."
 
@@ -4903,91 +4952,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Le modifiche al pannello non sono consentite."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() non implementata."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() non implementata."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Impossibile eliminare le impostazioni dell'aspetto."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configurazione di base"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Sito"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configurazione aspetto"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Aspetto"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Configurazione utente"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Utente"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Configurazione di accesso"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Accesso"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configurazione percorsi"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Percorsi"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Configurazione sessioni"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessioni"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Modifica messaggio del sito"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Configurazione snapshot"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5179,12 +5213,12 @@ msgstr "%1$s ha lasciato il gruppo %2$s"
 msgid "Fullname: %s"
 msgstr "Nome completo: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Posizione: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Pagina web: %s"
@@ -5522,6 +5556,11 @@ msgstr "Scegli un'etichetta per ridurre l'elenco"
 msgid "Go"
 msgstr "Vai"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Concedi a questo utente il ruolo \"%s\""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL della pagina web, blog del gruppo o l'argomento"
@@ -5658,11 +5697,11 @@ msgstr "Accedi con nome utente e password"
 msgid "Sign up for a new account"
 msgstr "Iscriviti per un nuovo account"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Conferma indirizzo email"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5692,12 +5731,12 @@ msgstr ""
 "Grazie per il tuo tempo, \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s sta ora seguendo i tuoi messaggi su %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5722,17 +5761,17 @@ msgstr ""
 "----\n"
 "Modifica il tuo indirizzo email o le opzioni di notifica presso %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Biografia: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nuovo indirizzo email per inviare messaggi a %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5753,21 +5792,21 @@ msgstr ""
 "Cordiali saluti,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "stato di %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Conferma SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s ti ha richiamato"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5794,12 +5833,12 @@ msgstr ""
 "Cordiali saluti,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nuovo messaggio privato da %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5832,12 +5871,12 @@ msgstr ""
 "Cordiali saluti,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) ha aggiunto il tuo messaggio tra i suoi preferiti"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5875,12 +5914,12 @@ msgstr ""
 "Cordiali saluti,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) ti ha inviato un messaggio"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6137,10 +6176,6 @@ msgstr "Risposte"
 msgid "Favorites"
 msgstr "Preferiti"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Utente"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "In arrivo"
@@ -6166,7 +6201,7 @@ msgstr "Etichette nei messaggi di %s"
 msgid "Unknown"
 msgstr "Sconosciuto"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abbonamenti"
 
@@ -6174,23 +6209,23 @@ msgstr "Abbonamenti"
 msgid "All subscriptions"
 msgstr "Tutti gli abbonamenti"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abbonati"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Tutti gli abbonati"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID utente"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membro dal"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Tutti i gruppi"
 
@@ -6230,7 +6265,12 @@ msgstr "Ripetere questo messaggio?"
 msgid "Repeat this notice"
 msgstr "Ripeti questo messaggio"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Revoca il ruolo \"%s\" a questo utente"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Nessun utente singolo definito per la modalità single-user."
 
@@ -6384,47 +6424,61 @@ msgstr "Messaggio"
 msgid "Moderate"
 msgstr "Modera"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Ruolo dell'utente"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Amministratore"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderatore"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "pochi secondi fa"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "circa un minuto fa"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minuti fa"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "circa un'ora fa"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d ore fa"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "circa un giorno fa"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d giorni fa"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "circa un mese fa"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d mesi fa"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "circa un anno fa"
 
index acbcb457d3196bbb6d985efc083bea0b3c3b11b0..847f24c59e7ca42247f5b7822beb6b05e4700207 100644 (file)
@@ -11,19 +11,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:10+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:18+0000\n"
 "Language-Team: Japanese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ja\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "アクセス"
 
@@ -104,7 +105,7 @@ msgstr "そのようなページはありません。"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +121,7 @@ msgstr "%1$s と友人、ページ %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -181,7 +182,7 @@ msgstr ""
 "せを送ってみませんか。"
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "あなたと友人"
 
@@ -208,11 +209,11 @@ msgstr "%2$s に %1$s と友人からの更新があります!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API メソッドが見つかりません。"
 
@@ -573,7 +574,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "アカウント"
 
@@ -660,18 +661,6 @@ msgstr "%1$s / %2$s からのお気に入り"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s は %2$s でお気に入りを更新しました / %2$s。"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s のタイムライン"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "%1$s から %2$s  上の更新をしました!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -682,12 +671,12 @@ msgstr "%1$s / %2$s について更新"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%2$s からアップデートに答える %1$s アップデート"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s のパブリックタイムライン"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "皆からの %s アップデート!"
@@ -707,7 +696,7 @@ msgstr "%s の返信"
 msgid "Notices tagged with %s"
 msgstr "%s とタグ付けされたつぶやき"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s に %1$s による更新があります!"
@@ -747,7 +736,7 @@ msgstr "自分のアバターをアップロードできます。最大サイズ
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "合っているプロフィールのないユーザ"
 
@@ -934,7 +923,7 @@ msgid "Conversation"
 msgstr "会話"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "つぶやき"
 
@@ -953,7 +942,7 @@ msgstr "このアプリケーションのオーナーではありません。"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "あなたのセッショントークンに関する問題がありました。"
 
@@ -1149,8 +1138,9 @@ msgstr "デフォルトへリセットする"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1266,7 +1256,7 @@ msgstr "記述が長すぎます。(最長 %d 字)"
 msgid "Could not update group."
 msgstr "グループを更新できません。"
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "別名を作成できません。"
 
@@ -1391,7 +1381,7 @@ msgid "Cannot normalize that email address"
 msgstr "そのメールアドレスを正規化できません"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "有効なメールアドレスではありません。"
 
@@ -1585,6 +1575,25 @@ msgstr "そのようなファイルはありません。"
 msgid "Cannot read file."
 msgstr "ファイルを読み込めません。"
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "不正なトークン。"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "あなたはこのサイトのサンドボックスユーザができません。"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "ユーザは既に黙っています。"
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1731,12 +1740,18 @@ msgstr "管理者にする"
 msgid "Make this user an admin"
 msgstr "このユーザを管理者にする"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s のタイムライン"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s 上の %1$s のメンバーから更新する"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "グループ"
@@ -2355,8 +2370,8 @@ msgstr "内容種別 "
 msgid "Only "
 msgstr "だけ "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "サポートされていないデータ形式。"
 
@@ -2497,7 +2512,8 @@ msgstr "新しいパスワードを保存できません。"
 msgid "Password saved."
 msgstr "パスワードが保存されました。"
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "パス"
 
@@ -2617,7 +2633,7 @@ msgstr "バックグラウンドディレクトリ"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr ""
 
@@ -2672,11 +2688,11 @@ msgstr "正しいタグではありません: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "ユーザ自身がつけたタグ %1$s  - ページ %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "不正なつぶやき内容"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2757,7 +2773,7 @@ msgstr ""
 "自分自身についてのタグ (アルファベット、数字、-、.、_)、カンマまたは空白区切"
 "りで"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "言語"
 
@@ -2783,7 +2799,7 @@ msgstr "自分をフォローしている者を自動的にフォローする (B
 msgid "Bio is too long (max %d chars)."
 msgstr "自己紹介が長すぎます (最長140文字)。"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "タイムゾーンが選ばれていません。"
 
@@ -3101,7 +3117,7 @@ msgid "Same as password above. Required."
 msgstr "上のパスワードと同じです。 必須。"
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "メール"
 
@@ -3205,7 +3221,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "プロファイルサービスまたはマイクロブロギングサービスのURL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "フォロー"
 
@@ -3310,6 +3326,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "%2$s 上の %1$s への返信!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "あなたはこのサイトでユーザを黙らせることができません。"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "合っているプロフィールのないユーザ"
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3322,7 +3348,9 @@ msgstr "あなたはこのサイトのサンドボックスユーザができま
 msgid "User is already sandboxed."
 msgstr "ユーザはすでにサンドボックスです。"
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "セッション"
 
@@ -3346,7 +3374,7 @@ msgstr "セッションデバッグ"
 msgid "Turn on debugging output for sessions."
 msgstr "セッションのためのデバッグ出力をオン。"
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "サイト設定の保存"
@@ -3377,8 +3405,8 @@ msgstr "組織"
 msgid "Description"
 msgstr "概要"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "統計データ"
 
@@ -3521,45 +3549,45 @@ msgstr "別名"
 msgid "Group actions"
 msgstr "グループアクション"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s グループのつぶやきフィード (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s グループのつぶやきフィード (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s グループのつぶやきフィード (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s グループの FOAF"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "メンバー"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(なし)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "全てのメンバー"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "作成日"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3574,7 +3602,7 @@ msgstr ""
 "する短いメッセージを共有します。[今すぐ参加](%%%%action.register%%%%) してこ"
 "のグループの一員になりましょう! ([もっと読む](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3587,7 +3615,7 @@ msgstr ""
 "wikipedia.org/wiki/Micro-blogging) サービス。メンバーは彼らの暮らしと興味に関"
 "する短いメッセージを共有します。"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "管理者"
 
@@ -3709,151 +3737,142 @@ msgid "User is already silenced."
 msgstr "ユーザは既に黙っています。"
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "この StatusNet サイトの基本設定。"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "サイト名は長さ0ではいけません。"
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "有効な連絡用メールアドレスがなければなりません。"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "不明な言語 \"%s\""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "不正なスナップショットレポートURL。"
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "不正なスナップショットランバリュー"
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "スナップショット頻度は数でなければなりません。"
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "最小のテキスト制限は140字です。"
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "デュープ制限は1秒以上でなければなりません。"
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "一般"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "サイト名"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "あなたのサイトの名前、\"Yourcompany Microblog\"のような。"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "持って来られます"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 "クレジットに使用されるテキストは、それぞれのページのフッターでリンクされま"
 "す。"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URLで、持って来られます"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 "クレジットに使用されるURLは、それぞれのページのフッターでリンクされます。"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "あなたのサイトにコンタクトするメールアドレス"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "ローカル"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "デフォルトタイムゾーン"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "サイトのデフォルトタイムゾーン; 通常UTC。"
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "デフォルトサイト言語"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "スナップショット"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "予定されているジョブで"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "データスナップショット"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "いつ status.net サーバに統計データを送りますか"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "頻度"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "レポート URL"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "レポート URL"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "このURLにスナップショットを送るでしょう"
-
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "制限"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "テキスト制限"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "つぶやきの文字の最大数"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "デュープ制限"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "どれくらい長い間(秒)、ユーザは、再び同じものを投稿するのを待たなければならな"
 "いか。"
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "サイトつぶやき"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "新しいメッセージ"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "あなたのデザイン設定を保存できません。"
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "サイトつぶやき"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "サイトつぶやき"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "SMS 設定"
@@ -3954,6 +3973,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "コードが入力されていません"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "スナップショット"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "サイト設定の変更"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "不正なスナップショットランバリュー"
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "スナップショット頻度は数でなければなりません。"
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "不正なスナップショットレポートURL。"
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "予定されているジョブで"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "データスナップショット"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "いつ status.net サーバに統計データを送りますか"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "頻度"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "レポート URL"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "レポート URL"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "このURLにスナップショットを送るでしょう"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "サイト設定の保存"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "あなたはそのプロファイルにフォローされていません。"
@@ -4162,7 +4241,7 @@ msgstr "リクエスト内にプロファイルIDがありません。"
 msgid "Unsubscribed"
 msgstr "フォロー解除済み"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4366,16 +4445,22 @@ msgstr "%1$s グループ、ページ %2$d"
 msgid "Search for more groups"
 msgstr "もっとグループを検索"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s はどのグループのメンバーでもありません。"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr "[グループを探して](%%action.groupsearch%%)それに加入してください。"
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "%1$s から %2$s  上の更新をしました!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4421,7 +4506,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "プラグイン"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "バージョン"
 
@@ -4490,21 +4575,21 @@ msgstr "新しいURIでメッセージをアップデートできませんでし
 msgid "DB error inserting hashtag: %s"
 msgstr "ハッシュタグ追加 DB エラー: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "つぶやきを保存する際に問題が発生しました。長すぎです。"
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "つぶやきを保存する際に問題が発生しました。不明なユーザです。"
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "多すぎるつぶやきが速すぎます; 数分間の休みを取ってから再投稿してください。"
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4512,19 +4597,19 @@ msgstr ""
 "多すぎる重複メッセージが速すぎます; 数分間休みを取ってから再度投稿してくださ"
 "い。"
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止されています。"
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "つぶやきを保存する際に問題が発生しました。"
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "グループ受信箱を保存する際に問題が発生しました。"
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4549,7 +4634,12 @@ msgstr "フォローしていません!"
 msgid "Couldn't delete self-subscription."
 msgstr "自己フォローを削除できません。"
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "フォローを削除できません"
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "フォローを削除できません"
 
@@ -4558,20 +4648,20 @@ msgstr "フォローを削除できません"
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "ようこそ %1$s、@%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "グループを作成できません。"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "グループメンバーシップをセットできません。"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "グループメンバーシップをセットできません。"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "フォローを保存できません。"
@@ -4613,194 +4703,187 @@ msgstr ""
 msgid "Untitled page"
 msgstr "名称未設定ページ"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "プライマリサイトナビゲーション"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "パーソナルプロファイルと友人のタイムライン"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "パーソナル"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "メールアドレス、アバター、パスワード、プロパティの変更"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "アカウント"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "サービスへ接続"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "接続"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "サイト設定の変更"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "管理者"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "友人や同僚が %s で加わるよう誘ってください。"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "招待"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "サイトからログアウト"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "ログアウト"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "アカウントを作成"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "登録"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "サイトへログイン"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "ログイン"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "助けて!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "ヘルプ"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "人々かテキストを検索"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "検索"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "サイトつぶやき"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "ローカルビュー"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "ページつぶやき"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "セカンダリサイトナビゲーション"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "ヘルプ"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "About"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "よくある質問"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "プライバシー"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "ソース"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "連絡先"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "バッジ"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet ソフトウェアライセンス"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4809,12 +4892,12 @@ msgstr ""
 "**%%site.name%%** は [%%site.broughtby%%](%%site.broughtbyurl%%) が提供するマ"
 "イクロブログサービスです。 "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** はマイクロブログサービスです。 "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4825,53 +4908,53 @@ msgstr ""
 "いています。 ライセンス [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)。"
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "サイト内容ライセンス"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "全て "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "ライセンス。"
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "ページ化"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "<<後"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "前>>"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4886,91 +4969,80 @@ msgid "Changes to that panel are not allowed."
 msgstr "そのパネルへの変更は許可されていません。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() は実装されていません。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() は実装されていません。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "デザイン設定を削除できません。"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "基本サイト設定"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "サイト"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "デザイン設定"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "デザイン"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "ユーザ設定"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "ユーザ"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "アクセス設定"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "アクセス"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "パス設定"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "パス"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "セッション設定"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "セッション"
+msgid "Edit site notice"
+msgstr "サイトつぶやき"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "パス設定"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5161,12 +5233,12 @@ msgstr "%s はグループ %s に残りました。"
 msgid "Fullname: %s"
 msgstr "フルネーム: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "場所: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "ホームページ: %s"
@@ -5460,6 +5532,11 @@ msgstr "タグを選んで、リストを狭くしてください"
 msgid "Go"
 msgstr "移動"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "グループやトピックのホームページやブログの URL"
@@ -5595,11 +5672,11 @@ msgstr "ユーザ名とパスワードでログイン"
 msgid "Sign up for a new account"
 msgstr "新しいアカウントでサインアップ"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "メールアドレス確認"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5628,12 +5705,12 @@ msgstr ""
 "ありがとうございます。\n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s は %2$s であなたのつぶやきを聞いています。"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5658,17 +5735,17 @@ msgstr ""
 "----\n"
 "%8$s でメールアドレスか通知オプションを変えてください。\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "自己紹介: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "%s へ投稿のための新しいメールアドレス"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, fuzzy, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5689,21 +5766,21 @@ msgstr ""
 "忠実である、あなたのもの、\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s の状態"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS確認"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "あなたは %s に合図されています"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, fuzzy, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5730,12 +5807,12 @@ msgstr ""
 "敬具\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "%s からの新しいプライベートメッセージ"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, fuzzy, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5768,12 +5845,12 @@ msgstr ""
 "敬具\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) はお気に入りとしてあなたのつぶやきを加えました"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, fuzzy, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5811,12 +5888,12 @@ msgstr ""
 "忠実である、あなたのもの、\n"
 "%6%s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) はあなた宛てにつぶやきを送りました"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6081,10 +6158,6 @@ msgstr "返信"
 msgid "Favorites"
 msgstr "お気に入り"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "ユーザ"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "受信箱"
@@ -6110,7 +6183,7 @@ msgstr "%s のつぶやきのタグ"
 msgid "Unknown"
 msgstr "不明"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "フォロー"
 
@@ -6118,23 +6191,23 @@ msgstr "フォロー"
 msgid "All subscriptions"
 msgstr "すべてのフォロー"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "フォローされている"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "すべてのフォローされている"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ユーザID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "利用開始日"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "全てのグループ"
 
@@ -6174,7 +6247,12 @@ msgstr "このつぶやきを繰り返しますか?"
 msgid "Repeat this notice"
 msgstr "このつぶやきを繰り返す"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "このグループからこのユーザをブロック"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "single-user モードのためのシングルユーザが定義されていません。"
 
@@ -6329,47 +6407,64 @@ msgstr "メッセージ"
 msgid "Moderate"
 msgstr "管理"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "ユーザプロファイル"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "管理者"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "管理"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "数秒前"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "約 1 分前"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "約 %d 分前"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "約 1 時間前"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "約 %d 時間前"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "約 1 日前"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "約 %d 日前"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "約 1 ヵ月前"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "約 %d ヵ月前"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "約 1 年前"
 
index aca8a093adfd1eae3f4e0ccb2882495f1f4fc251..69bf4efb938b7b5f0b9f6ae959d002cb59980801 100644 (file)
@@ -7,19 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:13+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:22+0000\n"
 "Language-Team: Korean\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ko\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "수락"
@@ -107,7 +108,7 @@ msgstr "그러한 태그가 없습니다."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +124,7 @@ msgstr "%s 와 친구들, %d 페이지"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -178,7 +179,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s 및 친구들"
@@ -206,11 +207,11 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 메서드를 찾을 수 없습니다."
@@ -583,7 +584,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "계정"
 
@@ -675,18 +676,6 @@ msgstr "%s / %s의 좋아하는 글들"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s 좋아하는 글이 업데이트 됐습니다. %S에 의해 / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s 타임라인"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "%2$s에 있는 %1$s의 업데이트!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -697,12 +686,12 @@ msgstr "%1$s / %2$s에게 답신 업데이트"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s님이 %2$s/%3$s의 업데이트에 답변했습니다."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s 공개 타임라인"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "모두로부터의 업데이트 %s개!"
@@ -722,7 +711,7 @@ msgstr "%s에 답신"
 msgid "Notices tagged with %s"
 msgstr "%s 태그된 통지"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s에 있는 %1$s의 업데이트!"
@@ -763,7 +752,7 @@ msgstr "당신의 개인적인 아바타를 업로드할 수 있습니다."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "프로필 매칭이 없는 사용자"
 
@@ -954,7 +943,7 @@ msgid "Conversation"
 msgstr "인증 코드"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "통지"
 
@@ -976,7 +965,7 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "당신의 세션토큰관련 문제가 있습니다."
 
@@ -1183,8 +1172,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1312,7 +1302,7 @@ msgstr "설명이 너무 길어요. (최대 140글자)"
 msgid "Could not update group."
 msgstr "그룹을 업데이트 할 수 없습니다."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "좋아하는 게시글을 생성할 수 없습니다."
@@ -1438,7 +1428,7 @@ msgid "Cannot normalize that email address"
 msgstr "그 이메일 주소를 정규화 할 수 없습니다."
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "유효한 이메일 주소가 아닙니다."
 
@@ -1634,6 +1624,25 @@ msgstr "그러한 통지는 없습니다."
 msgid "Cannot read file."
 msgstr "파일을 잃어버렸습니다."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "옳지 않은 크기"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "회원이 당신을 차단해왔습니다."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1789,12 +1798,18 @@ msgstr "관리자"
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s 타임라인"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s에 있는 %1$s의 업데이트!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "그룹"
@@ -2403,8 +2418,8 @@ msgstr "연결"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "지원하는 형식의 데이터가 아닙니다."
 
@@ -2550,7 +2565,8 @@ msgstr "새 비밀번호를 저장 할 수 없습니다."
 msgid "Password saved."
 msgstr "비밀 번호 저장"
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2678,7 +2694,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "복구"
@@ -2737,11 +2753,11 @@ msgstr "유효한 태그가 아닙니다: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "이용자 셀프 테크 %s - %d 페이지"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "옳지 않은 통지 내용"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2820,7 +2836,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr "당신을 위한 태그, (문자,숫자,-, ., _로 구성) 콤마 혹은 공백으로 구분."
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "언어"
 
@@ -2846,7 +2862,7 @@ msgstr "나에게 구독하는 사람에게 자동 구독 신청"
 msgid "Bio is too long (max %d chars)."
 msgstr "자기소개가 너무 깁니다. (최대 140글자)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "타임존이 설정 되지 않았습니다."
 
@@ -3154,7 +3170,7 @@ msgid "Same as password above. Required."
 msgstr "위와 같은 비밀 번호. 필수 사항."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "이메일"
 
@@ -3259,7 +3275,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "다른 마이크로블로깅 서비스의 귀하의 프로필 URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "구독"
 
@@ -3364,6 +3380,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "%2$s에서 %1$s까지 메시지"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "프로필 매칭이 없는 사용자"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3379,7 +3405,9 @@ msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다."
 msgid "User is already sandboxed."
 msgstr "회원이 당신을 차단해왔습니다."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3403,7 +3431,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3439,8 +3467,8 @@ msgstr "페이지수"
 msgid "Description"
 msgstr "설명"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "통계"
 
@@ -3573,46 +3601,46 @@ msgstr ""
 msgid "Group actions"
 msgstr "그룹 행동"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s의 보낸쪽지함"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "회원"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(없습니다.)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "모든 회원"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "생성"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3622,7 +3650,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3633,7 +3661,7 @@ msgstr ""
 "**%s** 는 %%%%site.name%%%% [마이크로블로깅)(http://en.wikipedia.org/wiki/"
 "Micro-blogging)의 사용자 그룹입니다. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 #, fuzzy
 msgid "Admins"
 msgstr "관리자"
@@ -3749,150 +3777,139 @@ msgid "User is already silenced."
 msgstr "회원이 당신을 차단해왔습니다."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "유효한 이메일 주소가 아닙니다."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "사이트 공지"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "%s에 포스팅 할 새로운 이메일 주소"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "로컬 뷰"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "언어 설정"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "사이트 공지"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "새로운 메시지입니다."
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "트위터 환경설정을 저장할 수 없습니다."
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "사이트 공지"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "사이트 공지"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3995,6 +4012,66 @@ msgstr "귀하의 휴대폰의 통신회사는 무엇입니까?"
 msgid "No code entered"
 msgstr "코드가 입력 되지 않았습니다."
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "주 사이트 네비게이션"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "아바타 설정"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "당신은 이 프로필에 구독되지 않고있습니다."
@@ -4197,7 +4274,7 @@ msgstr "요청한 프로필id가 없습니다."
 msgid "Unsubscribed"
 msgstr "구독취소 되었습니다."
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4406,16 +4483,22 @@ msgstr "%s 그룹 회원, %d페이지"
 msgid "Search for more groups"
 msgstr "프로필이나 텍스트 검색"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "%2$s에 있는 %1$s의 업데이트!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4459,7 +4542,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "개인적인"
@@ -4528,23 +4611,23 @@ msgstr "새 URI와 함께 메시지를 업데이트할 수 없습니다."
 msgid "DB error inserting hashtag: %s"
 msgstr "해쉬테그를 추가 할 때에 데이타베이스 에러 : %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "게시글 저장문제. 알려지지않은 회원"
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4553,20 +4636,20 @@ msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었습니다."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4594,7 +4677,12 @@ msgstr "구독하고 있지 않습니다!"
 msgid "Couldn't delete self-subscription."
 msgstr "예약 구독을 삭제 할 수 없습니다."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "예약 구독을 삭제 할 수 없습니다."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "예약 구독을 삭제 할 수 없습니다."
 
@@ -4603,20 +4691,20 @@ msgstr "예약 구독을 삭제 할 수 없습니다."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%2$s에서 %1$s까지 메시지"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "새 그룹을 만들 수 없습니다."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "그룹 맴버십을 세팅할 수 없습니다."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "그룹 맴버십을 세팅할 수 없습니다."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "구독을 저장할 수 없습니다."
@@ -4659,195 +4747,188 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "제목없는 페이지"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "주 사이트 네비게이션"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "개인 프로필과 친구 타임라인"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "개인적인"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "당신의 이메일, 아바타, 비밀 번호, 프로필을 변경하세요."
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "계정"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "서버에 재접속 할 수 없습니다 : %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "연결"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "주 사이트 네비게이션"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "관리자"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "%s에 친구를 가입시키기 위해 친구와 동료를 초대합니다."
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "초대"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "이 사이트로부터 로그아웃"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "로그아웃"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "계정 만들기"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "회원가입"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "이 사이트 로그인"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "로그인"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "도움이 필요해!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "도움말"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "프로필이나 텍스트 검색"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "검색"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "사이트 공지"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "로컬 뷰"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "페이지 공지"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "보조 사이트 네비게이션"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "도움말"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "정보"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "자주 묻는 질문"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "개인정보 취급방침"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "소스 코드"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "연락하기"
 
-#: lib/action.php:782
+#: lib/action.php:771
 #, fuzzy
 msgid "Badge"
 msgstr "찔러 보기"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "라코니카 소프트웨어 라이선스"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4856,12 +4937,12 @@ msgstr ""
 "**%%site.name%%** 는 [%%site.broughtby%%](%%site.broughtbyurl%%)가 제공하는 "
 "마이크로블로깅서비스입니다."
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** 는 마이크로블로깅서비스입니다."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4872,54 +4953,54 @@ msgstr ""
 "을 사용합니다. StatusNet는 [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html) 라이선스에 따라 사용할 수 있습니다."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "라코니카 소프트웨어 라이선스"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "모든 것"
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "라이선스"
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "페이지수"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "뒷 페이지"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "앞 페이지"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4936,99 +5017,89 @@ msgid "Changes to that panel are not allowed."
 msgstr "가입이 허용되지 않습니다."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "명령이 아직 실행되지 않았습니다."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "명령이 아직 실행되지 않았습니다."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "트위터 환경설정을 저장할 수 없습니다."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "이메일 주소 확인서"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "초대"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS 인증"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "개인적인"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS 인증"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "이용자"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS 인증"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "수락"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS 인증"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS 인증"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "개인적인"
+msgid "Edit site notice"
+msgstr "사이트 공지"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS 인증"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5221,12 +5292,12 @@ msgstr "%s가 그룹%s를 떠났습니다."
 msgid "Fullname: %s"
 msgstr "전체이름: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "위치: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "홈페이지: %s"
@@ -5528,6 +5599,11 @@ msgstr "좁은 리스트에서 태그 선택하기"
 msgid "Go"
 msgstr "Go "
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "그룹 혹은 토픽의 홈페이지나 블로그 URL"
@@ -5665,11 +5741,11 @@ msgstr "사용자 이름과 비밀번호로 로그인"
 msgid "Sign up for a new account"
 msgstr "새 계정을 위한 회원가입"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "이메일 주소 확인서"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5686,12 +5762,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s님이 귀하의 알림 메시지를 %2$s에서 듣고 있습니다."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5710,19 +5786,19 @@ msgstr ""
 "\n"
 "그럼 이만,%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "소개: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "%s에 포스팅 할 새로운 이메일 주소"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5737,21 +5813,21 @@ msgstr ""
 "포스팅 주소는 %1$s입니다.새 메시지를 등록하려면 %2$ 주소로 이메일을 보내십시"
 "오.이메일 사용법은 %3$s 페이지를 보십시오.안녕히,%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s 상태"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS 인증"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s 사용자가 찔러 봤습니다."
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5767,12 +5843,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "%s로부터 새로운 비밀 메시지가 도착하였습니다."
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5791,12 +5867,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s님이 당신의 게시글을 좋아하는 글로 추가했습니다."
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5817,12 +5893,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6071,10 +6147,6 @@ msgstr "답신"
 msgid "Favorites"
 msgstr "좋아하는 글들"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "이용자"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "받은 쪽지함"
@@ -6101,7 +6173,7 @@ msgstr "%s의 게시글의 태그"
 msgid "Unknown"
 msgstr "알려지지 않은 행동"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "구독"
 
@@ -6109,24 +6181,24 @@ msgstr "구독"
 msgid "All subscriptions"
 msgstr "모든 예약 구독"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "구독자"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "모든 구독자"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "이용자"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "가입한 때"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "모든 그룹"
 
@@ -6169,7 +6241,12 @@ msgstr "이 게시글에 대해 답장하기"
 msgid "Repeat this notice"
 msgstr "이 게시글에 대해 답장하기"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "이 그룹의 회원리스트"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6333,47 +6410,63 @@ msgstr "메시지"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "이용자 프로필"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "관리자"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "몇 초 전"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "1분 전"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d분 전"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "1시간 전"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d시간 전"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "하루 전"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "%d일 전"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "1달 전"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "%d달 전"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "1년 전"
 
index b80b0c905ea0f480c4802d5345b8f7de1caa8816..74b9cb2280a1cb75a732e7ad5b2e9b5da7f5cdd7 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:16+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:24+0000\n"
 "Language-Team: Macedonian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: mk\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural= n==1 || n%10==1 ? 0 : 1;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Пристап"
 
@@ -44,10 +45,9 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
-msgstr "Ð\9fÑ\80иваÑ\82ен"
+msgstr "Ð\9fÑ\80иваÑ\82но"
 
 #. TRANS: Checkbox instructions for admin setting "Invite only"
 #: actions/accessadminpanel.php:174
@@ -75,7 +75,6 @@ msgid "Save access settings"
 msgstr "Зачувај нагодувања на пристап"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Зачувај"
@@ -104,7 +103,7 @@ msgstr "Нема таква страница"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +119,7 @@ msgstr "%1$s и пријателите, стр. %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -184,7 +183,7 @@ msgstr ""
 "прочита."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Вие и пријателите"
 
@@ -211,11 +210,11 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API методот не е пронајден."
 
@@ -579,7 +578,7 @@ msgstr ""
 "<strong>%3$s</strong> податоците за Вашата %4$s сметка. Треба да дозволувате "
 "пристап до Вашата %4$s сметка само на трети страни на кои им верувате."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Сметка"
 
@@ -668,18 +667,6 @@ msgstr "%1$s / Омилени од %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "Подновувања на %1$s омилени на %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Историја на %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Подновувања од %1$s на %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -690,12 +677,12 @@ msgstr "%1$s / Подновувања кои споменуваат %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s подновувања коишто се одговор на подновувањата од %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Јавна историја на %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s подновуввања од сите!"
@@ -715,7 +702,7 @@ msgstr "Повторувања на %s"
 msgid "Notices tagged with %s"
 msgstr "Забелешки означени со %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Подновувањата се означени со %1$s на %2$s!"
@@ -757,7 +744,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Корисник без соодветен профил"
 
@@ -944,7 +931,7 @@ msgid "Conversation"
 msgstr "Разговор"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Забелешки"
 
@@ -963,7 +950,7 @@ msgstr "Не сте сопственик на овој програм."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Се појави проблем со Вашиот сесиски жетон."
 
@@ -1159,8 +1146,9 @@ msgstr "Врати по основно"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1276,7 +1264,7 @@ msgstr "описот е предолг (максимум  %d знаци)"
 msgid "Could not update group."
 msgstr "Не можев да ја подновам групата."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Не можеше да се создадат алијаси."
 
@@ -1401,7 +1389,7 @@ msgid "Cannot normalize that email address"
 msgstr "Неможам да ја нормализирам таа е-поштенска адреса"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Неправилна адреса за е-пошта."
 
@@ -1594,6 +1582,22 @@ msgstr "Нема таква податотека."
 msgid "Cannot read file."
 msgstr "Податотеката не може да се прочита."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Погрешна улога."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Оваа улога е резервирана и не може да се зададе."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Не можете да им доделувате улоги на корисниците на оваа веб-страница."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Корисникот веќе ја има таа улога."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1743,12 +1747,18 @@ msgstr "Направи го/ја администратор"
 msgid "Make this user an admin"
 msgstr "Направи го корисникот администратор"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Историја на %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Подновувања од членови на %1$s на %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Групи"
@@ -2011,7 +2021,6 @@ msgstr "Можете да додадете и лична порака во по
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Испрати"
@@ -2373,8 +2382,8 @@ msgstr "тип на содржини "
 msgid "Only "
 msgstr "Само "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Ова не е поддржан формат на податотека."
 
@@ -2515,7 +2524,8 @@ msgstr "Не можам да ја зачувам новата лозинка."
 msgid "Password saved."
 msgstr "Лозинката е зачувана."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Патеки"
 
@@ -2635,7 +2645,7 @@ msgstr "Директориум на позадината"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Никогаш"
 
@@ -2691,11 +2701,11 @@ msgstr "Не е важечка ознака за луѓе: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Користници самоозначени со %1$s - стр. %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Неважечка содржина на забелешката"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2777,7 +2787,7 @@ msgstr ""
 "Ознаки за Вас самите (букви, бројки, -, . и _), одделени со запирка или "
 "празно место"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Јазик"
 
@@ -2805,7 +2815,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Биографијата е преголема (највеќе до %d знаци)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Не е избрана часовна зона."
 
@@ -3126,7 +3136,7 @@ msgid "Same as password above. Required."
 msgstr "Исто што и лозинката погоре. Задолжително поле."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Е-пошта"
 
@@ -3233,7 +3243,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL на Вашиот профил на друга компатибилна служба за микроблогирање."
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Претплати се"
 
@@ -3337,6 +3347,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Одговори на %1$s на %2$s!"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "На оваа веб-страница не можете да одземате кориснички улоги."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Корисникот ја нема оваа улога."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3349,7 +3367,9 @@ msgstr "Не можете да ставате корисници во песоч
 msgid "User is already sandboxed."
 msgstr "Корисникот е веќе во песочен режим."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Сесии"
 
@@ -3373,7 +3393,7 @@ msgstr "Поправка на грешки во сесија"
 msgid "Turn on debugging output for sessions."
 msgstr "Вклучи извод од поправка на грешки за сесии."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Зачувај нагодувања на веб-страницата"
@@ -3404,8 +3424,8 @@ msgstr "Организација"
 msgid "Description"
 msgstr "Опис"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Статистики"
 
@@ -3549,45 +3569,45 @@ msgstr "Алијаси"
 msgid "Group actions"
 msgstr "Групни дејства"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Канал со забелешки за групата %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Канал со забелешки за групата %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Канал со забелешки за групата%s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF за групата %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Членови"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Нема)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Сите членови"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Создадено"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3603,7 +3623,7 @@ msgstr ""
 "се](%%%%action.register%%%%) за да станете дел од оваа група и многу повеќе! "
 "([Прочитајте повеќе](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3616,7 +3636,7 @@ msgstr ""
 "слободната програмска алатка [StatusNet](http://status.net/). Нејзините "
 "членови си разменуваат кратки пораки за нивниот живот и интереси. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Администратори"
 
@@ -3738,152 +3758,138 @@ msgid "User is already silenced."
 msgstr "Корисникот е веќе замолчен."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Ð\9eÑ\81новни Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа за оваа StatusNet веб-страница."
+msgid "Basic settings for this StatusNet site"
+msgstr "Ð\9eÑ\81новни Ð¿Ð¾Ñ\81Ñ\82авки за оваа StatusNet веб-страница."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Должината на името на веб-страницата не може да изнесува нула."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Мора да имате важечка контактна е-поштенска адреса."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Непознат јазик „%s“"
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Неважечки URL за извештај од снимката."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Неважечка вредност на пуштањето на снимката."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Честотата на снимките мора да биде бројка."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Минималното ограничување на текстот изнесува 140 знаци."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Ограничувањето на дуплирањето мора да изнесува барем 1 секунда."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Општи"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Име на веб-страницата"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Името на Вашата веб-страница, како на пр. „Микроблог на Вашафирма“"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Овозможено од"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 "Текст за врската за наведување на авторите во долната колонцифра на секоја "
 "страница"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL-адреса на овозможувачот на услугите"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 "URL-адресата која е користи за врски за автори во долната колоцифра на "
 "секоја страница"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Контактна е-пошта за Вашата веб-страница"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Локално"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Основна часовна зона"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Матична часовна зона за веб-страницата; обично UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr "Основен јазик"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Снимки"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "По случајност во текот на посета"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Во зададена задача"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Снимки од податоци"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Кога да им се испраќаат статистички податоци на status.net серверите"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Честота"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Ќе се испраќаат снимки на секои N посети"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL на извештајот"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Снимките ќе се испраќаат на оваа URL-адреса"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr "Јазик на веб-страницата ако прелистувачот не може да го препознае сам"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Ограничувања"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Ограничување на текстот"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Максимален број на знаци за забелешки."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Ограничување на дуплирањето"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Колку долго треба да почекаат корисниците (во секунди) за да можат повторно "
 "да го објават истото."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Објава на страница"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Уреди објава за цела веб-страница"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Не можам да ја зачувам објавата за веб-страницата."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "Објавата за цела веб-страница не треба да има повеќе од 255 знаци"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Текст на објавата за веб-страницата"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+"Текст за главна објава по цела веб-страница (највеќе до 255 знаци; дозволено "
+"и HTML)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Зачувај ја објавава"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Нагодувања за СМС"
@@ -3983,6 +3989,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Нема внесено код"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Снимки"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Раководење со поставки за снимки"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Неважечка вредност на пуштањето на снимката."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Честотата на снимките мора да биде бројка."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Неважечки URL за извештај од снимката."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "По случајност во текот на посета"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Во зададена задача"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Снимки од податоци"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Кога да им се испраќаат статистички податоци на status.net серверите"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Честота"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Ќе се испраќаат снимки на секои N посети"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL на извештајот"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Снимките ќе се испраќаат на оваа URL-адреса"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Зачувај поставки за снимки"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Не сте претплатени на тој профил."
@@ -4190,7 +4254,7 @@ msgstr "Во барањето нема id на профилот."
 msgid "Unsubscribed"
 msgstr "Претплатата е откажана"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4200,7 +4264,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Корисник"
@@ -4394,18 +4457,24 @@ msgstr "Групи %1$s, стр. %2$d"
 msgid "Search for more groups"
 msgstr "Пребарај уште групи"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s не членува во ниедна група."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Обидете се со [пребарување на групи](%%action.groupsearch%%) и придружете им "
 "се."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Подновувања од %1$s на %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4461,7 +4530,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Приклучоци"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Верзија"
 
@@ -4527,22 +4596,22 @@ msgstr "Не можев да ја подновам пораката со нов
 msgid "DB error inserting hashtag: %s"
 msgstr "Грешка во базата на податоци при вметнувањето на хеш-ознака: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Проблем со зачувувањето на белешката. Премногу долго."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблем со зачувувањето на белешката. Непознат корисник."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Премногу забелњшки за прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4550,19 +4619,19 @@ msgstr ""
 "Премногу дуплирани пораки во прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Забрането Ви е да објавувате забелешки на оваа веб-страница."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Проблем во зачувувањето на белешката."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Проблем при зачувувањето на групното приемно сандаче."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4588,7 +4657,11 @@ msgstr "Не сте претплатени!"
 msgid "Couldn't delete self-subscription."
 msgstr "Не можам да ја избришам самопретплатата."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Не можете да го избришете OMB-жетонот за претплата."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Претплата не може да се избрише."
 
@@ -4597,19 +4670,19 @@ msgstr "Претплата не може да се избрише."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добредојдовте на %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Не можев да ја создадам групата."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Не можев да поставам URI на групата."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Не можев да назначам членство во групата."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Не можев да ги зачувам информациите за локалните групи."
 
@@ -4650,194 +4723,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Страница без наслов"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Главна навигација"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
-msgstr "Личен профил и историја на пријатели"
+msgstr "Личен профил и хронологија на пријатели"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
-msgstr "Ð\9bиÑ\87ен"
+msgstr "Ð\9bиÑ\87но"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Промена на е-пошта, аватар, лозинка, профил"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Сметка"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Поврзи се со услуги"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Поврзи се"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr "Ð\9fÑ\80омена Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86иÑ\98аÑ\82а на веб-страницата"
+msgstr "Ð\9fÑ\80омена Ð½Ð° Ð¿Ð¾Ñ\81Ñ\82авкиÑ\82е на веб-страницата"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
-msgstr "Администратор"
+msgstr "Админ"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Поканете пријатели и колеги да Ви се придружат на %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Покани"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Одјава"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
-msgstr "Ð\9eдÑ\98ави Ñ\81е"
+msgstr "Ð\9eдÑ\98ава"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Создај сметка"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
-msgstr "РегиÑ\81Ñ\82Ñ\80иÑ\80аÑ\98 Ñ\81е"
+msgstr "РегиÑ\81Ñ\82Ñ\80аÑ\86иÑ\98а"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Најава"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Најава"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Напомош!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Помош"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Пребарајте луѓе или текст"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Барај"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Напомена за веб-страницата"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Локални прегледи"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Напомена за страницата"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Споредна навигација"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Помош"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "За"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "ЧПП"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Услови"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Приватност"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Изворен код"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Значка"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Лиценца на програмот StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4846,12 +4895,12 @@ msgstr ""
 "**%%site.name%%** е сервис за микроблогирање што ви го овозможува [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** е сервис за микроблогирање."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4862,57 +4911,57 @@ msgstr ""
 "верзија %s, достапен пд [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Лиценца на содржините на веб-страницата"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Содржината и податоците на %1$s се лични и доверливи."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Авторските права на содржината и податоците се во сопственост на %1$s. Сите "
 "права задржани."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторските права на содржината и податоците им припаѓаат на учесниците. Сите "
 "права задржани."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Сите "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "лиценца."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Прелом на страници"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "По"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Пред"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Сè уште не е поддржана обработката на оддалечена содржина."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Сè уште не е поддржана обработката на XML содржина."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Сè уште не е достапна обработката на вметната Base64 содржина."
 
@@ -4927,91 +4976,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Менувањето на тој алатник не е дозволено."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() не е имплементирано."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не е имплементирано."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Не можам да ги избришам нагодувањата за изглед."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Основни нагодувања на веб-страницата"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Веб-страница"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Конфигурација на изгледот"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Изглед"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Конфигурација на корисник"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Корисник"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Конфигурација на пристапот"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Пристап"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Конфигурација на патеки"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Патеки"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Конфигурација на сесиите"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Сесии"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Уреди објава за веб-страницата"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Поставки за снимки"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5201,12 +5235,12 @@ msgstr "%s ја напушти групата %s"
 msgid "Fullname: %s"
 msgstr "Име и презиме: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Локација: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Домашна страница: %s"
@@ -5540,6 +5574,11 @@ msgstr "Одберете ознака за да ја уточните листа
 msgid "Go"
 msgstr "Оди"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Додели улога „%s“ на корисников"
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL на страницата или блогот на групата или темата"
@@ -5677,11 +5716,11 @@ msgstr "Најава со корисничко име и лозинка"
 msgid "Sign up for a new account"
 msgstr "Создај нова сметка"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Потврдување на адресата"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5711,12 +5750,12 @@ msgstr ""
 "Ви благодариме за потрошеното време,  \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s сега ги следи Вашите забелешки на %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5742,17 +5781,17 @@ msgstr ""
 "Изменете си ја е-поштенската адреса или ги нагодувањата за известувања на %8"
 "$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Биографија: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Нова е-поштенска адреса за објавување на %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5773,21 +5812,21 @@ msgstr ""
 "Со искрена почит,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Статус на %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Потврда за СМС"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s Ве подбуцна"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5814,12 +5853,12 @@ msgstr ""
 "Со почит,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Нова приватна порака од %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5852,12 +5891,12 @@ msgstr ""
 "Со почит,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) додаде Ваша забелешка како омилена"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5895,12 +5934,12 @@ msgstr ""
 "Со искрена почит,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) Ви испрати забелешка што сака да ја прочитате"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6161,10 +6200,6 @@ msgstr "Одговори"
 msgid "Favorites"
 msgstr "Омилени"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Корисник"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Примени"
@@ -6190,7 +6225,7 @@ msgstr "Ознаки во забелешките на %s"
 msgid "Unknown"
 msgstr "Непознато"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Претплати"
 
@@ -6198,23 +6233,23 @@ msgstr "Претплати"
 msgid "All subscriptions"
 msgstr "Сите претплати"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Претплатници"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Сите претплатници"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Кориснички ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Член од"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Сите групи"
 
@@ -6254,7 +6289,12 @@ msgstr "Да ја повторам белешкава?"
 msgid "Repeat this notice"
 msgstr "Повтори ја забелешкава"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Одземи му ја улогата „%s“ на корисников"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Не е зададен корисник за еднокорисничкиот режим."
 
@@ -6408,47 +6448,61 @@ msgstr "Порака"
 msgid "Moderate"
 msgstr "Модерирај"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Корисничка улога"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратор"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "пред неколку секунди"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "пред една минута"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "пред %d минути"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "пред еден час"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "пред %d часа"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "пред еден ден"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "пред %d денови"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "пред еден месец"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "пред %d месеца"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "пред една година"
 
index a3e64e0cb773b1c21e7ce2fbf1bceaba1b911166..b687e445e20cdba262fa62cf3cfbbfee5339138e 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:19+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-08 21:11:29+0000\n"
 "Language-Team: Norwegian (bokmål)‬\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63415); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: no\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Tilgang"
 
@@ -42,7 +43,6 @@ msgstr "Forhindre anonyme brukere (ikke innlogget) å se nettsted?"
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Privat"
@@ -73,7 +73,6 @@ msgid "Save access settings"
 msgstr "Lagre tilgangsinnstillinger"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Lagre"
@@ -102,7 +101,7 @@ msgstr "Ingen slik side"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -118,7 +117,7 @@ msgstr "%1$s og venner, side %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +179,7 @@ msgstr ""
 "eller post en notis for å få hans eller hennes oppmerksomhet."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Du og venner"
 
@@ -207,11 +206,11 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metode ikke funnet!"
@@ -572,7 +571,7 @@ msgstr ""
 "<strong>%3$s</strong> dine %4$s-kontodata. Du bør bare gi tilgang til din %4"
 "$s-konto til tredjeparter du stoler på."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -659,18 +658,6 @@ msgstr "%1$s / Favoritter fra %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s oppdateringer markert som favoritt av %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s tidslinje"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Oppdateringar fra %1$s på %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -681,12 +668,12 @@ msgstr "%1$s / Oppdateringer som nevner %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s oppdateringer som svarer på oppdateringer fra %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s offentlig tidslinje"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s oppdateringer fra alle sammen!"
@@ -706,7 +693,7 @@ msgstr "Repetisjoner av %s"
 msgid "Notices tagged with %s"
 msgstr "Notiser merket med %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Oppdateringer merket med %1$s på %2$s!"
@@ -746,7 +733,7 @@ msgstr "Du kan laste opp en personlig avatar. Maks filstørrelse er %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Bruker uten samsvarende profil"
 
@@ -932,7 +919,7 @@ msgid "Conversation"
 msgstr "Samtale"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notiser"
 
@@ -951,7 +938,7 @@ msgstr "Du er ikke eieren av dette programmet."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1105,11 +1092,11 @@ msgstr "Av"
 
 #: actions/designadminpanel.php:474 lib/designsettings.php:156
 msgid "Turn background image on or off."
-msgstr ""
+msgstr "Slå på eller av bakgrunnsbilde."
 
 #: actions/designadminpanel.php:479 lib/designsettings.php:161
 msgid "Tile background image"
-msgstr ""
+msgstr "Gjenta bakgrunnsbildet"
 
 #: actions/designadminpanel.php:488 lib/designsettings.php:170
 msgid "Change colours"
@@ -1147,8 +1134,9 @@ msgstr "Tilbakestill til standardverdier"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1223,7 +1211,7 @@ msgstr "Organisasjon er for lang (maks 255 tegn)."
 
 #: actions/editapplication.php:209 actions/newapplication.php:194
 msgid "Organization homepage is required."
-msgstr ""
+msgstr "Hjemmeside for organisasjon kreves."
 
 #: actions/editapplication.php:218 actions/newapplication.php:206
 msgid "Callback is too long."
@@ -1234,9 +1222,8 @@ msgid "Callback URL is not valid."
 msgstr ""
 
 #: actions/editapplication.php:258
-#, fuzzy
 msgid "Could not update application."
-msgstr "Klarte ikke å oppdatere bruker."
+msgstr "Kunne ikke oppdatere programmet."
 
 #: actions/editgroup.php:56
 #, php-format
@@ -1265,7 +1252,7 @@ msgstr "beskrivelse er for lang (maks %d tegn)"
 msgid "Could not update group."
 msgstr "Kunne ikke oppdatere gruppe."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Kunne ikke opprette alias."
 
@@ -1330,11 +1317,11 @@ msgstr "innkommende e-post"
 
 #: actions/emailsettings.php:138 actions/smssettings.php:157
 msgid "Send email to this address to post new notices."
-msgstr ""
+msgstr "Send e-post til denne adressen for å poste nye notiser."
 
 #: actions/emailsettings.php:145 actions/smssettings.php:162
 msgid "Make a new email address for posting to; cancels the old one."
-msgstr ""
+msgstr "Angi en ny e-postadresse for å poste til; fjerner den gamle."
 
 #: actions/emailsettings.php:148 actions/smssettings.php:164
 msgid "New"
@@ -1351,15 +1338,15 @@ msgstr ""
 
 #: actions/emailsettings.php:163
 msgid "Send me email when someone adds my notice as a favorite."
-msgstr ""
+msgstr "Send meg en e-post når noen legger min notis til som favoritt."
 
 #: actions/emailsettings.php:169
 msgid "Send me email when someone sends me a private message."
-msgstr ""
+msgstr "Send meg en e-post når noen sender meg en privat melding."
 
 #: actions/emailsettings.php:174
 msgid "Send me email when someone sends me an \"@-reply\"."
-msgstr ""
+msgstr "Send meg en e-post når noen sender meg et «@-svar»."
 
 #: actions/emailsettings.php:179
 msgid "Allow friends to nudge me and send me an email."
@@ -1367,7 +1354,7 @@ msgstr ""
 
 #: actions/emailsettings.php:185
 msgid "I want to post notices by email."
-msgstr ""
+msgstr "Jeg vil poste notiser med e-post."
 
 #: actions/emailsettings.php:191
 msgid "Publish a MicroID for my email address."
@@ -1387,7 +1374,7 @@ msgid "Cannot normalize that email address"
 msgstr "Klarer ikke normalisere epostadressen"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Ugyldig e-postadresse."
 
@@ -1397,12 +1384,12 @@ msgstr "Det er allerede din e-postadresse."
 
 #: actions/emailsettings.php:337
 msgid "That email address already belongs to another user."
-msgstr ""
+msgstr "Den e-postadressen tilhører allerede en annen bruker."
 
 #: actions/emailsettings.php:353 actions/imsettings.php:319
 #: actions/smssettings.php:337
 msgid "Couldn't insert confirmation code."
-msgstr ""
+msgstr "Kunne ikke sette inn bekreftelseskode."
 
 #: actions/emailsettings.php:359
 msgid ""
@@ -1437,7 +1424,7 @@ msgstr "Adressen ble fjernet."
 
 #: actions/emailsettings.php:446 actions/smssettings.php:518
 msgid "No incoming email address."
-msgstr ""
+msgstr "Ingen innkommende e-postadresse."
 
 #: actions/emailsettings.php:456 actions/emailsettings.php:478
 #: actions/smssettings.php:528 actions/smssettings.php:552
@@ -1450,15 +1437,15 @@ msgstr ""
 
 #: actions/emailsettings.php:481 actions/smssettings.php:555
 msgid "New incoming email address added."
-msgstr ""
+msgstr "Ny innkommende e-postadresse lagt til."
 
 #: actions/favor.php:79
 msgid "This notice is already a favorite!"
-msgstr ""
+msgstr "Denne notisen er allerede en favoritt."
 
 #: actions/favor.php:92 lib/disfavorform.php:140
 msgid "Disfavor favorite"
-msgstr ""
+msgstr "Fjern favoritt"
 
 #: actions/favorited.php:65 lib/popularnoticesection.php:91
 #: lib/publicgroupnav.php:93
@@ -1518,14 +1505,12 @@ msgid "A selection of some great users on %s"
 msgstr ""
 
 #: actions/file.php:34
-#, fuzzy
 msgid "No notice ID."
-msgstr "Nytt nick"
+msgstr "Ingen notis-ID."
 
 #: actions/file.php:38
-#, fuzzy
 msgid "No notice."
-msgstr "Nytt nick"
+msgstr "Ingen notis."
 
 #: actions/file.php:42
 msgid "No attachments."
@@ -1575,22 +1560,38 @@ msgstr "Ingen slik fil."
 msgid "Cannot read file."
 msgstr "Kan ikke lese fil."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Ugyldig rolle."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Denne rollen er reservert og kan ikke stilles inn."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Du kan ikke tildele brukerroller på dette nettstedet."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Bruker har allerede denne rollen."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
 msgid "No profile specified."
-msgstr ""
+msgstr "Ingen profil oppgitt."
 
 #: actions/groupblock.php:76 actions/groupunblock.php:76
 #: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46
 #: actions/unsubscribe.php:84 lib/profileformaction.php:77
 msgid "No profile with that ID."
-msgstr ""
+msgstr "Ingen profil med den ID'en."
 
 #: actions/groupblock.php:81 actions/groupunblock.php:81
 #: actions/makeadmin.php:81
 msgid "No group specified."
-msgstr ""
+msgstr "Ingen gruppe oppgitt."
 
 #: actions/groupblock.php:91
 msgid "Only an admin can block group members."
@@ -1603,11 +1604,11 @@ msgstr "Du er allerede logget inn!"
 
 #: actions/groupblock.php:100
 msgid "User is not a member of group."
-msgstr ""
+msgstr "Bruker er ikke et medlem av gruppa."
 
 #: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
-msgstr ""
+msgstr "Blokker bruker fra gruppe"
 
 #: actions/groupblock.php:162
 #, php-format
@@ -1619,7 +1620,7 @@ msgstr ""
 
 #: actions/groupblock.php:178
 msgid "Do not block this user from this group"
-msgstr ""
+msgstr "Ikke blokker denne brukeren fra denne gruppa"
 
 #: actions/groupblock.php:179
 msgid "Block this user from this group"
@@ -1718,12 +1719,18 @@ msgstr "Gjør til administrator"
 msgid "Make this user an admin"
 msgstr "Gjør denne brukeren til administrator"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s tidslinje"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Oppdateringer fra medlemmer av %1$s på %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupper"
@@ -1962,7 +1969,6 @@ msgstr ""
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Send"
@@ -2029,9 +2035,8 @@ msgid "You must be logged in to join a group."
 msgstr "Du må være innlogget for å bli med i en gruppe."
 
 #: actions/joingroup.php:88 actions/leavegroup.php:88
-#, fuzzy
 msgid "No nickname or ID."
-msgstr "Ingen kallenavn."
+msgstr "ngen kallenavn eller ID."
 
 #: actions/joingroup.php:141
 #, php-format
@@ -2145,28 +2150,28 @@ msgstr "Klarte ikke å lagre avatar-informasjonen"
 
 #: actions/newgroup.php:53
 msgid "New group"
-msgstr ""
+msgstr "Ny gruppe"
 
 #: actions/newgroup.php:110
 msgid "Use this form to create a new group."
-msgstr ""
+msgstr "Bruk dette skjemaet for å opprette en ny gruppe."
 
 #: actions/newmessage.php:71 actions/newmessage.php:231
 msgid "New message"
-msgstr ""
+msgstr "Ny melding"
 
 #: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:358
 msgid "You can't send a message to this user."
-msgstr ""
+msgstr "Du kan ikke sende en melding til denne brukeren."
 
 #: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:342
 #: lib/command.php:475
 msgid "No content!"
-msgstr ""
+msgstr "Inget innhold."
 
 #: actions/newmessage.php:158
 msgid "No recipient specified."
-msgstr ""
+msgstr "Ingen mottaker oppgitt."
 
 #: actions/newmessage.php:164 lib/command.php:361
 msgid ""
@@ -2175,7 +2180,7 @@ msgstr ""
 
 #: actions/newmessage.php:181
 msgid "Message sent"
-msgstr ""
+msgstr "Melding sendt"
 
 #: actions/newmessage.php:185
 #, fuzzy, php-format
@@ -2184,15 +2189,15 @@ msgstr "Direktemeldinger til %s"
 
 #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170
 msgid "Ajax Error"
-msgstr ""
+msgstr "Ajax-feil"
 
 #: actions/newnotice.php:69
 msgid "New notice"
-msgstr ""
+msgstr "Ny notis"
 
 #: actions/newnotice.php:211
 msgid "Notice posted"
-msgstr ""
+msgstr "Notis postet"
 
 #: actions/noticesearch.php:68
 #, php-format
@@ -2307,8 +2312,8 @@ msgstr "innholdstype "
 msgid "Only "
 msgstr "Bare "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2330,7 +2335,7 @@ msgstr ""
 
 #: actions/othersettings.php:108
 msgid " (free service)"
-msgstr ""
+msgstr "  (gratis tjeneste)"
 
 #: actions/othersettings.php:116
 msgid "Shorten URLs with"
@@ -2451,7 +2456,8 @@ msgstr "Klarer ikke å lagre nytt passord."
 msgid "Password saved."
 msgstr "Passordet ble lagret"
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2575,7 +2581,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Aldri"
 
@@ -2629,11 +2635,11 @@ msgstr "Ugyldig e-postadresse"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Mikroblogg av %s"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr ""
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2710,7 +2716,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Språk"
 
@@ -2737,7 +2743,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "«Om meg» er for lang (maks %d tegn)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Tidssone ikke valgt."
 
@@ -3041,7 +3047,7 @@ msgid "Same as password above. Required."
 msgstr "Samme som passord over. Kreves."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-post"
 
@@ -3143,7 +3149,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr ""
 
@@ -3244,6 +3250,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Svar til %1$s på %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Du er allerede logget inn!"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Brukeren har ingen profil."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3258,7 +3274,9 @@ msgstr "Du er allerede logget inn!"
 msgid "User is already sandboxed."
 msgstr "Du er allerede logget inn!"
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3282,7 +3300,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3314,8 +3332,8 @@ msgstr "Organisasjon"
 msgid "Description"
 msgstr "Beskrivelse"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistikk"
 
@@ -3449,47 +3467,47 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Medlem siden"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Opprett"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3499,7 +3517,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3508,7 +3526,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3622,146 +3640,135 @@ msgid "User is already silenced."
 msgstr "Du er allerede logget inn!"
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Ugyldig e-postadresse"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr ""
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr ""
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr ""
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
+msgstr "Foretrukket språk"
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Notiser"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Kunne ikke lagre dine innstillinger for utseende."
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Slett notis"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Innstillinger for IM"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3860,6 +3867,65 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Innstillinger for IM"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -4060,7 +4126,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4257,16 +4323,22 @@ msgstr "Alle abonnementer"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Du er allerede logget inn!"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Oppdateringar fra %1$s på %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4310,7 +4382,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Personlig"
@@ -4378,38 +4450,38 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4436,7 +4508,12 @@ msgstr "Alle abonnementer"
 msgid "Couldn't delete self-subscription."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Klarte ikke å lagre avatar-informasjonen"
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr ""
 
@@ -4445,22 +4522,22 @@ msgstr ""
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
@@ -4503,191 +4580,174 @@ msgstr "%1$s sin status på %2$s"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personlig"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Endre passordet ditt"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Koble til"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Koble til"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr ""
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
-msgstr "Kun invitasjon"
+msgstr "Inviter"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
-msgstr "Tema for nettstedet."
+msgstr "Logg ut fra nettstedet"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Logg ut"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
-msgstr "Opprett en ny konto"
+msgstr "Opprett en konto"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
-msgstr "Registrering"
+msgstr "Registrer"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
-msgstr "Tema for nettstedet."
+msgstr "Log inn på nettstedet"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Logg inn"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
-msgstr "Hjelp"
+msgstr "Hjelp meg."
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hjelp"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
-msgstr ""
+msgstr "Søk etter personer eller tekst"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Søk"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hjelp"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "OSS/FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Kilde"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4696,12 +4756,12 @@ msgstr ""
 "**%%site.name%%** er en mikrobloggingtjeneste av [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er en mikrobloggingtjeneste. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4709,61 +4769,60 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
-msgstr ""
+msgstr "Alle "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
-msgstr ""
+msgstr "lisens."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
-msgstr ""
+msgstr "Etter"
 
-#: lib/action.php:1180
-#, fuzzy
+#: lib/action.php:1169
 msgid "Before"
-msgstr "Tidligere »"
+msgstr "Før"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
-msgstr ""
+msgstr "Du kan ikke gjøre endringer på dette nettstedet."
 
 #. TRANS: Client error message
 #: lib/adminpanelaction.php:110
@@ -4771,89 +4830,79 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Nettstedslogo"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Personlig"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Tilgang"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Personlig"
+msgid "Edit site notice"
+msgstr "Slett notis"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr ""
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5046,12 +5095,12 @@ msgstr "%1$s sin status på %2$s"
 msgid "Fullname: %s"
 msgstr "Fullt navn"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5354,6 +5403,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5381,31 +5435,30 @@ msgstr ""
 
 #: lib/groupnav.php:85
 msgid "Group"
-msgstr ""
+msgstr "Gruppe"
 
 #: lib/groupnav.php:101
 msgid "Blocked"
-msgstr ""
+msgstr "Blokkert"
 
 #: lib/groupnav.php:102
 #, php-format
 msgid "%s blocked users"
-msgstr ""
+msgstr "%s blokkerte brukere"
 
 #: lib/groupnav.php:108
 #, php-format
 msgid "Edit %s group properties"
-msgstr ""
+msgstr "Rediger %s gruppeegenskaper"
 
 #: lib/groupnav.php:113
-#, fuzzy
 msgid "Logo"
-msgstr "Logg ut"
+msgstr "Logo"
 
 #: lib/groupnav.php:114
 #, php-format
 msgid "Add or edit %s logo"
-msgstr ""
+msgstr "Legg til eller rediger %s logo"
 
 #: lib/groupnav.php:120
 #, php-format
@@ -5414,11 +5467,11 @@ msgstr ""
 
 #: lib/groupsbymemberssection.php:71
 msgid "Groups with most members"
-msgstr ""
+msgstr "Grupper med flest medlemmer"
 
 #: lib/groupsbypostssection.php:71
 msgid "Groups with most posts"
-msgstr ""
+msgstr "Grupper med flest innlegg"
 
 #: lib/grouptagcloudsection.php:56
 #, php-format
@@ -5427,81 +5480,76 @@ msgstr ""
 
 #: lib/htmloutputter.php:103
 msgid "This page is not available in a media type you accept"
-msgstr ""
+msgstr "Denne siden er ikke tilgjengelig i en mediatype du aksepterer"
 
 #: lib/imagefile.php:75
 #, php-format
 msgid "That file is too big. The maximum file size is %s."
-msgstr ""
+msgstr "Filen er for stor. Maks filstørrelse er %s."
 
 #: lib/imagefile.php:80
 msgid "Partial upload."
-msgstr ""
+msgstr "Delvis opplasting."
 
 #: lib/imagefile.php:88 lib/mediafile.php:170
 msgid "System error uploading file."
-msgstr ""
+msgstr "Systemfeil ved opplasting av fil."
 
 #: lib/imagefile.php:96
 msgid "Not an image or corrupt file."
-msgstr ""
+msgstr "Ikke et bilde eller en korrupt fil."
 
 #: lib/imagefile.php:109
 msgid "Unsupported image file format."
-msgstr ""
+msgstr "Bildefilformatet støttes ikke."
 
 #: lib/imagefile.php:122
-#, fuzzy
 msgid "Lost our file."
-msgstr "Klarte ikke å lagre profil."
+msgstr "Mistet filen vår."
 
 #: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
-msgstr ""
+msgstr "Ukjent filtype"
 
 #: lib/imagefile.php:251
 msgid "MB"
-msgstr ""
+msgstr "MB"
 
 #: lib/imagefile.php:253
 msgid "kB"
-msgstr ""
+msgstr "kB"
 
 #: lib/jabber.php:220
 #, php-format
 msgid "[%s]"
-msgstr ""
+msgstr "[%s]"
 
 #: lib/jabber.php:400
 #, php-format
 msgid "Unknown inbox source %d."
-msgstr ""
+msgstr "Ukjent innbokskilde %d."
 
 #: lib/joinform.php:114
-#, fuzzy
 msgid "Join"
-msgstr "Logg inn"
+msgstr "Bli med"
 
 #: lib/leaveform.php:114
-#, fuzzy
 msgid "Leave"
-msgstr "Lagre"
+msgstr "Forlat"
 
 #: lib/logingroupnav.php:80
-#, fuzzy
 msgid "Login with a username and password"
-msgstr "Ugyldig brukernavn eller passord"
+msgstr "Logg inn med brukernavn og passord"
 
 #: lib/logingroupnav.php:86
-#, fuzzy
 msgid "Sign up for a new account"
-msgstr "Opprett en ny konto"
+msgstr "Registrer deg for en ny konto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
-msgstr ""
+msgstr "Bekreftelse av e-postadresse"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5517,14 +5565,26 @@ msgid ""
 "Thanks for your time, \n"
 "%s\n"
 msgstr ""
+"Hei %s.\n"
+"\n"
+"Noen skrev nettopp inn denne e-postadressen på %s.\n"
+"\n"
+"Dersom det var deg og du vil bekrefte det, bruk nettadressen under:\n"
+"\n"
+"%s\n"
+"\n"
+"Om ikke, bare ignorer denne meldingen.\n"
+"\n"
+"Takk for tiden din,\n"
+"%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s lytter nå til dine notiser på %2$s."
 
-#: lib/mail.php:241
-#, fuzzy, php-format
+#: lib/mail.php:245
+#, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
 "\n"
@@ -5539,22 +5599,26 @@ msgid ""
 msgstr ""
 "%1$s lytter nå til dine notiser på %2$s.\n"
 "\n"
-"\t%3$s\n"
+"%3$s\n"
 "\n"
+"%4$s%5$s%6$s\n"
 "Vennlig hilsen,\n"
-"%4$s.\n"
+"%7$s.\n"
+"\n"
+"----\n"
+"Endre e-postadressen din eller dine varslingsvalg på %8$s\n"
 
-#: lib/mail.php:258
-#, fuzzy, php-format
+#: lib/mail.php:262
+#, php-format
 msgid "Bio: %s"
-msgstr "Om meg"
+msgstr "Biografi: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
-msgstr ""
+msgstr "Ny e-postadresse for posting til %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5566,22 +5630,30 @@ msgid ""
 "Faithfully yours,\n"
 "%4$s"
 msgstr ""
+"Du har en ny adresse for posting på %1$s.\n"
+"\n"
+"Send e-post til %2$s for å poste nye meldinger.\n"
+"\n"
+"Flere e-postinstrukser på %3$s.\n"
+"\n"
+"Vennlig hilsen,\n"
+"%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
-msgstr ""
+msgstr "SMS-bekreftelse"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
-msgstr ""
+msgstr "Du har blitt knuffet av %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5596,13 +5668,24 @@ msgid ""
 "With kind regards,\n"
 "%4$s\n"
 msgstr ""
+"%1$s (%2$s) lurer på hva du gjør nå for tiden og inviterer deg til å poste "
+"noen nyheter.\n"
+"\n"
+"La oss høre fra deg :)\n"
+"\n"
+"%3$s\n"
+"\n"
+"Ikke svar på denne e-posten; det vil ikke nå frem til dem.\n"
+"\n"
+"Med vennlig hilsen,\n"
+"%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
-msgstr ""
+msgstr "Ny privat melding fra %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5620,13 +5703,27 @@ msgid ""
 "With kind regards,\n"
 "%5$s\n"
 msgstr ""
+"%1$s (%2$s) sendte deg en privat melding:\n"
+"\n"
+"------------------------------------------------------\n"
+"%3$s\n"
+"------------------------------------------------------\n"
+"\n"
+"Du kan svare på deres melding her:\n"
+"\n"
+"%4$s\n"
+"\n"
+"Ikke svar på denne e-posten; det vil ikke nå frem til dem.\n"
+"\n"
+"Med vennlig hilsen,\n"
+"%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
-msgstr ""
+msgstr "%s /@%s) la din notis til som en favoritt"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5646,13 +5743,29 @@ msgid ""
 "Faithfully yours,\n"
 "%6$s\n"
 msgstr ""
+"%1$s (@%7$s) la akkurat din notis fra %2$s til som en av sine favoritter.\n"
+"\n"
+"Nettadressen til din notis er:\n"
+"\n"
+"%3$s\n"
+"\n"
+"Teksten i din notis er:\n"
+"\n"
+"%4$s\n"
+"\n"
+"Du kan se listen over %1$s sine favoritter her:\n"
+"\n"
+"%5$s\n"
+"\n"
+"Vennlig hilsen,\n"
+"%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
-msgstr ""
+msgstr "%s (@%s) sendte en notis for din oppmerksomhet"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5666,29 +5779,42 @@ msgid ""
 "\t%4$s\n"
 "\n"
 msgstr ""
+"%1$s (@%9$s) sendte deg akkurat en notis for din oppmerksomhet (et '@-svar') "
+"på %2$s.\n"
+"\n"
+"Notisen er her:\n"
+"\n"
+"%3$s\n"
+"\n"
+"Den lyder:\n"
+"\n"
+"%4$s\n"
+"\n"
 
 #: lib/mailbox.php:89
 msgid "Only the user can read their own mailboxes."
-msgstr ""
+msgstr "Bare brukeren kan lese sine egne postbokser."
 
 #: lib/mailbox.php:139
 msgid ""
 "You have no private messages. You can send private message to engage other "
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
+"Du har ingen private meldinger. Du kan sende private meldinger for å "
+"engasjere andre brukere i en samtale. Personer kan sende deg meldinger som "
+"bare du kan se."
 
 #: lib/mailbox.php:227 lib/noticelist.php:482
-#, fuzzy
 msgid "from"
 msgstr "fra"
 
 #: lib/mailhandler.php:37
 msgid "Could not parse message."
-msgstr ""
+msgstr "Kunne ikke tolke meldingen."
 
 #: lib/mailhandler.php:42
 msgid "Not a registered user."
-msgstr ""
+msgstr "Ikke en registrert bruker."
 
 #: lib/mailhandler.php:46
 msgid "Sorry, that is not your incoming email address."
@@ -5699,9 +5825,9 @@ msgid "Sorry, no incoming email allowed."
 msgstr ""
 
 #: lib/mailhandler.php:228
-#, fuzzy, php-format
+#, php-format
 msgid "Unsupported message type: %s"
-msgstr "Direktemeldinger til %s"
+msgstr "Meldingstypen støttes ikke: %s"
 
 #: lib/mediafile.php:98 lib/mediafile.php:123
 msgid "There was a database error while saving your file. Please try again."
@@ -5731,103 +5857,100 @@ msgstr ""
 
 #: lib/mediafile.php:165
 msgid "File upload stopped by extension."
-msgstr ""
+msgstr "Filopplasting stoppet grunnet filendelse."
 
 #: lib/mediafile.php:179 lib/mediafile.php:216
 msgid "File exceeds user's quota."
-msgstr ""
+msgstr "Fil overgår brukers kvote."
 
 #: lib/mediafile.php:196 lib/mediafile.php:233
 msgid "File could not be moved to destination directory."
-msgstr ""
+msgstr "Filen kunne ikke flyttes til målmappen."
 
 #: lib/mediafile.php:201 lib/mediafile.php:237
-#, fuzzy
 msgid "Could not determine file's MIME type."
-msgstr "Klarte ikke å oppdatere bruker."
+msgstr "Kunne ikke avgjøre filens MIME-type."
 
 #: lib/mediafile.php:270
 #, php-format
 msgid " Try using another %s format."
-msgstr ""
+msgstr "  Prøv å bruke et annet %s-format."
 
 #: lib/mediafile.php:275
 #, php-format
 msgid "%s is not a supported file type on this server."
-msgstr ""
+msgstr "filtypen %s støttes ikke på denne tjeneren."
 
 #: lib/messageform.php:120
 msgid "Send a direct notice"
-msgstr ""
+msgstr "Send en direktenotis"
 
 #: lib/messageform.php:146
 msgid "To"
-msgstr ""
+msgstr "Til"
 
 #: lib/messageform.php:159 lib/noticeform.php:185
-#, fuzzy
 msgid "Available characters"
-msgstr "6 eller flere tegn"
+msgstr "Tilgjengelige tegn"
 
 #: lib/messageform.php:178 lib/noticeform.php:236
-#, fuzzy
 msgctxt "Send button for sending notice"
 msgid "Send"
 msgstr "Send"
 
 #: lib/noticeform.php:160
 msgid "Send a notice"
-msgstr ""
+msgstr "Send en notis"
 
 #: lib/noticeform.php:173
 #, php-format
 msgid "What's up, %s?"
-msgstr ""
+msgstr "Hva skjer %s?"
 
 #: lib/noticeform.php:192
 msgid "Attach"
-msgstr ""
+msgstr "Legg ved"
 
 #: lib/noticeform.php:196
 msgid "Attach a file"
-msgstr ""
+msgstr "Legg ved en fil"
 
 #: lib/noticeform.php:212
-#, fuzzy
 msgid "Share my location"
-msgstr "Klarte ikke å lagre profil."
+msgstr "Del min posisjon"
 
 #: lib/noticeform.php:215
-#, fuzzy
 msgid "Do not share my location"
-msgstr "Klarte ikke å lagre profil."
+msgstr "Ikke del min posisjon"
 
 #: lib/noticeform.php:216
 msgid ""
 "Sorry, retrieving your geo location is taking longer than expected, please "
 "try again later"
 msgstr ""
+"Beklager, henting av din geoposisjon tar lenger tid enn forventet, prøv "
+"igjen senere"
 
 #: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
-msgstr ""
+msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
 #: lib/noticelist.php:430
 msgid "N"
-msgstr ""
+msgstr "N"
 
 #: lib/noticelist.php:430
 msgid "S"
-msgstr ""
+msgstr "S"
 
 #: lib/noticelist.php:431
 msgid "E"
-msgstr ""
+msgstr "Ø"
 
 #: lib/noticelist.php:431
 msgid "W"
-msgstr ""
+msgstr "V"
 
 #: lib/noticelist.php:438
 msgid "at"
@@ -5838,35 +5961,32 @@ msgid "in context"
 msgstr ""
 
 #: lib/noticelist.php:601
-#, fuzzy
 msgid "Repeated by"
-msgstr "Opprett"
+msgstr "Repetert av"
 
 #: lib/noticelist.php:628
 msgid "Reply to this notice"
-msgstr ""
+msgstr "Svar på denne notisen"
 
 #: lib/noticelist.php:629
-#, fuzzy
 msgid "Reply"
-msgstr "svar"
+msgstr "Svar"
 
 #: lib/noticelist.php:673
-#, fuzzy
 msgid "Notice repeated"
-msgstr "Nytt nick"
+msgstr "Notis repetert"
 
 #: lib/nudgeform.php:116
 msgid "Nudge this user"
-msgstr ""
+msgstr "Knuff denne brukeren"
 
 #: lib/nudgeform.php:128
 msgid "Nudge"
-msgstr ""
+msgstr "Knuff"
 
 #: lib/nudgeform.php:128
 msgid "Send a nudge to this user"
-msgstr ""
+msgstr "Send et knuff til denne brukeren"
 
 #: lib/oauthstore.php:283
 msgid "Error inserting new profile"
@@ -5882,7 +6002,7 @@ msgstr ""
 
 #: lib/oauthstore.php:345
 msgid "Duplicate notice"
-msgstr ""
+msgstr "Duplikatnotis"
 
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
@@ -5898,27 +6018,23 @@ msgstr "Svar"
 
 #: lib/personalgroupnav.php:114
 msgid "Favorites"
-msgstr ""
-
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
+msgstr "Favoritter"
 
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
-msgstr ""
+msgstr "Innboks"
 
 #: lib/personalgroupnav.php:126
 msgid "Your incoming messages"
-msgstr ""
+msgstr "Dine innkommende meldinger"
 
 #: lib/personalgroupnav.php:130
 msgid "Outbox"
-msgstr ""
+msgstr "Utboks"
 
 #: lib/personalgroupnav.php:131
 msgid "Your sent messages"
-msgstr ""
+msgstr "Dine sendte meldinger"
 
 #: lib/personaltagcloudsection.php:56
 #, php-format
@@ -5927,36 +6043,35 @@ msgstr ""
 
 #: lib/plugin.php:114
 msgid "Unknown"
-msgstr ""
+msgstr "Ukjent"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
-msgstr ""
+msgstr "Abonnement"
 
 #: lib/profileaction.php:126
 msgid "All subscriptions"
 msgstr "Alle abonnementer"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
-msgstr ""
+msgstr "Abonnenter"
 
-#: lib/profileaction.php:157
-#, fuzzy
+#: lib/profileaction.php:159
 msgid "All subscribers"
-msgstr "Alle abonnementer"
+msgstr "Alle abonnenter"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
-msgstr ""
+msgstr "Bruker-ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Medlem siden"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
-msgstr ""
+msgstr "Alle grupper"
 
 #: lib/profileformaction.php:123
 msgid "No return-to arguments."
@@ -5964,16 +6079,15 @@ msgstr ""
 
 #: lib/profileformaction.php:137
 msgid "Unimplemented method."
-msgstr ""
+msgstr "Ikke-implementert metode."
 
 #: lib/publicgroupnav.php:78
-#, fuzzy
 msgid "Public"
 msgstr "Offentlig"
 
 #: lib/publicgroupnav.php:82
 msgid "User groups"
-msgstr ""
+msgstr "Brukergrupper"
 
 #: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85
 #, fuzzy
@@ -5989,16 +6103,19 @@ msgid "Popular"
 msgstr ""
 
 #: lib/repeatform.php:107
-#, fuzzy
 msgid "Repeat this notice?"
-msgstr "Kan ikke slette notisen."
+msgstr "Repeter denne notisen?"
 
 #: lib/repeatform.php:132
-#, fuzzy
 msgid "Repeat this notice"
-msgstr "Kan ikke slette notisen."
+msgstr "Repeter denne notisen"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr ""
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6012,38 +6129,36 @@ msgid "Sandbox this user"
 msgstr "Kan ikke slette notisen."
 
 #: lib/searchaction.php:120
-#, fuzzy
 msgid "Search site"
-msgstr "Søk"
+msgstr "Søk nettsted"
 
 #: lib/searchaction.php:126
 msgid "Keyword(s)"
-msgstr ""
+msgstr "Nøkkelord"
 
 #: lib/searchaction.php:127
 msgid "Search"
 msgstr "Søk"
 
 #: lib/searchaction.php:162
-#, fuzzy
 msgid "Search help"
-msgstr "Søk"
+msgstr "Søkehjelp"
 
 #: lib/searchgroupnav.php:80
 msgid "People"
-msgstr ""
+msgstr "Personer"
 
 #: lib/searchgroupnav.php:81
 msgid "Find people on this site"
-msgstr ""
+msgstr "Finn personer på dette nettstedet"
 
 #: lib/searchgroupnav.php:83
 msgid "Find content of notices"
-msgstr ""
+msgstr "Finn innhold i notiser"
 
 #: lib/searchgroupnav.php:85
 msgid "Find groups on this site"
-msgstr ""
+msgstr "Finn grupper på dette nettstedet"
 
 #: lib/section.php:89
 msgid "Untitled section"
@@ -6051,7 +6166,7 @@ msgstr ""
 
 #: lib/section.php:106
 msgid "More..."
-msgstr ""
+msgstr "Mer..."
 
 #: lib/silenceform.php:67
 msgid "Silence"
@@ -6079,7 +6194,7 @@ msgstr ""
 
 #: lib/subgroupnav.php:105
 msgid "Invite"
-msgstr ""
+msgstr "Inviter"
 
 #: lib/subgroupnav.php:106
 #, php-format
@@ -6098,7 +6213,7 @@ msgstr ""
 
 #: lib/tagcloudsection.php:56
 msgid "None"
-msgstr ""
+msgstr "Ingen"
 
 #: lib/topposterssection.php:74
 msgid "Top posters"
@@ -6140,81 +6255,94 @@ msgid "User actions"
 msgstr ""
 
 #: lib/userprofile.php:251
-#, fuzzy
 msgid "Edit profile settings"
-msgstr "Endre profilinnstillingene dine"
+msgstr "Endre profilinnstillinger"
 
 #: lib/userprofile.php:252
 msgid "Edit"
-msgstr ""
+msgstr "Rediger"
 
 #: lib/userprofile.php:275
 msgid "Send a direct message to this user"
-msgstr ""
+msgstr "Send en direktemelding til denne brukeren"
 
 #: lib/userprofile.php:276
 msgid "Message"
-msgstr ""
+msgstr "Melding"
 
 #: lib/userprofile.php:314
 msgid "Moderate"
-msgstr ""
+msgstr "Moderer"
+
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Brukerrolle"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
 
-#: lib/util.php:1013
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "noen få sekunder siden"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "omtrent ett minutt siden"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "omtrent %d minutter siden"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "omtrent én time siden"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "omtrent %d timer siden"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "omtrent én dag siden"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "omtrent %d dager siden"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "omtrent én måned siden"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "omtrent %d måneder siden"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "omtrent ett år siden"
 
 #: lib/webcolor.php:82
 #, php-format
 msgid "%s is not a valid color!"
-msgstr ""
+msgstr "%s er ikke en gyldig farge."
 
 #: lib/webcolor.php:123
 #, php-format
 msgid "%s is not a valid color! Use 3 or 6 hex chars."
-msgstr ""
+msgstr "%s er ikke en gyldig farge. Bruk 3 eller 6 heksadesimale tegn."
 
 #: lib/xmppmanager.php:402
 #, php-format
 msgid "Message too long - maximum is %1$d characters, you sent %2$d."
-msgstr ""
+msgstr "Melding for lang - maks er %1$d tegn, du sendte %2$d."
index a9e7579564ebc2380295d84f4fa1967b0524fee5..c73771f84a8eee2d8099217a98a90825867f6eae 100644 (file)
@@ -10,19 +10,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:32+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:33+0000\n"
 "Language-Team: Dutch\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: nl\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Toegang"
 
@@ -43,10 +44,9 @@ msgstr "Mogen anonieme gebruikers (niet aangemeld) de website bekijken?"
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
-msgstr "Privé"
+msgstr "Geen anonieme toegang"
 
 #. TRANS: Checkbox instructions for admin setting "Invite only"
 #: actions/accessadminpanel.php:174
@@ -74,7 +74,6 @@ msgid "Save access settings"
 msgstr "Toegangsinstellingen opslaan"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Opslaan"
@@ -103,7 +102,7 @@ msgstr "Deze pagina bestaat niet"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -119,7 +118,7 @@ msgstr "%1$s en vrienden, pagina %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -183,7 +182,7 @@ msgstr ""
 "een bericht sturen."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "U en vrienden"
 
@@ -210,11 +209,11 @@ msgstr "Updates van %1$s en vrienden op %2$s."
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "De API-functie is niet aangetroffen."
 
@@ -589,7 +588,7 @@ msgstr ""
 "van het type \"<strong>%3$s</strong> tot uw gebruikersgegevens. Geef alleen "
 "toegang tot uw gebruiker bij %4$s aan derde partijen die u vertrouwt."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Gebruiker"
 
@@ -678,18 +677,6 @@ msgstr "%1$s / Favorieten van %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s updates op de favorietenlijst geplaatst door %2$s / %3$s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s tijdlijn"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Updates van %1$s op %2$s."
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -700,12 +687,12 @@ msgstr "%1$s / Updates over %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s updates die een reactie zijn op updates van %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s publieke tijdlijn"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s updates van iedereen"
@@ -725,7 +712,7 @@ msgstr "Herhaald van %s"
 msgid "Notices tagged with %s"
 msgstr "Mededelingen met het label %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Updates met het label %1$s op %2$s!"
@@ -766,7 +753,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Gebruiker zonder bijbehorend profiel"
 
@@ -953,7 +940,7 @@ msgid "Conversation"
 msgstr "Dialoog"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Mededelingen"
 
@@ -972,7 +959,7 @@ msgstr "U bent niet de eigenaar van deze applicatie."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Er is een probleem met uw sessietoken."
 
@@ -1169,8 +1156,9 @@ msgstr "Standaardinstellingen toepassen"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1286,7 +1274,7 @@ msgstr "de beschrijving is te lang (maximaal %d tekens)"
 msgid "Could not update group."
 msgstr "Het was niet mogelijk de groep bij te werken."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Het was niet mogelijk de aliassen aan te maken."
 
@@ -1410,7 +1398,7 @@ msgid "Cannot normalize that email address"
 msgstr "Kan het emailadres niet normaliseren"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Geen geldig e-mailadres."
 
@@ -1608,6 +1596,22 @@ msgstr "Het bestand bestaat niet."
 msgid "Cannot read file."
 msgstr "Het bestand kon niet gelezen worden."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Ongeldige rol."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Deze rol is gereserveerd en kan niet ingesteld worden."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Op deze website kunt u geen gebruikersrollen toekennen."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Deze gebruiker heeft deze rol al."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1757,12 +1761,18 @@ msgstr "Beheerder maken"
 msgid "Make this user an admin"
 msgstr "Deze gebruiker beheerder maken"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s tijdlijn"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Updates voor leden van %1$s op %2$s."
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Groepen"
@@ -2027,7 +2037,6 @@ msgstr "Persoonlijk bericht bij de uitnodiging (optioneel)."
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Verzenden"
@@ -2392,8 +2401,8 @@ msgstr "inhoudstype "
 msgid "Only "
 msgstr "Alleen "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Geen ondersteund gegevensformaat."
 
@@ -2532,7 +2541,8 @@ msgstr "Het was niet mogelijk het nieuwe wachtwoord op te slaan."
 msgid "Password saved."
 msgstr "Het wachtwoord is opgeslagen."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Paden"
 
@@ -2652,7 +2662,7 @@ msgstr "Achtergrondenmap"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nooit"
 
@@ -2708,11 +2718,11 @@ msgstr "Geen geldig gebruikerslabel: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Gebruikers die zichzelf met %1$s hebben gelabeld - pagina %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Ongeldige mededelinginhoud"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2794,7 +2804,7 @@ msgstr ""
 "Eigen labels (letter, getallen, -, ., en _). Gescheiden door komma's of "
 "spaties"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Taal"
 
@@ -2822,7 +2832,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "De beschrijving is te lang (maximaal %d tekens)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Er is geen tijdzone geselecteerd."
 
@@ -3147,7 +3157,7 @@ msgid "Same as password above. Required."
 msgstr "Gelijk aan het wachtwoord hierboven. Verplicht"
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mail"
 
@@ -3254,7 +3264,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "De URL van uw profiel bij een andere, compatibele microblogdienst"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Abonneren"
 
@@ -3358,6 +3368,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Antwoorden aan %1$s op %2$s."
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "U kunt geen gebruikersrollen intrekken op deze website."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Deze gebruiker heeft deze rol niet."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3370,7 +3388,9 @@ msgstr "Op deze website kunt u gebruikers niet in de zandbak plaatsen."
 msgid "User is already sandboxed."
 msgstr "Deze gebruiker is al in de zandbak geplaatst."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessies"
 
@@ -3394,7 +3414,7 @@ msgstr "Sessies debuggen"
 msgid "Turn on debugging output for sessions."
 msgstr "Debuguitvoer voor sessies inschakelen."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Websiteinstellingen opslaan"
@@ -3425,8 +3445,8 @@ msgstr "Organisatie"
 msgid "Description"
 msgstr "Beschrijving"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistieken"
 
@@ -3570,45 +3590,45 @@ msgstr "Aliassen"
 msgid "Group actions"
 msgstr "Groepshandelingen"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Mededelingenfeed voor groep %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Mededelingenfeed voor groep %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Mededelingenfeed voor groep %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Vriend van een vriend voor de groep %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Leden"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(geen)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Alle leden"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Aangemaakt"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3624,7 +3644,7 @@ msgstr ""
 "lid te worden van deze groep en nog veel meer! [Meer lezen...](%%%%doc.help%%"
 "%%)"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3637,7 +3657,7 @@ msgstr ""
 "[StatusNet](http://status.net/). De leden wisselen korte mededelingen uit "
 "over hun ervaringen en interesses. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Beheerders"
 
@@ -3760,154 +3780,141 @@ msgid "User is already silenced."
 msgstr "Deze gebruiker is al gemuilkorfd."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Basisinstellingen voor deze StatusNet-website."
+msgid "Basic settings for this StatusNet site"
+msgstr "Basisinstellingen voor deze StatusNet-website"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "De sitenaam moet ingevoerd worden en mag niet leeg zijn."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr ""
 "U moet een geldig e-mailadres opgeven waarop contact opgenomen kan worden."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "De taal \"%s\" is niet bekend."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "De rapportage-URL voor snapshots is ongeldig."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "De waarde voor het uitvoeren van snapshots is ongeldig."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "De snapshotfrequentie moet een getal zijn."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "De minimale tekstlimiet is 140 tekens."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "De duplicaatlimiet moet één of meer seconden zijn."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Algemeen"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Websitenaam"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "De naam van de website, zoals \"UwBedrijf Microblog\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Mogelijk gemaakt door"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 "De tekst die gebruikt worden in de \"creditsverwijzing\" in de voettekst van "
 "iedere pagina"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "\"Mogelijk gemaakt door\"-URL"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 "URL die wordt gebruikt voor de verwijzing naar de hoster en dergelijke in de "
 "voettekst van iedere pagina"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "E-mailadres om contact op te nemen met de websitebeheerder"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Lokaal"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Standaardtijdzone"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Standaardtijdzone voor de website. Meestal UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr "Standaardtaal"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Snapshots"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Willekeurig tijdens een websitehit"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Als geplande taak"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Snapshots van gegevens"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
-"Wanneer statistische gegevens naar de status.net-servers verzonden worden"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequentie"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Iedere zoveel websitehits wordt een snapshot verzonden"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "Rapportage-URL"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Snapshots worden naar deze URL verzonden"
+"De taal voor de website als deze niet uit de browserinstellingen opgemaakt "
+"kan worden"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limieten"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Tekstlimiet"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Maximaal aantal te gebruiken tekens voor mededelingen."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Duplicaatlimiet"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Hoe lang gebruikers moeten wachten (in seconden) voor ze hetzelfde kunnen "
 "zenden."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Websitebrede mededeling"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Websitebrede mededeling bewerken"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Het was niet mogelijk om de websitebrede mededeling op te slaan."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "De maximale lengte voor de websitebrede aankondiging is 255 tekens"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Tekst voor websitebrede mededeling"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+"Tekst voor websitebrede aankondiging (maximaal 255 tekens - HTML is "
+"toegestaan)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Websitebrede mededeling opslaan"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "SMS-instellingen"
@@ -4007,6 +4014,65 @@ msgstr ""
 msgid "No code entered"
 msgstr "Er is geen code ingevoerd"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Snapshots"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Snapshotinstellingen beheren"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "De waarde voor het uitvoeren van snapshots is ongeldig."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "De snapshotfrequentie moet een getal zijn."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "De rapportage-URL voor snapshots is ongeldig."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Willekeurig tijdens een websitehit"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Als geplande taak"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Snapshots van gegevens"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+"Wanneer statistische gegevens naar de status.net-servers verzonden worden"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequentie"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Iedere zoveel websitehits wordt een snapshot verzonden"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "Rapportage-URL"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Snapshots worden naar deze URL verzonden"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Snapshotinstellingen opslaan"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "U bent niet geabonneerd op dat profiel."
@@ -4218,7 +4284,7 @@ msgstr "Het profiel-ID was niet aanwezig in het verzoek."
 msgid "Unsubscribed"
 msgstr "Het abonnement is opgezegd"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4228,7 +4294,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Gebruiker"
@@ -4423,17 +4488,23 @@ msgstr "Groepen voor %1$s, pagina %2$d"
 msgid "Search for more groups"
 msgstr "Meer groepen zoeken"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s is van geen enkele groep lid."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "U kunt [naar groepen zoeken](%%action.groupsearch%%) en daar lid van worden."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Updates van %1$s op %2$s."
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4489,7 +4560,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plug-ins"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Versie"
 
@@ -4556,26 +4627,26 @@ msgstr "Het was niet mogelijk het bericht bij te werken met de nieuwe URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Er is een databasefout opgetreden bij de invoer van de hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 "Er is een probleem opgetreden bij het opslaan van de mededeling. Deze is te "
 "lang."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 "Er was een probleem bij het opslaan van de mededeling. De gebruiker is "
 "onbekend."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "U hebt te snel te veel mededelingen verstuurd. Kom even op adem en probeer "
 "het over enige tijd weer."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4583,22 +4654,22 @@ msgstr ""
 "Te veel duplicaatberichten te snel achter elkaar. Neem een adempauze en "
 "plaats over een aantal minuten pas weer een bericht."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 "U bent geblokkeerd en mag geen mededelingen meer achterlaten op deze site."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr ""
 "Er is een probleem opgetreden bij het opslaan van het Postvak IN van de "
 "groep."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4623,7 +4694,12 @@ msgstr "Niet geabonneerd!"
 msgid "Couldn't delete self-subscription."
 msgstr "Het was niet mogelijk het abonnement op uzelf te verwijderen."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr ""
+"Het was niet mogelijk om het OMB-token voor het abonnement te verwijderen."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Kon abonnement niet verwijderen."
 
@@ -4632,19 +4708,19 @@ msgstr "Kon abonnement niet verwijderen."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Welkom bij %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Het was niet mogelijk de groep aan te maken."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Het was niet mogelijk de groeps-URI in te stellen."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Het was niet mogelijk het groepslidmaatschap in te stellen."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Het was niet mogelijk de lokale groepsinformatie op te slaan."
 
@@ -4685,194 +4761,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Naamloze pagina"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Primaire sitenavigatie"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persoonlijk profiel en tijdlijn van vrienden"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Persoonlijk"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Uw e-mailadres, avatar, wachtwoord of profiel wijzigen"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Gebruiker"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr "Met diensten verbinden"
+msgstr "Met andere diensten koppelen"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Koppelen"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Websiteinstellingen wijzigen"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
-msgstr "Beheerder"
+msgstr "Beheer"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Vrienden en collega's uitnodigen om u te vergezellen op %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
-msgstr "Uitnodigen"
+msgstr "Uitnodigingen"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
-msgstr "Van de site afmelden"
+msgstr "Gebruiker afmelden"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Afmelden"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Gebruiker aanmaken"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registreren"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
-msgstr "Bij de site aanmelden"
+msgstr "Gebruiker aanmelden"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Aanmelden"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Help me!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Help"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Naar gebruikers of tekst zoeken"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Zoeken"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Mededeling van de website"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Lokale weergaven"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Mededeling van de pagina"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Secundaire sitenavigatie"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Help"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Over"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Veel gestelde vragen"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Gebruiksvoorwaarden"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Broncode"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Widget"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licentie van de StatusNet-software"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4881,12 +4933,12 @@ msgstr ""
 "**%%site.name%%** is een microblogdienst van [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** is een microblogdienst. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4897,57 +4949,57 @@ msgstr ""
 "versie %s, beschikbaar onder de [GNU Affero General Public License](http://"
 "www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licentie voor siteinhoud"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Inhoud en gegevens van %1$s zijn persoonlijk en vertrouwelijk."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Auteursrechten op inhoud en gegevens rusten bij %1$s. Alle rechten "
 "voorbehouden."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Auteursrechten op inhoud en gegevens rusten bij de respectievelijke "
 "gebruikers. Alle rechten voorbehouden."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licentie."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Later"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Eerder"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Het is nog niet mogelijk inhoud uit andere omgevingen te verwerken."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Het is nog niet mogelijk ingebedde XML-inhoud te verwerken"
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Het is nog niet mogelijk ingebedde Base64-inhoud te verwerken"
 
@@ -4962,91 +5014,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Wijzigingen aan dat venster zijn niet toegestaan."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() is niet geïmplementeerd."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() is nog niet geïmplementeerd."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Het was niet mogelijk om de ontwerpinstellingen te verwijderen."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Basisinstellingen voor de website"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Website"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Instellingen vormgeving"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Uiterlijk"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Gebruikersinstellingen"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Gebruiker"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Toegangsinstellingen"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Toegang"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Padinstellingen"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Paden"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Sessieinstellingen"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessies"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Websitebrede mededeling opslaan"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Snapshotinstellingen"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5237,12 +5274,12 @@ msgstr "%s heeft de groep %s verlaten"
 msgid "Fullname: %s"
 msgstr "Volledige naam: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Locatie: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Thuispagina: %s"
@@ -5584,6 +5621,11 @@ msgstr "Kies een label om de lijst kleiner te maken"
 msgid "Go"
 msgstr "OK"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Deze gebruiker de rol \"%s\" geven"
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "De URL van de thuispagina of de blog van de groep of het onderwerp"
@@ -5721,11 +5763,11 @@ msgstr "Aanmelden met gebruikersnaam en wachtwoord"
 msgid "Sign up for a new account"
 msgstr "Nieuwe gebruiker aanmaken"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "E-mailadresbevestiging"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5755,12 +5797,12 @@ msgstr ""
 "Dank u wel voor uw tijd.\n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s volgt nu uw berichten %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5785,17 +5827,17 @@ msgstr ""
 "----\n"
 "Wijzig uw e-mailadres of instellingen op %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Beschrijving: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nieuw e-mailadres om e-mail te versturen aan %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5816,21 +5858,21 @@ msgstr ""
 "Met vriendelijke groet,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS-bevestiging"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s heeft u gepord"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5858,12 +5900,12 @@ msgstr ""
 "Met vriendelijke groet,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "U hebt een nieuw privébericht van %s."
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5897,12 +5939,12 @@ msgstr ""
 "Met vriendelijke groet,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) heeft uw mededeling als favoriet toegevoegd"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5940,12 +5982,12 @@ msgstr ""
 "Met vriendelijke groet,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) heeft u een mededeling gestuurd"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6205,10 +6247,6 @@ msgstr "Antwoorden"
 msgid "Favorites"
 msgstr "Favorieten"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Gebruiker"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Postvak IN"
@@ -6234,7 +6272,7 @@ msgstr "Labels in de mededelingen van %s"
 msgid "Unknown"
 msgstr "Onbekend"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abonnementen"
 
@@ -6242,23 +6280,23 @@ msgstr "Abonnementen"
 msgid "All subscriptions"
 msgstr "Alle abonnementen"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abonnees"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Alle abonnees"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Gebruikers-ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Lid sinds"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Alle groepen"
 
@@ -6298,7 +6336,12 @@ msgstr "Deze mededeling herhalen?"
 msgid "Repeat this notice"
 msgstr "Deze mededeling herhalen"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "De gebruikersrol \"%s\" voor deze gebruiker intrekken"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Er is geen gebruiker gedefinieerd voor single-usermodus."
 
@@ -6452,47 +6495,61 @@ msgstr "Bericht"
 msgid "Moderate"
 msgstr "Modereren"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Gebruikersrol"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Beheerder"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "een paar seconden geleden"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "ongeveer een minuut geleden"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "ongeveer %d minuten geleden"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "ongeveer een uur geleden"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "ongeveer %d uur geleden"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "ongeveer een dag geleden"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "ongeveer %d dagen geleden"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "ongeveer een maand geleden"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "ongeveer %d maanden geleden"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "ongeveer een jaar geleden"
 
index ddd183e8704eb10c11c8514992e29f26a8c62513..a16e1564960494f4a6b19bf7ce039c4f3ac9d8e8 100644 (file)
@@ -7,19 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:22+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:30+0000\n"
 "Language-Team: Norwegian Nynorsk\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: nn\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Godta"
@@ -107,7 +108,7 @@ msgstr "Dette emneord finst ikkje."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +124,7 @@ msgstr "%s med vener, side %d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -178,7 +179,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s med vener"
@@ -206,11 +207,11 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Fann ikkje API-metode."
@@ -581,7 +582,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -673,18 +674,6 @@ msgstr "%s / Favorittar frå %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s oppdateringar favorisert av %s / %s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s tidsline"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Oppdateringar frå %1$s på %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -695,12 +684,12 @@ msgstr "%1$s / Oppdateringar som svarar til %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s oppdateringar som svarar på oppdateringar frå %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s offentleg tidsline"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s oppdateringar frå alle saman!"
@@ -720,7 +709,7 @@ msgstr "Svar til %s"
 msgid "Notices tagged with %s"
 msgstr "Notisar merka med %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Oppdateringar frå %1$s på %2$s!"
@@ -761,7 +750,7 @@ msgstr "Du kan laste opp ein personleg avatar."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Kan ikkje finne brukar"
 
@@ -952,7 +941,7 @@ msgid "Conversation"
 msgstr "Stadfestingskode"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notisar"
 
@@ -974,7 +963,7 @@ msgstr "Du er ikkje medlem av den gruppa."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Det var eit problem med sesjons billetten din."
 
@@ -1182,8 +1171,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1311,7 +1301,7 @@ msgstr "skildringa er for lang (maks 140 teikn)."
 msgid "Could not update group."
 msgstr "Kann ikkje oppdatera gruppa."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Kunne ikkje lagre favoritt."
@@ -1438,7 +1428,7 @@ msgid "Cannot normalize that email address"
 msgstr "Klarar ikkje normalisera epostadressa"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Ikkje ei gyldig epostadresse."
 
@@ -1634,6 +1624,25 @@ msgstr "Denne notisen finst ikkje."
 msgid "Cannot read file."
 msgstr "Mista fila vår."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Ugyldig storleik."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Du kan ikkje sende melding til denne brukaren."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Brukar har blokkert deg."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1789,12 +1798,18 @@ msgstr "Administrator"
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s tidsline"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Oppdateringar frå %1$s på %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupper"
@@ -2408,8 +2423,8 @@ msgstr "Kopla til"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Ikkje eit støtta dataformat."
 
@@ -2555,7 +2570,8 @@ msgstr "Klarar ikkje lagra nytt passord."
 msgid "Password saved."
 msgstr "Lagra passord."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2683,7 +2699,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Gjenopprett"
@@ -2742,11 +2758,11 @@ msgstr "Ikkje gyldig merkelapp: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Brukarar sjølv-merka med %s, side %d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Ugyldig notisinnhald"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2828,7 +2844,7 @@ msgstr ""
 "merkelappar for deg sjølv ( bokstavar, nummer, -, ., og _ ), komma eller "
 "mellomroms separert."
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Språk"
 
@@ -2855,7 +2871,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "«Om meg» er for lang (maks 140 "
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Tidssone er ikkje valt."
 
@@ -3164,7 +3180,7 @@ msgid "Same as password above. Required."
 msgstr "Samme som passord over. Påkrevd."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Epost"
 
@@ -3272,7 +3288,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL til profilsida di på ei anna kompatibel mikrobloggingteneste."
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Ting"
 
@@ -3377,6 +3393,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Melding til %1$s på %2$s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Du kan ikkje sende melding til denne brukaren."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Kan ikkje finne brukar"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3392,7 +3418,9 @@ msgstr "Du kan ikkje sende melding til denne brukaren."
 msgid "User is already sandboxed."
 msgstr "Brukar har blokkert deg."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3416,7 +3444,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3452,8 +3480,8 @@ msgstr "Paginering"
 msgid "Description"
 msgstr "Beskriving"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistikk"
 
@@ -3586,46 +3614,46 @@ msgstr ""
 msgid "Group actions"
 msgstr "Gruppe handlingar"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Utboks for %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Medlemmar"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ingen)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Alle medlemmar"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Lag"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3635,7 +3663,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3646,7 +3674,7 @@ msgstr ""
 "**%s** er ei brukargruppe på %%%%site.name%%%%, ei [mikroblogging](http://en."
 "wikipedia.org/wiki/Micro-blogging)-teneste"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 #, fuzzy
 msgid "Admins"
 msgstr "Administrator"
@@ -3762,150 +3790,139 @@ msgid "User is already silenced."
 msgstr "Brukar har blokkert deg."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Ikkje ei gyldig epostadresse"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Statusmelding"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Ny epostadresse for å oppdatera %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Lokale syningar"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "Foretrukke språk"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Statusmelding"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Ny melding"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Klarte ikkje å lagra Twitter-innstillingane dine!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Statusmelding"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Statusmelding"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -4009,6 +4026,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Ingen innskriven kode"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Navigasjon for hovudsida"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Avatar-innstillingar"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Du tingar ikkje oppdateringar til den profilen."
@@ -4214,7 +4291,7 @@ msgstr "Ingen profil-ID i førespurnaden."
 msgid "Unsubscribed"
 msgstr "Fjerna tinging"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4425,16 +4502,22 @@ msgstr "%s medlemmar i gruppa, side %d"
 msgid "Search for more groups"
 msgstr "Søk etter folk eller innhald"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Du er ikkje medlem av den gruppa."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Oppdateringar frå %1$s på %2$s!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4478,7 +4561,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Personleg"
@@ -4547,22 +4630,22 @@ msgstr "Kunne ikkje oppdatere melding med ny URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "databasefeil ved innsetjing av skigardmerkelapp (#merkelapp): %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Feil ved lagring av notis.  Ukjend brukar."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4570,20 +4653,20 @@ msgid ""
 msgstr ""
 "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Du kan ikkje lengre legge inn notisar på denne sida."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4611,7 +4694,12 @@ msgstr "Ikkje tinga."
 msgid "Couldn't delete self-subscription."
 msgstr "Kan ikkje sletta tinging."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Kan ikkje sletta tinging."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Kan ikkje sletta tinging."
 
@@ -4620,20 +4708,20 @@ msgstr "Kan ikkje sletta tinging."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Melding til %1$s på %2$s"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Kunne ikkje laga gruppa."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Kunne ikkje bli med i gruppa."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Kunne ikkje bli med i gruppa."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Kunne ikkje lagra abonnement."
@@ -4676,195 +4764,188 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "Ingen tittel"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navigasjon for hovudsida"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personleg profil og oversyn over vener"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personleg"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Endra e-posten, avataren, passordet eller profilen"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Klarte ikkje å omdirigera til tenaren: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Kopla til"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Navigasjon for hovudsida"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Inviter vennar og kollega til å bli med deg på %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Invitér"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logg ut or sida"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Logg ut"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Opprett ny konto"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrér"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Logg inn or sida"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Logg inn"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjelp meg!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hjelp"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Søk etter folk eller innhald"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Søk"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Statusmelding"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Lokale syningar"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Sidenotis"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Andrenivås side navigasjon"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hjelp"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "OSS"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Personvern"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Kjeldekode"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 #, fuzzy
 msgid "Badge"
 msgstr "Dult"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNets programvarelisens"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4873,12 +4954,12 @@ msgstr ""
 "**%%site.name%%** er ei mikrobloggingteneste av [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er ei mikrobloggingteneste. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4889,54 +4970,54 @@ msgstr ""
 "%s, tilgjengeleg under [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNets programvarelisens"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Alle"
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "lisens."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "« Etter"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Før »"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4953,99 +5034,89 @@ msgid "Changes to that panel are not allowed."
 msgstr "Registrering ikkje tillatt."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Kommando ikkje implementert."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Kommando ikkje implementert."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Klarte ikkje å lagra Twitter-innstillingane dine!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Stadfesting av epostadresse"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Invitér"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS bekreftelse"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Personleg"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS bekreftelse"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Brukar"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS bekreftelse"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Godta"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS bekreftelse"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS bekreftelse"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Personleg"
+msgid "Edit site notice"
+msgstr "Statusmelding"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS bekreftelse"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5238,12 +5309,12 @@ msgstr "%s forlot %s gruppa"
 msgid "Fullname: %s"
 msgstr "Fullt namn: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Stad: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Heimeside: %s"
@@ -5548,6 +5619,11 @@ msgstr "Velg ein merkelapp for å begrense lista"
 msgid "Go"
 msgstr "Gå"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL til heimesida eller bloggen for gruppa eller emnet"
@@ -5685,11 +5761,11 @@ msgstr "Log inn med brukarnamn og passord."
 msgid "Sign up for a new account"
 msgstr "Opprett ny konto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Stadfesting av epostadresse"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5706,12 +5782,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s høyrer no på notisane dine på %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5732,19 +5808,19 @@ msgstr ""
 "Beste helsing,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "Bio: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Ny epostadresse for å oppdatera %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5764,21 +5840,21 @@ msgstr ""
 "\n"
 "Helsing frå %4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS bekreftelse"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Du har blitt dulta av %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5794,12 +5870,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Ny privat melding fra %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5818,12 +5894,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s la til di melding som ein favoritt"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5844,12 +5920,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6098,10 +6174,6 @@ msgstr "Svar"
 msgid "Favorites"
 msgstr "Favorittar"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Brukar"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Innboks"
@@ -6128,7 +6200,7 @@ msgstr "Merkelappar i %s sine notisar"
 msgid "Unknown"
 msgstr "Uventa handling."
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Tingingar"
 
@@ -6136,24 +6208,24 @@ msgstr "Tingingar"
 msgid "All subscriptions"
 msgstr "Alle tingingar"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Tingarar"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Tingarar"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "Brukar"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Medlem sidan"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Alle gruppar"
 
@@ -6196,7 +6268,12 @@ msgstr "Svar på denne notisen"
 msgid "Repeat this notice"
 msgstr "Svar på denne notisen"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Ei liste over brukarane i denne gruppa."
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6360,47 +6437,63 @@ msgstr "Melding"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Brukarprofil"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "eit par sekund sidan"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "omtrent eitt minutt sidan"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "~%d minutt sidan"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "omtrent ein time sidan"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "~%d timar sidan"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "omtrent ein dag sidan"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "~%d dagar sidan"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "omtrent ein månad sidan"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "~%d månadar sidan"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "omtrent eitt år sidan"
 
index a8cef8d36c36438b7dafa2cac9f28cf596b47781..3a0bd39c32a8cf77fbf27a9f44e0733ba3311f1f 100644 (file)
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:35+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:36+0000\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -19,13 +19,14 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: pl\n"
 "X-Message-Group: out-statusnet\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Dostęp"
 
@@ -46,7 +47,6 @@ msgstr "Zabronić anonimowym użytkownikom (niezalogowanym) przeglądać witryn
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Prywatna"
@@ -77,7 +77,6 @@ msgid "Save access settings"
 msgstr "Zapisz ustawienia dostępu"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Zapisz"
@@ -106,7 +105,7 @@ msgstr "Nie ma takiej strony"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -122,7 +121,7 @@ msgstr "%1$s i przyjaciele, strona %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -186,7 +185,7 @@ msgstr ""
 "szturchniesz użytkownika %s lub wyślesz wpis wymagającego jego uwagi."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Ty i przyjaciele"
 
@@ -213,11 +212,11 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s."
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Nie odnaleziono metody API."
 
@@ -579,7 +578,7 @@ msgstr ""
 "uzyskać możliwość <strong>%3$s</strong> danych konta %4$s. Dostęp do konta %4"
 "$s powinien być udostępniany tylko zaufanym osobom trzecim."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -666,18 +665,6 @@ msgstr "%1$s/ulubione wpisy od %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "Użytkownik %1$s aktualizuje ulubione według %2$s/%2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Oś czasu użytkownika %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Aktualizacje z %1$s na %2$s."
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -688,12 +675,12 @@ msgstr "%1$s/aktualizacje wspominające %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s aktualizuje tę odpowiedź na aktualizacje od %2$s/%3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Publiczna oś czasu użytkownika %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Użytkownik %s aktualizuje od każdego."
@@ -713,7 +700,7 @@ msgstr "Powtórzenia %s"
 msgid "Notices tagged with %s"
 msgstr "Wpisy ze znacznikiem %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Aktualizacje ze znacznikiem %1$s na %2$s."
@@ -753,7 +740,7 @@ msgstr "Można wysłać osobisty awatar. Maksymalny rozmiar pliku to %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Użytkownik bez odpowiadającego profilu"
 
@@ -939,7 +926,7 @@ msgid "Conversation"
 msgstr "Rozmowa"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Wpisy"
 
@@ -958,7 +945,7 @@ msgstr "Nie jesteś właścicielem tej aplikacji."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Wystąpił problem z tokenem sesji."
 
@@ -1151,8 +1138,9 @@ msgstr "Przywróć domyślne ustawienia"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1268,7 +1256,7 @@ msgstr "opis jest za długi (maksymalnie %d znaków)."
 msgid "Could not update group."
 msgstr "Nie można zaktualizować grupy."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Nie można utworzyć aliasów."
 
@@ -1391,7 +1379,7 @@ msgid "Cannot normalize that email address"
 msgstr "Nie można znormalizować tego adresu e-mail"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "To nie jest prawidłowy adres e-mail."
 
@@ -1584,6 +1572,22 @@ msgstr "Nie ma takiego pliku."
 msgid "Cannot read file."
 msgstr "Nie można odczytać pliku."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Nieprawidłowa rola."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Ta rola jest zastrzeżona i nie może zostać ustawiona."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Nie można udzielić rol użytkownikom na tej witrynie."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Użytkownik ma już tę rolę."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1727,12 +1731,18 @@ msgstr "Uczyń administratorem"
 msgid "Make this user an admin"
 msgstr "Uczyń tego użytkownika administratorem"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Oś czasu użytkownika %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Aktualizacje od członków %1$s na %2$s."
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupy"
@@ -1993,7 +2003,6 @@ msgstr "Opcjonalnie dodaj osobistą wiadomość do zaproszenia."
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Wyślij"
@@ -2352,8 +2361,8 @@ msgstr "typ zawartości "
 msgid "Only "
 msgstr "Tylko "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "To nie jest obsługiwany format danych."
 
@@ -2492,7 +2501,8 @@ msgstr "Nie można zapisać nowego hasła."
 msgid "Password saved."
 msgstr "Zapisano hasło."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Ścieżki"
 
@@ -2614,7 +2624,7 @@ msgstr "Katalog tła"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nigdy"
 
@@ -2670,11 +2680,11 @@ msgstr "Nieprawidłowy znacznik osób: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Użytkownicy używający znacznika %1$s - strona %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Nieprawidłowa zawartość wpisu"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Licencja wpisu \"%1$s\" nie jest zgodna z licencją witryny \"%2$s\"."
@@ -2754,7 +2764,7 @@ msgstr ""
 "Znaczniki dla siebie (litery, liczby, -, . i _), oddzielone przecinkami lub "
 "spacjami"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Język"
 
@@ -2781,7 +2791,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Wpis \"O mnie\" jest za długi (maksymalnie %d znaków)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Nie wybrano strefy czasowej."
 
@@ -3100,7 +3110,7 @@ msgid "Same as password above. Required."
 msgstr "Takie samo jak powyższe hasło. Wymagane."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mail"
 
@@ -3206,7 +3216,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Adres URL profilu na innej, zgodnej usłudze mikroblogowania"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subskrybuj"
 
@@ -3310,6 +3320,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "odpowiedzi dla użytkownika %1$s na %2$s."
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Nie można unieważnić rol użytkowników na tej witrynie."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Użytkownik nie ma tej roli."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3322,7 +3340,9 @@ msgstr "Nie można ograniczać użytkowników na tej witrynie."
 msgid "User is already sandboxed."
 msgstr "Użytkownik jest już ograniczony."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sesje"
 
@@ -3346,7 +3366,7 @@ msgstr "Debugowanie sesji"
 msgid "Turn on debugging output for sessions."
 msgstr "Włącza wyjście debugowania dla sesji."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Zapisz ustawienia witryny"
@@ -3377,8 +3397,8 @@ msgstr "Organizacja"
 msgid "Description"
 msgstr "Opis"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statystyki"
 
@@ -3520,45 +3540,45 @@ msgstr "Aliasy"
 msgid "Group actions"
 msgstr "Działania grupy"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Kanał wpisów dla grupy %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Kanał wpisów dla grupy %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Kanał wpisów dla grupy %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF dla grupy %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Członkowie"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Brak)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Wszyscy członkowie"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Utworzono"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3574,7 +3594,7 @@ msgstr ""
 "action.register%%%%), aby stać się częścią tej grupy i wiele więcej. "
 "([Przeczytaj więcej](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3587,7 +3607,7 @@ msgstr ""
 "narzędziu [StatusNet](http://status.net/). Jej członkowie dzielą się "
 "krótkimi wiadomościami o swoim życiu i zainteresowaniach. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administratorzy"
 
@@ -3710,148 +3730,135 @@ msgid "User is already silenced."
 msgstr "Użytkownik jest już wyciszony."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Podstawowe ustawienia tej witryny StatusNet."
+msgid "Basic settings for this StatusNet site"
+msgstr "Podstawowe ustawienia tej witryny StatusNet"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Nazwa witryny nie może mieć zerową długość."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Należy posiadać prawidłowy kontaktowy adres e-mail."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Nieznany język \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Nieprawidłowy adres URL zgłaszania migawek."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Nieprawidłowa wartość wykonania migawki."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Częstotliwość migawek musi być liczbą."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Maksymalne ograniczenie tekstu to 14 znaków."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Ograniczenie duplikatów musi wynosić jedną lub więcej sekund."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Ogólne"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nazwa witryny"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Nazwa strony, taka jak \"Mikroblog firmy X\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Dostarczane przez"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Tekst używany do odnośnika do zasług w stopce każdej strony"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "Adres URL \"Dostarczane przez\""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "Adres URL używany do odnośnika do zasług w stopce każdej strony"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Kontaktowy adres e-mail witryny"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Lokalne"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Domyślna strefa czasowa"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Domyśla strefa czasowa witryny, zwykle UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr "Domyślny język witryny"
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Migawki"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Losowo podczas trafienia WWW"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Jako zaplanowane zadanie"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Migawki danych"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Kiedy wysyłać dane statystyczne na serwery status.net"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
+msgstr "Domyślny język"
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Częstotliwość"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Migawki będą wysyłane co N trafień WWW"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "Adres URL zgłaszania"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Migawki będą wysyłane na ten adres URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+"Język witryny, kiedy automatyczne wykrywanie z ustawień przeglądarki nie "
+"jest dostępne"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Ograniczenia"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Ograniczenie tekstu"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Maksymalna liczba znaków wpisów."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Ograniczenie duplikatów"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Ile czasu użytkownicy muszą czekać (w sekundach), aby ponownie wysłać to "
 "samo."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Wpis witryny"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Zmodyfikuj wiadomość witryny"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Nie można zapisać wpisu witryny."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "Maksymalna długość wpisu witryny to 255 znaków"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Tekst wpisu witryny"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+"Tekst wpisu witryny (maksymalnie 255 znaków, można używać znaczników HTML)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Zapisz wpis witryny"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Ustawienia SMS"
@@ -3951,6 +3958,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Nie podano kodu"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Migawki"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Zarządzaj konfiguracją migawki"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Nieprawidłowa wartość wykonania migawki."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Częstotliwość migawek musi być liczbą."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Nieprawidłowy adres URL zgłaszania migawek."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Losowo podczas trafienia WWW"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Jako zaplanowane zadanie"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Migawki danych"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Kiedy wysyłać dane statystyczne na serwery status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Częstotliwość"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Migawki będą wysyłane co N trafień WWW"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "Adres URL zgłaszania"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Migawki będą wysyłane na ten adres URL"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Zapisz ustawienia migawki"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Nie jesteś subskrybowany do tego profilu."
@@ -4161,7 +4226,7 @@ msgstr "Brak identyfikatora profilu w żądaniu."
 msgid "Unsubscribed"
 msgstr "Zrezygnowano z subskrypcji"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4171,7 +4236,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Użytkownik"
@@ -4362,16 +4426,22 @@ msgstr "Grupy użytkownika %1$s, strona %2$d"
 msgid "Search for more groups"
 msgstr "Wyszukaj więcej grup"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "Użytkownik %s nie jest członkiem żadnej grupy."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr "Spróbuj [wyszukać grupy](%%action.groupsearch%%) i dołączyć do nich."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Aktualizacje z %1$s na %2$s."
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4429,7 +4499,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Wtyczki"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Wersja"
 
@@ -4497,22 +4567,22 @@ msgstr "Nie można zaktualizować wiadomości za pomocą nowego adresu URL."
 msgid "DB error inserting hashtag: %s"
 msgstr "Błąd bazy danych podczas wprowadzania znacznika mieszania: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problem podczas zapisywania wpisu. Za długi."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem podczas zapisywania wpisu. Nieznany użytkownik."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Za dużo wpisów w za krótkim czasie, weź głęboki oddech i wyślij ponownie za "
 "kilka minut."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4520,19 +4590,19 @@ msgstr ""
 "Za dużo takich samych wiadomości w za krótkim czasie, weź głęboki oddech i "
 "wyślij ponownie za kilka minut."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Zabroniono ci wysyłania wpisów na tej witrynie."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problem podczas zapisywania wpisu."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4557,7 +4627,11 @@ msgstr "Niesubskrybowane."
 msgid "Couldn't delete self-subscription."
 msgstr "Nie można usunąć autosubskrypcji."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Nie można usunąć tokenu subskrypcji OMB."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Nie można usunąć subskrypcji."
 
@@ -4566,19 +4640,19 @@ msgstr "Nie można usunąć subskrypcji."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Witaj w %1$s, @%2$s."
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Nie można utworzyć grupy."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Nie można ustawić adresu URI grupy."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Nie można ustawić członkostwa w grupie."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Nie można zapisać informacji o lokalnej grupie."
 
@@ -4619,194 +4693,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Strona bez nazwy"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Główna nawigacja witryny"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profil osobisty i oś czasu przyjaciół"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Osobiste"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Zmień adres e-mail, awatar, hasło, profil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Połącz z serwisami"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Połącz"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Zmień konfigurację witryny"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administrator"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Zaproś przyjaciół i kolegów do dołączenia do ciebie na %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Zaproś"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Wyloguj się z witryny"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Wyloguj się"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Utwórz konto"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Zarejestruj się"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Zaloguj się na witrynie"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Zaloguj się"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomóż mi."
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Pomoc"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Wyszukaj osoby lub tekst"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Wyszukaj"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Wpis witryny"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Lokalne widoki"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Wpis strony"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Druga nawigacja witryny"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Pomoc"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "O usłudze"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Prywatność"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Kod źródłowy"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Odznaka"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licencja oprogramowania StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4815,12 +4865,12 @@ msgstr ""
 "**%%site.name%%** jest usługą mikroblogowania prowadzoną przez [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** jest usługą mikroblogowania. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4831,57 +4881,57 @@ msgstr ""
 "status.net/) w wersji %s, dostępnego na [Powszechnej Licencji Publicznej GNU "
 "Affero](http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licencja zawartości witryny"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Treść i dane %1$s są prywatne i poufne."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Prawa autorskie do treści i danych są własnością %1$s. Wszystkie prawa "
 "zastrzeżone."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Prawa autorskie do treści i danych są własnością współtwórców. Wszystkie "
 "prawa zastrzeżone."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Wszystko "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licencja."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginacja"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Później"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Wcześniej"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Nie można jeszcze obsługiwać zdalnej treści."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Nie można jeszcze obsługiwać zagnieżdżonej treści XML."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Nie można jeszcze obsługiwać zagnieżdżonej treści Base64."
 
@@ -4896,91 +4946,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Zmiany w tym panelu nie są dozwolone."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() nie jest zaimplementowane."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() nie jest zaimplementowane."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Nie można usunąć ustawienia wyglądu."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Podstawowa konfiguracja witryny"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
-msgstr "Witryny"
+msgstr "Witryna"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Konfiguracja wyglądu"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Wygląd"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Konfiguracja użytkownika"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Użytkownik"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Konfiguracja dostępu"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Dostęp"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Konfiguracja ścieżek"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Ścieżki"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Konfiguracja sesji"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sesje"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Zmodyfikuj wpis witryny"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Konfiguracja migawek"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5172,12 +5207,12 @@ msgstr "Użytkownik %1$s opuścił grupę %2$s"
 msgid "Fullname: %s"
 msgstr "Imię i nazwisko: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Położenie: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Strona domowa: %s"
@@ -5514,6 +5549,11 @@ msgstr "Wybierz znacznik do ograniczonej listy"
 msgid "Go"
 msgstr "Przejdź"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Nadaj użytkownikowi rolę \"%s\""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "Adres URL strony domowej lub bloga grupy, albo temat"
@@ -5653,11 +5693,11 @@ msgstr "Zaloguj się za pomocą nazwy użytkownika i hasła"
 msgid "Sign up for a new account"
 msgstr "Załóż nowe konto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Potwierdzenie adresu e-mail"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5687,12 +5727,12 @@ msgstr ""
 "Dziękujemy za twój czas, \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "Użytkownik %1$s obserwuje teraz twoje wpisy na %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5717,17 +5757,17 @@ msgstr ""
 "----\n"
 "Zmień adres e-mail lub opcje powiadamiania na %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "O mnie: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Nowy adres e-mail do wysyłania do %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5748,21 +5788,21 @@ msgstr ""
 "Z poważaniem,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Stan użytkownika %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Potwierdzenie SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Zostałeś szturchnięty przez %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5789,12 +5829,12 @@ msgstr ""
 "Z poważaniem,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nowa prywatna wiadomość od użytkownika %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5827,12 +5867,12 @@ msgstr ""
 "Z poważaniem,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "Użytkownik %s (@%s) dodał twój wpis jako ulubiony"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5870,12 +5910,12 @@ msgstr ""
 "Z poważaniem,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "Użytkownik %s (@%s) wysłał wpis wymagający twojej uwagi"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6131,10 +6171,6 @@ msgstr "Odpowiedzi"
 msgid "Favorites"
 msgstr "Ulubione"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Użytkownik"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Odebrane"
@@ -6160,7 +6196,7 @@ msgstr "Znaczniki we wpisach użytkownika %s"
 msgid "Unknown"
 msgstr "Nieznane"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subskrypcje"
 
@@ -6168,23 +6204,23 @@ msgstr "Subskrypcje"
 msgid "All subscriptions"
 msgstr "Wszystkie subskrypcje"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subskrybenci"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Wszyscy subskrybenci"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Identyfikator użytkownika"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Członek od"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Wszystkie grupy"
 
@@ -6224,7 +6260,12 @@ msgstr "Powtórzyć ten wpis?"
 msgid "Repeat this notice"
 msgstr "Powtórz ten wpis"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Unieważnij rolę \"%s\" tego użytkownika"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 "Nie określono pojedynczego użytkownika dla trybu pojedynczego użytkownika."
@@ -6379,47 +6420,61 @@ msgstr "Wiadomość"
 msgid "Moderate"
 msgstr "Moderuj"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Rola użytkownika"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "kilka sekund temu"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "około minutę temu"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "około %d minut temu"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "około godzinę temu"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "około %d godzin temu"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "blisko dzień temu"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "około %d dni temu"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "około miesiąc temu"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "około %d miesięcy temu"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "około rok temu"
 
index 2598008d9b811edcdd7226e3d013cf98734da73b..7041bea81930c41d9301cd4ad366a25853d39164 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:38+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:48+0000\n"
 "Language-Team: Portuguese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: pt\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Acesso"
 
@@ -105,7 +106,7 @@ msgstr "Página não encontrada."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -121,7 +122,7 @@ msgstr "Perfis bloqueados de %1$s, página %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -183,7 +184,7 @@ msgstr ""
 "publicar uma nota à sua atenção."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Você e seus amigos"
 
@@ -210,11 +211,11 @@ msgstr "Actualizações de %1$s e amigos no %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método da API não encontrado."
 
@@ -575,7 +576,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Conta"
 
@@ -664,18 +665,6 @@ msgstr "%1$s / Favoritas de %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s actualizações preferidas por %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Notas de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Actualizações de %1#s a %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -686,12 +675,12 @@ msgstr "%1$s / Actualizações que mencionam %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s actualizações em resposta a actualizações de %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Notas públicas de %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s actualizações de todos!"
@@ -711,7 +700,7 @@ msgstr "Repetências de %s"
 msgid "Notices tagged with %s"
 msgstr "Notas categorizadas com %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualizações categorizadas com %1$s em %2$s!"
@@ -751,7 +740,7 @@ msgstr "Pode carregar o seu avatar pessoal. O tamanho máximo do ficheiro é %s.
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Utilizador sem perfil correspondente"
 
@@ -938,7 +927,7 @@ msgid "Conversation"
 msgstr "Conversação"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notas"
 
@@ -960,7 +949,7 @@ msgstr "Não é membro deste grupo."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com a sua sessão."
 
@@ -1159,8 +1148,9 @@ msgstr "Repor predefinição"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1288,7 +1278,7 @@ msgstr "descrição é demasiada extensa (máx. %d caracteres)."
 msgid "Could not update group."
 msgstr "Não foi possível actualizar o grupo."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Não foi possível criar sinónimos."
 
@@ -1415,7 +1405,7 @@ msgid "Cannot normalize that email address"
 msgstr "Não é possível normalizar esse endereço electrónico"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Correio electrónico é inválido."
 
@@ -1607,6 +1597,25 @@ msgstr "Ficheiro não foi encontrado."
 msgid "Cannot read file."
 msgstr "Não foi possível ler o ficheiro."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Tamanho inválido."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Não pode impedir notas públicas neste site."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "O utilizador já está silenciado."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1754,12 +1763,18 @@ msgstr "Tornar Gestor"
 msgid "Make this user an admin"
 msgstr "Tornar este utilizador um gestor"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Notas de %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Actualizações dos membros de %1$s em %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupos"
@@ -2386,8 +2401,8 @@ msgstr "tipo de conteúdo "
 msgid "Only "
 msgstr "Apenas "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Formato de dados não suportado."
 
@@ -2533,7 +2548,8 @@ msgstr "Não é possível guardar a nova senha."
 msgid "Password saved."
 msgstr "Senha gravada."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Localizações"
 
@@ -2653,7 +2669,7 @@ msgstr "Directório dos fundos"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nunca"
 
@@ -2709,11 +2725,11 @@ msgstr "Categoria de pessoas inválida: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Utilizadores auto-categorizados com %1$s - página %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Conteúdo da nota é inválido"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2794,7 +2810,7 @@ msgstr ""
 "Categorias para si (letras, números, -, ., _), separadas por vírgulas ou "
 "espaços"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Idioma"
 
@@ -2820,7 +2836,7 @@ msgstr "Subscrever automaticamente quem me subscreva (óptimo para não-humanos)
 msgid "Bio is too long (max %d chars)."
 msgstr "Biografia demasiado extensa (máx. %d caracteres)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Fuso horário não foi seleccionado."
 
@@ -3142,7 +3158,7 @@ msgid "Same as password above. Required."
 msgstr "Repita a senha acima. Obrigatório."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Correio"
 
@@ -3248,7 +3264,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL do seu perfil noutro serviço de microblogues compatível"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Subscrever"
 
@@ -3352,6 +3368,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Respostas a %1$s em %2$s!"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Não pode silenciar utilizadores neste site."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Utilizador sem perfil correspondente."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3364,7 +3390,9 @@ msgstr "Não pode impedir notas públicas neste site."
 msgid "User is already sandboxed."
 msgstr "Utilizador já está impedido de criar notas públicas."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessões"
 
@@ -3389,7 +3417,7 @@ msgstr "Depuração de sessões"
 msgid "Turn on debugging output for sessions."
 msgstr "Ligar a impressão de dados de depuração, para sessões."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Gravar configurações do site"
@@ -3423,8 +3451,8 @@ msgstr "Paginação"
 msgid "Description"
 msgstr "Descrição"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Estatísticas"
 
@@ -3566,45 +3594,45 @@ msgstr "Sinónimos"
 msgid "Group actions"
 msgstr "Acções do grupo"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de notas do grupo %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de notas do grupo %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de notas do grupo %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF do grupo %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nenhum)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Todos os membros"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Criado"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3620,7 +3648,7 @@ msgstr ""
 "[Registe-se agora](%%action.register%%) para se juntar a este grupo e a "
 "muitos mais! ([Saber mais](%%doc.help%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3633,7 +3661,7 @@ msgstr ""
 "programa de Software Livre [StatusNet](http://status.net/). Os membros deste "
 "grupo partilham mensagens curtas acerca das suas vidas e interesses. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Gestores"
 
@@ -3755,148 +3783,139 @@ msgid "User is already silenced."
 msgstr "O utilizador já está silenciado."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Configurações básicas para este site StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Nome do site não pode ter comprimento zero."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Tem de ter um endereço válido para o correio electrónico de contacto."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Língua desconhecida \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "URL para onde enviar instantâneos é inválida"
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Valor de criação do instantâneo é inválido."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Frequência dos instantâneos estatísticos tem de ser um número."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "O valor mínimo de limite para o texto é 140 caracteres."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "O limite de duplicados tem de ser 1 ou mais segundos."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Geral"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nome do site"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "O nome do seu site, por exemplo \"Microblogue NomeDaEmpresa\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Disponibilizado por"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Texto usado para a ligação de atribuição no rodapé de cada página"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL da atribuição"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL usada para a ligação de atribuição no rodapé de cada página"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Endereço de correio electrónico de contacto para o site"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Fuso horário, por omissão"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Fuso horário por omissão, para o site; normalmente, UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Idioma do site, por omissão"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Instantâneos"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Aleatoriamente, durante o acesso pela internet"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Num processo agendado"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Instantâneos dos dados"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Quando enviar dados estatísticos para os servidores do status.net"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequência"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Instantâneos serão enviados uma vez a cada N acessos da internet"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL para relatórios"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Instantâneos serão enviados para esta URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limites"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Limite de texto"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Número máximo de caracteres nas notas."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Limite de duplicações"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Quanto tempo os utilizadores terão de esperar (em segundos) para publicar a "
 "mesma coisa outra vez."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Aviso do site"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Mensagem nova"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Não foi possível gravar as configurações do estilo."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Aviso do site"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Aviso do site"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Configurações de SMS"
@@ -3997,6 +4016,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Nenhum código introduzido"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Instantâneos"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Alterar a configuração do site"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Valor de criação do instantâneo é inválido."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Frequência dos instantâneos estatísticos tem de ser um número."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "URL para onde enviar instantâneos é inválida"
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Aleatoriamente, durante o acesso pela internet"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Num processo agendado"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Instantâneos dos dados"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Quando enviar dados estatísticos para os servidores do status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequência"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Instantâneos serão enviados uma vez a cada N acessos da internet"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL para relatórios"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Instantâneos serão enviados para esta URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Gravar configurações do site"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Não subscreveu esse perfil."
@@ -4206,7 +4285,7 @@ msgstr "O pedido não tem a identificação do perfil."
 msgid "Unsubscribed"
 msgstr "Subscrição cancelada"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4410,16 +4489,22 @@ msgstr "Membros do grupo %1$s, página %2$d"
 msgid "Search for more groups"
 msgstr "Procurar mais grupos"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s não é membro de nenhum grupo."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr "Tente [pesquisar grupos](%%action.groupsearch%%) e juntar-se a eles."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Actualizações de %1#s a %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4474,7 +4559,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugins"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Versão"
 
@@ -4544,22 +4629,22 @@ msgstr "Não foi possível actualizar a mensagem com a nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro na base de dados ao inserir a marca: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problema na gravação da nota. Demasiado longa."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema na gravação da nota. Utilizador desconhecido."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Demasiadas notas, demasiado rápido; descanse e volte a publicar daqui a "
 "alguns minutos."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4567,20 +4652,20 @@ msgstr ""
 "Demasiadas mensagens duplicadas, demasiado rápido; descanse e volte a "
 "publicar daqui a alguns minutos."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Está proibido de publicar notas neste site."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problema na gravação da nota."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problema na gravação da nota."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4605,7 +4690,12 @@ msgstr "Não subscrito!"
 msgid "Couldn't delete self-subscription."
 msgstr "Não foi possível apagar a auto-subscrição."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Não foi possível apagar a subscrição."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Não foi possível apagar a subscrição."
 
@@ -4614,20 +4704,20 @@ msgstr "Não foi possível apagar a subscrição."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%1$s dá-lhe as boas-vindas, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Não foi possível configurar membros do grupo."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar membros do grupo."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Não foi possível gravar a subscrição."
@@ -4669,194 +4759,187 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "Página sem título"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navegação primária deste site"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil pessoal e notas dos amigos"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Pessoal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Altere o seu endereço electrónico, avatar, senha, perfil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Conta"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Ligar aos serviços"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Ligar"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Alterar a configuração do site"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Gestor"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Convidar amigos e colegas para se juntarem a si em %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Convidar"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Terminar esta sessão"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Sair"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Criar uma conta"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registar"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Iniciar uma sessão"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Entrar"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajudem-me!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Ajuda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Procurar pessoas ou pesquisar texto"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Pesquisa"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Aviso do site"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Vistas locais"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Aviso da página"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navegação secundária deste site"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Ajuda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Termos"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Código"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Emblema"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licença de software do StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4865,12 +4948,12 @@ msgstr ""
 "**%%site.name%%** é um serviço de microblogues disponibilizado por [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é um serviço de microblogues. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4881,53 +4964,53 @@ msgstr ""
 "disponibilizado nos termos da [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licença de conteúdos do site"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Tudo "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Posteriores"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Anteriores"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4942,94 +5025,83 @@ msgid "Changes to that panel are not allowed."
 msgstr "Não são permitidas alterações a esse painel."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() não implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() não implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Não foi possível apagar a configuração do estilo."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuração básica do site"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Site"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuração do estilo"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Estilo"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Configuração das localizações"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Utilizador"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Configuração do estilo"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Acesso"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configuração das localizações"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Localizações"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Configuração do estilo"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessões"
+msgid "Edit site notice"
+msgstr "Aviso do site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Configuração das localizações"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5221,12 +5293,12 @@ msgstr "%s deixou o grupo %s"
 msgid "Fullname: %s"
 msgstr "Nome completo: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Localidade: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Página pessoal: %s"
@@ -5562,6 +5634,11 @@ msgstr "Escolha uma categoria para reduzir a lista"
 msgid "Go"
 msgstr "Prosseguir"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL da página ou do blogue, deste grupo ou assunto"
@@ -5698,11 +5775,11 @@ msgstr "Iniciar sessão com um nome de utilizador e senha"
 msgid "Sign up for a new account"
 msgstr "Registar uma conta nova"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmação do endereço electrónico"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5731,12 +5808,12 @@ msgstr ""
 "Obrigado pelo tempo que dedicou,  \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s está agora a ouvir as suas notas em %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5762,17 +5839,17 @@ msgstr ""
 "Altere o seu endereço de correio electrónico ou as opções de notificação em %"
 "8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Bio: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Novo endereço electrónico para publicar no site %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5793,21 +5870,21 @@ msgstr ""
 "Melhores cumprimentos,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Estado de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmação SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s envia-lhe um toque"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5834,12 +5911,12 @@ msgstr ""
 "Graciosamente,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nova mensagem privada de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5872,12 +5949,12 @@ msgstr ""
 "Profusos cumprimentos,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) adicionou a sua nota às favoritas."
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5914,12 +5991,12 @@ msgstr ""
 "Sinceramente,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) enviou uma nota à sua atenção"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6178,10 +6255,6 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritas"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Utilizador"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Recebidas"
@@ -6207,7 +6280,7 @@ msgstr "Categorias nas notas de %s"
 msgid "Unknown"
 msgstr "Desconhecida"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Subscrições"
 
@@ -6215,23 +6288,23 @@ msgstr "Subscrições"
 msgid "All subscriptions"
 msgstr "Todas as subscrições"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Subscritores"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Todos os subscritores"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID do utilizador"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membro desde"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Todos os grupos"
 
@@ -6271,7 +6344,12 @@ msgstr "Repetir esta nota?"
 msgid "Repeat this notice"
 msgstr "Repetir esta nota"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Bloquear acesso deste utilizador a este grupo"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6425,47 +6503,64 @@ msgstr "Mensagem"
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Perfil"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Gestores"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderar"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "há alguns segundos"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "há cerca de um minuto"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "há cerca de %d minutos"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "há cerca de uma hora"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "há cerca de %d horas"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "há cerca de um dia"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "há cerca de %d dias"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "há cerca de um mês"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "há cerca de %d meses"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "há cerca de um ano"
 
index 041a2d4a3f8e53471ebd4fd49f52ad30727ad0c1..51d926ebabc1f6aaca5268dfa52b695302af460e 100644 (file)
@@ -11,19 +11,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:41+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:51+0000\n"
 "Language-Team: Brazilian Portuguese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: pt-br\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Acesso"
 
@@ -104,7 +105,7 @@ msgstr "Esta página não existe."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +121,7 @@ msgstr "%1$s e amigos, pág. %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -184,7 +185,7 @@ msgstr ""
 "atenção de %s ou publicar uma mensagem para sua atenção."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Você e amigos"
 
@@ -211,11 +212,11 @@ msgstr "Atualizações de %1$s e amigos no %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "O método da API não foi encontrado!"
 
@@ -584,7 +585,7 @@ msgstr ""
 "fornecer acesso à sua conta %4$s somente para terceiros nos quais você "
 "confia."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Conta"
 
@@ -671,18 +672,6 @@ msgstr "%1$s / Favoritas de %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s marcadas como favoritas por %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Mensagens de %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Mensagens de %1$s no %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -693,12 +682,12 @@ msgstr "%1$s / Mensagens mencionando %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s mensagens em resposta a mensagens de %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Mensagens públicas de %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s mensagens de todo mundo!"
@@ -718,7 +707,7 @@ msgstr "Repetições de %s"
 msgid "Notices tagged with %s"
 msgstr "Mensagens etiquetadas como %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Mensagens etiquetadas como %1$s no %2$s!"
@@ -759,7 +748,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Usuário sem um perfil correspondente"
 
@@ -946,7 +935,7 @@ msgid "Conversation"
 msgstr "Conversa"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Mensagens"
 
@@ -965,7 +954,7 @@ msgstr "Você não é o dono desta aplicação."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com o seu token de sessão."
 
@@ -1161,8 +1150,9 @@ msgstr "Restaura de volta ao padrão"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1278,7 +1268,7 @@ msgstr "descrição muito extensa (máximo %d caracteres)."
 msgid "Could not update group."
 msgstr "Não foi possível atualizar o grupo."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Não foi possível criar os apelidos."
 
@@ -1404,7 +1394,7 @@ msgid "Cannot normalize that email address"
 msgstr "Não foi possível normalizar este endereço de e-mail"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Não é um endereço de e-mail válido."
 
@@ -1598,6 +1588,25 @@ msgstr "Esse arquivo não existe."
 msgid "Cannot read file."
 msgstr "Não foi possível ler o arquivo."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Token inválido."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Você não pode colocar usuários deste site em isolamento."
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "O usuário já está silenciado."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1746,12 +1755,18 @@ msgstr "Tornar administrador"
 msgid "Make this user an admin"
 msgstr "Torna este usuário um administrador"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Mensagens de %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Atualizações dos membros de %1$s no %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupos"
@@ -2381,8 +2396,8 @@ msgstr "tipo de conteúdo "
 msgid "Only "
 msgstr "Apenas "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Não é um formato de dados suportado."
 
@@ -2523,7 +2538,8 @@ msgstr "Não é possível salvar a nova senha."
 msgid "Password saved."
 msgstr "A senha foi salva."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Caminhos"
 
@@ -2644,7 +2660,7 @@ msgstr "Diretório das imagens de fundo"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Nunca"
 
@@ -2699,11 +2715,11 @@ msgstr "Não é uma etiqueta de pessoa válida: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Usuários auto-etiquetados com %1$s - pág. %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "O conteúdo da mensagem é inválido"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2784,7 +2800,7 @@ msgstr ""
 "Suas etiquetas (letras, números, -, ., e _), separadas por vírgulas ou "
 "espaços"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Idioma"
 
@@ -2811,7 +2827,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "A descrição é muito extensa (máximo %d caracteres)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "O fuso horário não foi selecionado."
 
@@ -3134,7 +3150,7 @@ msgid "Same as password above. Required."
 msgstr "Igual à senha acima. Obrigatório."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-mail"
 
@@ -3240,7 +3256,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL do seu perfil em outro serviço de microblog compatível"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Assinar"
 
@@ -3344,6 +3360,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Respostas para %1$s no %2$s"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Você não pode silenciar os usuários neste site."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Usuário sem um perfil correspondente"
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3356,7 +3382,9 @@ msgstr "Você não pode colocar usuários deste site em isolamento."
 msgid "User is already sandboxed."
 msgstr "O usuário já está em isolamento."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessões"
 
@@ -3380,7 +3408,7 @@ msgstr "Depuração da sessão"
 msgid "Turn on debugging output for sessions."
 msgstr "Ativa a saída de depuração para as sessões."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salvar as configurações do site"
@@ -3411,8 +3439,8 @@ msgstr "Organização"
 msgid "Description"
 msgstr "Descrição"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Estatísticas"
 
@@ -3554,45 +3582,45 @@ msgstr "Apelidos"
 msgid "Group actions"
 msgstr "Ações do grupo"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de mensagens do grupo %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de mensagens do grupo %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de mensagens do grupo %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF para o grupo %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nenhum)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Todos os membros"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Criado"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3608,7 +3636,7 @@ msgstr ""
 "para se tornar parte deste grupo e muito mais! ([Saiba mais](%%%%doc.help%%%"
 "%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3621,7 +3649,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Seus membros compartilham mensagens curtas "
 "sobre suas vidas e interesses. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administradores"
 
@@ -3745,148 +3773,139 @@ msgid "User is already silenced."
 msgstr "O usuário já está silenciado."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Configurações básicas para esta instância do StatusNet."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Você deve digitar alguma coisa para o nome do site."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Você deve ter um endereço de e-mail para contato válido."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Idioma \"%s\" desconhecido."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "A URL para o envio das estatísticas é inválida."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "O valor de execução da obtenção das estatísticas é inválido."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "A frequência de geração de estatísticas deve ser um número."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "O comprimento máximo do texto é de 140 caracteres."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "O limite de duplicatas deve ser de um ou mais segundos."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Geral"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Nome do site"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "O nome do seu site, por exemplo \"Microblog da Sua Empresa\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Disponibilizado por"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Texto utilizado para o link de créditos no rodapé de cada página"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL do disponibilizado por"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL utilizada para o link de créditos no rodapé de cada página"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Endereço de e-mail para contatos do seu site"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Local"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Fuso horário padrão"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Fuso horário padrão para o seu site; geralmente UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Idioma padrão do site"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Estatísticas"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Aleatoriamente durante o funcionamento"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Em horários pré-definidos"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Estatísticas dos dados"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Quando enviar dados estatísticos para os servidores status.net"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frequentemente"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "As estatísticas serão enviadas uma vez a cada N usos da web"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL para envio"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "As estatísticas serão enviadas para esta URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Limites"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Limite do texto"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Número máximo de caracteres para as mensagens."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Limite de duplicatas"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Quanto tempo (em segundos) os usuários devem esperar para publicar a mesma "
 "coisa novamente."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Mensagem do site"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nova mensagem"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Não foi possível salvar suas configurações de aparência."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Mensagem do site"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Mensagem do site"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Configuração do SMS"
@@ -3985,6 +4004,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Não foi digitado nenhum código"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Estatísticas"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Mude as configurações do site"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "O valor de execução da obtenção das estatísticas é inválido."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "A frequência de geração de estatísticas deve ser um número."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "A URL para o envio das estatísticas é inválida."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Aleatoriamente durante o funcionamento"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Em horários pré-definidos"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Estatísticas dos dados"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Quando enviar dados estatísticos para os servidores status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frequentemente"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "As estatísticas serão enviadas uma vez a cada N usos da web"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL para envio"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "As estatísticas serão enviadas para esta URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Salvar as configurações do site"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Você não está assinando esse perfil."
@@ -4194,7 +4273,7 @@ msgstr "Nenhuma ID de perfil na requisição."
 msgid "Unsubscribed"
 msgstr "Cancelado"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4399,18 +4478,24 @@ msgstr "Grupos de %1$s, pág. %2$d"
 msgid "Search for more groups"
 msgstr "Procurar por outros grupos"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s não é membro de nenhum grupo."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Experimente [procurar por grupos](%%action.groupsearch%%) e associar-se à "
 "eles."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Mensagens de %1$s no %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4466,7 +4551,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugins"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Versão"
 
@@ -4532,22 +4617,22 @@ msgstr "Não foi possível atualizar a mensagem com a nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro no banco de dados durante a inserção da hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problema no salvamento da mensagem. Ela é muito extensa."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema no salvamento da mensagem. Usuário desconhecido."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Muitas mensagens em um período curto de tempo; dê uma respirada e publique "
 "novamente daqui a alguns minutos."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4555,19 +4640,19 @@ msgstr ""
 "Muitas mensagens duplicadas em um período curto de tempo; dê uma respirada e "
 "publique novamente daqui a alguns minutos."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Você está proibido de publicar mensagens neste site."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problema no salvamento da mensagem."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problema no salvamento das mensagens recebidas do grupo."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4592,7 +4677,12 @@ msgstr "Não assinado!"
 msgid "Couldn't delete self-subscription."
 msgstr "Não foi possível excluir a auto-assinatura."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Não foi possível excluir a assinatura."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Não foi possível excluir a assinatura."
 
@@ -4601,20 +4691,20 @@ msgstr "Não foi possível excluir a assinatura."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bem vindo(a) a %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Não foi possível configurar a associação ao grupo."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar a associação ao grupo."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Não foi possível salvar a assinatura."
@@ -4656,194 +4746,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Página sem título"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Navegação primária no site"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil pessoal e fluxo de mensagens dos amigos"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Pessoal"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Mude seu e-mail, avatar, senha, perfil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Conta"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Conecte-se a outros serviços"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Conectar"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Mude as configurações do site"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Admin"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Convide seus amigos e colegas para unir-se a você no %s"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Convidar"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Sai do site"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Sair"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Cria uma conta"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrar-se"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Autentique-se no site"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Entrar"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajudem-me!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Ajuda"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Procura por pessoas ou textos"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Procurar"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Mensagem do site"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Visualizações locais"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Notícia da página"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Navegação secundária no site"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Ajuda"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Termos de uso"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Contato"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Mini-aplicativo"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Licença do software StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4852,12 +4935,12 @@ msgstr ""
 "**%%site.name%%** é um serviço de microblog disponibilizado por [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é um serviço de microblog. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4868,55 +4951,55 @@ msgstr ""
 "versão %s, disponível sob a [GNU Affero General Public License] (http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licença do conteúdo do site"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "O conteúdo e os dados de %1$s são privados e confidenciais."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr "Conteúdo e dados licenciados sob %1$s. Todos os direitos reservados."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Conteúdo e dados licenciados pelos colaboradores. Todos os direitos "
 "reservados."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Todas "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Próximo"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Anterior"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4931,91 +5014,80 @@ msgid "Changes to that panel are not allowed."
 msgstr "Não são permitidas alterações a esse painel."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() não implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() não implementado."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Não foi possível excluir as configurações da aparência."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Configuração básica do site"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Site"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Configuração da aparência"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Aparência"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Configuração do usuário"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Usuário"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Configuração do acesso"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Acesso"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Configuração dos caminhos"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Caminhos"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Configuração das sessões"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessões"
+msgid "Edit site notice"
+msgstr "Mensagem do site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Configuração dos caminhos"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5207,12 +5279,12 @@ msgstr "%s deixou o grupo %s"
 msgid "Fullname: %s"
 msgstr "Nome completo: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Localização: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Site: %s"
@@ -5548,6 +5620,11 @@ msgstr "Selecione uma etiqueta para reduzir a lista"
 msgid "Go"
 msgstr "Ir"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL para o site ou blog do grupo ou tópico"
@@ -5686,11 +5763,11 @@ msgstr "Autentique-se com um nome de usuário e uma senha"
 msgid "Sign up for a new account"
 msgstr "Cadastre-se para uma nova conta"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Confirmação do endereço de e-mail"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5719,12 +5796,12 @@ msgstr ""
 "Obrigado pela sua atenção, \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s agora está acompanhando suas mensagens no %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5749,17 +5826,17 @@ msgstr ""
 "----\n"
 "Altere seu endereço de e-mail e suas opções de notificação em %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Descrição: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Novo endereço de e-mail para publicar no %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5780,21 +5857,21 @@ msgstr ""
 "Atenciosamente,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "Mensagem de %s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Confirmação de SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Você teve a atenção chamada por %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5821,12 +5898,12 @@ msgstr ""
 "Atenciosamente,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nova mensagem particular de %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5859,12 +5936,12 @@ msgstr ""
 "Atenciosamente,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) marcou sua mensagem como favorita"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5901,12 +5978,12 @@ msgstr ""
 "Atenciosamente,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) enviou uma mensagem citando você"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6168,10 +6245,6 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritas"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Usuário"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Recebidas"
@@ -6197,7 +6270,7 @@ msgstr "Etiquetas nas mensagens de %s"
 msgid "Unknown"
 msgstr "Desconhecido"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Assinaturas"
 
@@ -6205,23 +6278,23 @@ msgstr "Assinaturas"
 msgid "All subscriptions"
 msgstr "Todas as assinaturas"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Assinantes"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Todos os assinantes"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID do usuário"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Membro desde"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Todos os grupos"
 
@@ -6261,7 +6334,12 @@ msgstr "Repetir esta mensagem?"
 msgid "Repeat this notice"
 msgstr "Repetir esta mensagem"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Bloquear este usuário neste grupo"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Nenhum usuário definido para o modo de usuário único."
 
@@ -6415,47 +6493,64 @@ msgstr "Mensagem"
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Perfil do usuário"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administradores"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderar"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "alguns segundos atrás"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "cerca de 1 minuto atrás"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "cerca de %d minutos atrás"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "cerca de 1 hora atrás"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "cerca de %d horas atrás"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "cerca de 1 dia atrás"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "cerca de %d dias atrás"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "cerca de 1 mês atrás"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "cerca de %d meses atrás"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "cerca de 1 ano atrás"
 
index 4db3b068466addeae2ee1f8f8e3d8d87cb6bcb6b..03aaa074a2fb75b7722e40dab589bb429f8a615e 100644 (file)
@@ -12,12 +12,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:44+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:54+0000\n"
 "Language-Team: Russian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: ru\n"
 "X-Message-Group: out-statusnet\n"
@@ -25,7 +25,8 @@ msgstr ""
 "10< =4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Принять"
 
@@ -47,7 +48,6 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Личное"
@@ -78,7 +78,6 @@ msgid "Save access settings"
 msgstr "Сохранить настройки доступа"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Сохранить"
@@ -107,7 +106,7 @@ msgstr "Нет такой страницы"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +122,7 @@ msgstr "%1$s и друзья, страница %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -185,7 +184,7 @@ msgstr ""
 "s или отправить запись для привлечения его или её внимания?"
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Вы и друзья"
 
@@ -212,11 +211,11 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Метод API не найден."
 
@@ -582,7 +581,7 @@ msgstr ""
 "предоставлять разрешение на доступ к вашей учётной записи %4$s только тем "
 "сторонним приложениям, которым вы доверяете."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Настройки"
 
@@ -669,18 +668,6 @@ msgstr "%1$s / Любимое от %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "Обновления %1$s, отмеченные как любимые %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "Лента %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Обновлено от %1$s на %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -691,12 +678,12 @@ msgstr "%1$s / Обновления, упоминающие %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s обновил этот ответ на сообщение: %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Общая лента %s"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Обновления %s от всех!"
@@ -716,7 +703,7 @@ msgstr "Повторы за %s"
 msgid "Notices tagged with %s"
 msgstr "Записи с тегом %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Обновления с тегом %1$s на %2$s!"
@@ -757,7 +744,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Пользователь без соответствующего профиля"
 
@@ -943,7 +930,7 @@ msgid "Conversation"
 msgstr "Дискуссия"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Записи"
 
@@ -962,7 +949,7 @@ msgstr "Вы не являетесь владельцем этого прило
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста."
 
@@ -1158,8 +1145,9 @@ msgstr "Восстановить значения по умолчанию"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1275,7 +1263,7 @@ msgstr "Слишком длинное описание (максимум %d си
 msgid "Could not update group."
 msgstr "Не удаётся обновить информацию о группе."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Не удаётся создать алиасы."
 
@@ -1407,7 +1395,7 @@ msgid "Cannot normalize that email address"
 msgstr "Не удаётся стандартизировать этот электронный адрес"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Неверный электронный адрес."
 
@@ -1600,6 +1588,22 @@ msgstr "Нет такого файла."
 msgid "Cannot read file."
 msgstr "Не удалось прочесть файл."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Неверная роль."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Эта роль зарезервирована и не может быть установлена."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Вы не можете назначать пользователю роли на этом сайте."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Пользователь уже имеет эту роль."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1747,12 +1751,18 @@ msgstr "Сделать администратором"
 msgid "Make this user an admin"
 msgstr "Сделать этого пользователя администратором"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "Лента %s"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Обновления участников %1$s на %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Группы"
@@ -2015,7 +2025,6 @@ msgstr "Можно добавить к приглашению личное со
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Отправить"
@@ -2372,8 +2381,8 @@ msgstr "тип содержимого "
 msgid "Only "
 msgstr "Только "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Неподдерживаемый формат данных."
 
@@ -2514,7 +2523,8 @@ msgstr "Не удаётся сохранить новый пароль."
 msgid "Password saved."
 msgstr "Пароль сохранён."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Пути"
 
@@ -2634,7 +2644,7 @@ msgstr "Директория фонового изображения"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Никогда"
 
@@ -2689,11 +2699,11 @@ msgstr "Неверный тег человека: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Пользователи, установившие себе тег %1$s — страница %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Неверный контент записи"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Лицензия записи «%1$s» не совместима с лицензией сайта «%2$s»."
@@ -2773,7 +2783,7 @@ msgstr ""
 "Теги для самого себя (буквы, цифры, -, ., и _), разделенные запятой или "
 "пробелом"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Язык"
 
@@ -2799,7 +2809,7 @@ msgstr "Автоматически подписываться на всех, к
 msgid "Bio is too long (max %d chars)."
 msgstr "Слишком длинная биография (максимум %d символов)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Часовой пояс не выбран."
 
@@ -3120,7 +3130,7 @@ msgid "Same as password above. Required."
 msgstr "Тот же пароль что и сверху. Обязательное поле."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Email"
 
@@ -3225,7 +3235,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Адрес URL твоего профиля на другом подходящем сервисе микроблогинга"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Подписаться"
 
@@ -3327,6 +3337,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Ответы на записи %1$s на %2$s!"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Вы не можете снимать роли пользователей на этом сайте."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Пользователь не имеет этой роли."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3340,7 +3358,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr "Пользователь уже в режиме песочницы."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Сессии"
 
@@ -3364,7 +3384,7 @@ msgstr "Отладка сессий"
 msgid "Turn on debugging output for sessions."
 msgstr "Включить отладочный вывод для сессий."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Сохранить настройки сайта"
@@ -3395,8 +3415,8 @@ msgstr "Организация"
 msgid "Description"
 msgstr "Описание"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Статистика"
 
@@ -3538,45 +3558,45 @@ msgstr "Алиасы"
 msgid "Group actions"
 msgstr "Действия группы"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Лента записей группы %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Лента записей группы %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Лента записей группы %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF для группы %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Участники"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(пока ничего нет)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Все участники"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Создано"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3592,7 +3612,7 @@ msgstr ""
 "action.register%%%%), чтобы стать участником группы и получить множество "
 "других возможностей! ([Читать далее](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3605,7 +3625,7 @@ msgstr ""
 "обеспечении [StatusNet](http://status.net/). Участники обмениваются "
 "короткими сообщениями о своей жизни и интересах. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Администраторы"
 
@@ -3730,149 +3750,134 @@ msgid "User is already silenced."
 msgstr "Пользователь уже заглушён."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Основные настройки для этого сайта StatusNet."
+msgid "Basic settings for this StatusNet site"
+msgstr "Основные настройки для этого сайта StatusNet"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Имя сайта должно быть ненулевой длины."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "У вас должен быть действительный контактный email-адрес."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Неизвестный язык «%s»."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Неверный URL отчёта снимка."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Неверное значение запуска снимка."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Частота снимков должна быть числом."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Минимальное ограничение текста составляет 140 символов."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Ограничение дублирования должно составлять 1 или более секунд."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Базовые"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Имя сайта"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Имя вашего сайта, например, «Yourcompany Microblog»"
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Предоставлено"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 "Текст, используемый для указания авторов в нижнем колонтитуле каждой страницы"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "URL-адрес поставщика услуг"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 "URL, используемый для ссылки на авторов в нижнем колонтитуле каждой страницы"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Контактный email-адрес для вашего сайта"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Внутренние настройки"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Часовой пояс по умолчанию"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Часовой пояс по умолчанию для сайта; обычно UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr "Язык сайта по умолчанию"
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Снимки"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "При случайном посещении"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "По заданному графику"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Снимки данных"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Когда отправлять статистические данные на сервера status.net"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
+msgstr "Язык по умолчанию"
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Частота"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Снимки будут отправляться каждые N посещений"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL отчёта"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Снимки будут отправляться по этому URL-адресу"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+"Язык сайта в случае, если автоопределение из настроек браузера не сработало"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Границы"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Границы текста"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Максимальное число символов для записей."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Предел дубликатов"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Сколько нужно ждать пользователям (в секундах) для отправки того же ещё раз."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Уведомление сайта"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Изменить уведомление для всего сайта"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Не удаётся сохранить уведомление сайта."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "Максимальная длина уведомления сайта составляет 255 символов"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Текст уведомления сайта"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr "Текст уведомления сайта (максимум 255 символов; допустим HTML)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Сохранить уведомление сайта"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Установки СМС"
@@ -3974,6 +3979,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Код не введён"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Снимки"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Управление снимками конфигурации"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Неверное значение запуска снимка."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Частота снимков должна быть числом."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Неверный URL отчёта снимка."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "При случайном посещении"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "По заданному графику"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Снимки данных"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Когда отправлять статистические данные на сервера status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Частота"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Снимки будут отправляться каждые N посещений"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL отчёта"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Снимки будут отправляться по этому URL-адресу"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Сохранить настройки снимка"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Вы не подписаны на этот профиль."
@@ -4184,7 +4247,7 @@ msgstr "Нет ID профиля в запросе."
 msgid "Unsubscribed"
 msgstr "Отписано"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4193,7 +4256,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Пользователь"
@@ -4386,17 +4448,23 @@ msgstr "Группы %1$s, страница %2$d"
 msgid "Search for more groups"
 msgstr "Искать другие группы"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s не состоит ни в одной группе."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Попробуйте [найти группы](%%action.groupsearch%%) и присоединиться к ним."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Обновлено от %1$s на %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4452,7 +4520,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Плагины"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Версия"
 
@@ -4517,22 +4585,22 @@ msgstr "Не удаётся обновить сообщение с новым UR
 msgid "DB error inserting hashtag: %s"
 msgstr "Ошибка баз данных при вставке хеш-тегов для %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Проблемы с сохранением записи. Слишком длинно."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при сохранении записи. Неизвестный пользователь."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Слишком много записей за столь короткий срок; передохните немного и "
 "попробуйте вновь через пару минут."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4540,19 +4608,19 @@ msgstr ""
 "Слишком много одинаковых записей за столь короткий срок; передохните немного "
 "и попробуйте вновь через пару минут."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Вам запрещено поститься на этом сайте (бан)"
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Проблемы с сохранением записи."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Проблемы с сохранением входящих сообщений группы."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4577,7 +4645,11 @@ msgstr "Не подписаны!"
 msgid "Couldn't delete self-subscription."
 msgstr "Невозможно удалить самоподписку."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Не удаётся удалить подписочный жетон OMB."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Не удаётся удалить подписку."
 
@@ -4586,19 +4658,19 @@ msgstr "Не удаётся удалить подписку."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добро пожаловать на %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Не удаётся создать группу."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Не удаётся назначить URI группы."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Не удаётся назначить членство в группе."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Не удаётся сохранить информацию о локальной группе."
 
@@ -4639,194 +4711,170 @@ msgstr "%1$s — %2$s"
 msgid "Untitled page"
 msgstr "Страница без названия"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Главная навигация"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Личный профиль и лента друзей"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Личное"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
-msgstr "Изменить ваш email, аватару, пароль, профиль"
-
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Настройки"
+msgstr "Изменить ваш email, аватар, пароль, профиль"
 
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Соединить с сервисами"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Соединить"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Изменить конфигурацию сайта"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Настройки"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
-msgstr "Ð\9fÑ\80иглаÑ\81иÑ\82е Ð´Ñ\80Ñ\83зей Ð¸ ÐºÐ¾Ð»Ð»ÐµÐ³ Ñ\81Ñ\82аÑ\82Ñ\8c Ñ\82акими Ð¶Ðµ ÐºÐ°Ðº Ð²ы участниками %s"
+msgstr "Ð\9fÑ\80иглаÑ\81иÑ\82е Ð´Ñ\80Ñ\83зей Ð¸ ÐºÐ¾Ð»Ð»ÐµÐ³ Ñ\81Ñ\82аÑ\82Ñ\8c Ñ\82акими Ð¶Ðµ ÐºÐ°Ðº Ð\92ы участниками %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Пригласить"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Выйти"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Выход"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Создать новый аккаунт"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Регистрация"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Войти"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Вход"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Помощь"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Помощь"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Искать людей или текст"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Поиск"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Новая запись"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Локальные виды"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Новая запись"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Навигация по подпискам"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Помощь"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "О проекте"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "ЧаВо"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Пользовательское соглашение"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Исходный код"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Контактная информация"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Бедж"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet лицензия"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4835,12 +4883,12 @@ msgstr ""
 "**%%site.name%%** — это сервис микроблогинга, созданный для вас при помощи [%"
 "%site.broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** — сервис микроблогинга. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4852,56 +4900,56 @@ msgstr ""
 "лицензией [GNU Affero General Public License](http://www.fsf.org/licensing/"
 "licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Лицензия содержимого сайта"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Содержание и данные %1$s являются личными и конфиденциальными."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Авторские права на содержание и данные принадлежат %1$s. Все права защищены."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторские права на содержание и данные принадлежат разработчикам. Все права "
 "защищены."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "license."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Разбиение на страницы"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Сюда"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Туда"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Пока ещё нельзя обрабатывать удалённое содержимое."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Пока ещё нельзя обрабатывать встроенный XML."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Пока ещё нельзя обрабатывать встроенное содержание Base64."
 
@@ -4916,91 +4964,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Изменения для этой панели недопустимы."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() не реализована."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не реализована."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Не удаётся удалить настройки оформления."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Основная конфигурация сайта"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Сайт"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Конфигурация оформления"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Оформление"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Конфигурация пользователя"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Пользователь"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Конфигурация доступа"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Принять"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Конфигурация путей"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Пути"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Конфигурация сессий"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Сессии"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Изменить уведомление сайта"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Конфигурация снимков"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5192,12 +5225,12 @@ msgstr "%1$s покинул группу %2$s"
 msgid "Fullname: %s"
 msgstr "Полное имя: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Месторасположение: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Домашняя страница: %s"
@@ -5532,6 +5565,11 @@ msgstr "Выберите тег из выпадающего списка"
 msgid "Go"
 msgstr "Перейти"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Назначить этому пользователю роль «%s»"
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "Адрес страницы, дневника или профиля группы на другом портале"
@@ -5669,11 +5707,11 @@ msgstr "Войти с вашим ником и паролем."
 msgid "Sign up for a new account"
 msgstr "Создать новый аккаунт"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Подтверждение электронного адреса"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5703,12 +5741,12 @@ msgstr ""
 "Благодарим за потраченное время,  \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s теперь следит за вашими записями на %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5733,17 +5771,17 @@ msgstr ""
 "----\n"
 "Измените email-адрес и настройки уведомлений на %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Биография: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Новый электронный адрес для постинга %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5764,21 +5802,21 @@ msgstr ""
 "Искренне Ваш,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s статус"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Подтверждение СМС"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Вас «подтолкнул» пользователь %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5805,12 +5843,12 @@ msgstr ""
 "С уважением,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Новое приватное сообщение от %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5843,12 +5881,12 @@ msgstr ""
 "С уважением,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) добавил вашу запись в число своих любимых"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5885,12 +5923,12 @@ msgstr ""
 "С уважением,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s)  отправил запись для вашего внимания"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6148,10 +6186,6 @@ msgstr "Ответы"
 msgid "Favorites"
 msgstr "Любимое"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Пользователь"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Входящие"
@@ -6177,7 +6211,7 @@ msgstr "Теги записей пользователя %s"
 msgid "Unknown"
 msgstr "Неизвестно"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Подписки"
 
@@ -6185,23 +6219,23 @@ msgstr "Подписки"
 msgid "All subscriptions"
 msgstr "Все подписки."
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Подписчики"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Все подписчики"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ID пользователя"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Регистрация"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Все группы"
 
@@ -6241,7 +6275,12 @@ msgstr "Повторить эту запись?"
 msgid "Repeat this notice"
 msgstr "Повторить эту запись"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Отозвать у этого пользователя роль «%s»"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Ни задан пользователь для однопользовательского режима."
 
@@ -6395,47 +6434,61 @@ msgstr "Сообщение"
 msgid "Moderate"
 msgstr "Модерировать"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Роль пользователя"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратор"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "пару секунд назад"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "около минуты назад"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "около %d минут(ы) назад"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "около часа назад"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "около %d часа(ов) назад"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "около дня назад"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "около %d дня(ей) назад"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "около месяца назад"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "около %d месяца(ев) назад"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "около года назад"
 
index 3f4ad499f72a7e4dfb1cb8c0ed8cc05e21bce426..61d902a1a9a8e80c7dfd13b4ce945c6144594c5f 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"POT-Creation-Date: 2010-03-08 21:09+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"
@@ -18,7 +18,8 @@ msgstr ""
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr ""
 
@@ -97,7 +98,7 @@ msgstr ""
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -113,7 +114,7 @@ msgstr ""
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -168,7 +169,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr ""
 
@@ -195,11 +196,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr ""
 
@@ -551,7 +552,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr ""
 
@@ -638,18 +639,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -660,12 +649,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -685,7 +674,7 @@ msgstr ""
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -725,7 +714,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -908,7 +897,7 @@ msgid "Conversation"
 msgstr ""
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr ""
 
@@ -927,7 +916,7 @@ msgstr ""
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1114,8 +1103,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1231,7 +1221,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr ""
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr ""
 
@@ -1351,7 +1341,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr ""
 
@@ -1535,6 +1525,22 @@ msgstr ""
 msgid "Cannot read file."
 msgstr ""
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr ""
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr ""
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr ""
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1675,12 +1681,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr ""
@@ -2230,8 +2242,8 @@ msgstr ""
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2370,7 +2382,8 @@ msgstr ""
 msgid "Password saved."
 msgstr ""
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2490,7 +2503,7 @@ msgstr ""
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr ""
 
@@ -2543,11 +2556,11 @@ msgstr ""
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr ""
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr ""
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2623,7 +2636,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr ""
 
@@ -2649,7 +2662,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr ""
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -2947,7 +2960,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr ""
 
@@ -3031,7 +3044,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr ""
 
@@ -3127,6 +3140,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr ""
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr ""
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr ""
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr ""
@@ -3139,7 +3160,9 @@ msgstr ""
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3163,7 +3186,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr ""
@@ -3194,8 +3217,8 @@ msgstr ""
 msgid "Description"
 msgstr ""
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr ""
 
@@ -3327,45 +3350,45 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr ""
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr ""
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3375,7 +3398,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3384,7 +3407,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3494,144 +3517,128 @@ msgid "User is already silenced."
 msgstr ""
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr ""
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr ""
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr ""
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr ""
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
 msgstr ""
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
 msgstr ""
 
 #: actions/smssettings.php:58
@@ -3726,6 +3733,64 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr ""
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -3919,7 +3984,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr ""
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4109,16 +4174,22 @@ msgstr ""
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4162,7 +4233,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr ""
 
@@ -4225,38 +4296,38 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4281,7 +4352,11 @@ msgstr ""
 msgid "Couldn't delete self-subscription."
 msgstr ""
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr ""
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr ""
 
@@ -4290,19 +4365,19 @@ msgstr ""
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr ""
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr ""
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr ""
 
@@ -4343,187 +4418,182 @@ msgstr ""
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr ""
 
-#: lib/action.php:447
-msgctxt "MENU"
-msgid "Account"
-msgstr ""
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr ""
 
-#: lib/action.php:453
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr ""
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr ""
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr ""
 
-#: lib/action.php:484
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr ""
 
-#: lib/action.php:496
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr ""
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr ""
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr ""
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr ""
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4531,53 +4601,53 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr ""
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4592,84 +4662,75 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr ""
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-msgctxt "MENU"
-msgid "Access"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:388
+msgid "Sessions configuration"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
-msgid "Sessions configuration"
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
 msgstr ""
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-msgctxt "MENU"
-msgid "Sessions"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
 msgstr ""
 
 #: lib/apiauth.php:94
@@ -4854,12 +4915,12 @@ msgstr ""
 msgid "Fullname: %s"
 msgstr ""
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5151,6 +5212,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5286,11 +5352,11 @@ msgstr ""
 msgid "Sign up for a new account"
 msgstr ""
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr ""
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5307,12 +5373,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr ""
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5327,17 +5393,17 @@ msgid ""
 "Change your email address or notification options at %8$s\n"
 msgstr ""
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr ""
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5350,21 +5416,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr ""
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5380,12 +5446,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5404,12 +5470,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr ""
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5430,12 +5496,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5674,10 +5740,6 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5703,7 +5765,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr ""
 
@@ -5711,23 +5773,23 @@ msgstr ""
 msgid "All subscriptions"
 msgstr ""
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr ""
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr ""
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr ""
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -5767,7 +5829,12 @@ msgstr ""
 msgid "Repeat this notice"
 msgstr ""
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr ""
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5921,47 +5988,61 @@ msgstr ""
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
-msgid "a few seconds ago"
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr ""
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
 msgstr ""
 
 #: lib/util.php:1015
-msgid "about a minute ago"
+msgid "a few seconds ago"
 msgstr ""
 
 #: lib/util.php:1017
+msgid "about a minute ago"
+msgstr ""
+
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr ""
 
index b1ac66f6513153fb0057da894b4d3466c5983db6..2a508849f26c31c29258a2d6c9422b14151b4566 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:47+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:50:58+0000\n"
 "Language-Team: Swedish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: sv\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Åtkomst"
 
@@ -43,7 +44,6 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Privat"
@@ -74,7 +74,6 @@ msgid "Save access settings"
 msgstr "Spara inställningar för åtkomst"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Spara"
@@ -103,7 +102,7 @@ msgstr "Ingen sådan sida"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -119,7 +118,7 @@ msgstr "%1$s och vänner, sida %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -181,7 +180,7 @@ msgstr ""
 "%s eller skriva en notis för hans eller hennes uppmärksamhet."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Du och vänner"
 
@@ -208,11 +207,11 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metod hittades inte."
 
@@ -570,7 +569,7 @@ msgstr ""
 "möjligheten att <strong>%3$s</strong> din %4$s kontoinformation. Du bör bara "
 "ge tillgång till ditt %4$s-konto till tredje-parter du litar på."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Konto"
 
@@ -657,18 +656,6 @@ msgstr "%1$s / Favoriter från %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s uppdateringar markerade som favorit av %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s tidslinje"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Uppdateringar från %1$s på %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -679,12 +666,12 @@ msgstr "%1$s / Uppdateringar som nämner %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s uppdateringar med svar på uppdatering från %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s publika tidslinje"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s uppdateringar från alla!"
@@ -704,7 +691,7 @@ msgstr "Upprepningar av %s"
 msgid "Notices tagged with %s"
 msgstr "Notiser taggade med %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Uppdateringar taggade med %1$s på %2$s!"
@@ -745,7 +732,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Användare utan matchande profil"
 
@@ -932,7 +919,7 @@ msgid "Conversation"
 msgstr "Konversationer"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Notiser"
 
@@ -951,7 +938,7 @@ msgstr "Du är inte ägaren av denna applikation."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Det var ett problem med din sessions-token."
 
@@ -1147,8 +1134,9 @@ msgstr "Återställ till standardvärde"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1264,7 +1252,7 @@ msgstr "beskrivning är för lång (max %d tecken)."
 msgid "Could not update group."
 msgstr "Kunde inte uppdatera grupp."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Kunde inte skapa alias."
 
@@ -1387,7 +1375,7 @@ msgid "Cannot normalize that email address"
 msgstr "Kan inte normalisera den e-postadressen"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Inte en giltig e-postadress."
 
@@ -1580,6 +1568,22 @@ msgstr "Ingen sådan fil."
 msgid "Cannot read file."
 msgstr "Kan inte läsa fil."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Ogiltig roll."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Denna roll är reserverad och kan inte ställas in"
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Du kan inte bevilja användare roller på denna webbplats."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Användaren har redan denna roll."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1726,12 +1730,18 @@ msgstr "Gör till administratör"
 msgid "Make this user an admin"
 msgstr "Gör denna användare till administratör"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s tidslinje"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Uppdateringar från medlemmar i %1$s på %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Grupper"
@@ -1993,7 +2003,6 @@ msgstr "Om du vill, skriv ett personligt meddelande till inbjudan."
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Skicka"
@@ -2352,8 +2361,8 @@ msgstr "innehållstyp "
 msgid "Only "
 msgstr "Bara "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Ett dataformat som inte stödjs"
 
@@ -2492,7 +2501,8 @@ msgstr "Kan inte spara nytt lösenord."
 msgid "Password saved."
 msgstr "Lösenord sparat."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Sökvägar"
 
@@ -2613,7 +2623,7 @@ msgstr "Katalog med bakgrunder"
 msgid "SSL"
 msgstr "SSL"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Aldrig"
 
@@ -2668,11 +2678,11 @@ msgstr "Inte en giltig persontagg: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Användare som taggat sig själv med %1$s - sida %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Ogiltigt notisinnehåll"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Licensen för notiser ‘%1$s’ är inte förenlig webbplatslicensen ‘%2$s’."
@@ -2752,7 +2762,7 @@ msgstr ""
 "Taggar för dig själv (bokstäver, nummer, -, ., och _), separerade med "
 "kommatecken eller mellanslag"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Språk"
 
@@ -2780,7 +2790,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Biografin är för lång (max %d tecken)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Tidszon inte valt."
 
@@ -3100,7 +3110,7 @@ msgid "Same as password above. Required."
 msgstr "Samma som lösenordet ovan. Måste fyllas i."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "E-post"
 
@@ -3208,7 +3218,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL till din profil på en annan kompatibel mikrobloggtjänst"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Prenumerera"
 
@@ -3312,6 +3322,15 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Svar till %1$s på %2$s"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Du kan inte återkalla användarroller på denna webbplats."
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Användare utan matchande profil."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3324,7 +3343,9 @@ msgstr "Du kan inte flytta användare till sandlådan på denna webbplats."
 msgid "User is already sandboxed."
 msgstr "Användare är redan flyttad till sandlådan."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Sessioner"
 
@@ -3348,7 +3369,7 @@ msgstr "Sessionsfelsökning"
 msgid "Turn on debugging output for sessions."
 msgstr "Sätt på felsökningsutdata för sessioner."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Spara webbplatsinställningar"
@@ -3379,8 +3400,8 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Beskrivning"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Statistik"
 
@@ -3523,45 +3544,45 @@ msgstr "Alias"
 msgid "Group actions"
 msgstr "Åtgärder för grupp"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Flöde av notiser för %s grupp (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Flöde av notiser för %s grupp (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Flöde av notiser för %s grupp (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF för %s grupp"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Medlemmar"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ingen)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Alla medlemmar"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Skapad"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3576,7 +3597,7 @@ msgstr ""
 "sina liv och intressen. [Gå med nu](%%%%action.register%%%%) för att bli en "
 "del av denna grupp och många fler! ([Läs mer](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3589,7 +3610,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Dess medlemmar delar korta meddelande om "
 "sina liv och intressen. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Administratörer"
 
@@ -3710,147 +3731,138 @@ msgid "User is already silenced."
 msgstr "Användaren är redan nedtystad."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "Grundinställningar för din StatusNet-webbplats"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Webbplatsnamnet måste vara minst ett tecken långt."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Du måste ha en giltig e-postadress."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Okänt språk \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Ogiltig rapport-URL för ögonblicksbild"
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Ogiltigt körvärde för ögonblicksbild."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Frekvens för ögonblicksbilder måste vara ett nummer."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Minsta textbegränsning är 140 tecken."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr "Begränsning av duplikat måste vara en eller fler sekuner."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Allmänt"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Webbplatsnamn"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Namnet på din webbplats, t.ex.  \"Företagsnamn mikroblogg\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Tillhandahållen av"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Text som används för tillskrivningslänkar i sidfoten på varje sida."
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "Tillhandahållen av URL"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL som används för tillskrivningslänkar i sidfoten på varje sida"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Kontakte-postadress för din webbplats"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Lokal"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Standardtidszon"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Standardtidzon för denna webbplats; vanligtvis UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "Webbplatsens standardspråk"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Ögonblicksbild"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Slumpmässigt vid webbförfrågningar"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "I ett schemalagt jobb"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Ögonblicksbild av data"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "När statistikdata skall skickas till status.net-servrar"
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Frekvens"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Ögonblicksbild kommer skickas var N:te webbträff"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "URL för rapport"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Ögonblicksbild kommer skickat till denna URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Begränsningar"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Textbegränsning"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Maximala antalet tecken för notiser."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Duplikatbegränsning"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Hur länge användare måste vänta (i sekunder) för att posta samma sak igen."
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Webbplatsnotis"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Nytt meddelande"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Kunde inte spara dina utseendeinställningar."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Webbplatsnotis"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Webbplatsnotis"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Inställningar för SMS"
@@ -3950,6 +3962,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Ingen kod ifylld"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Ögonblicksbild"
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Ändra webbplatskonfiguration"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Ogiltigt körvärde för ögonblicksbild."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Frekvens för ögonblicksbilder måste vara ett nummer."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Ogiltig rapport-URL för ögonblicksbild"
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Slumpmässigt vid webbförfrågningar"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "I ett schemalagt jobb"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Ögonblicksbild av data"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "När statistikdata skall skickas till status.net-servrar"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Frekvens"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Ögonblicksbild kommer skickas var N:te webbträff"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "URL för rapport"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Ögonblicksbild kommer skickat till denna URL"
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Spara webbplatsinställningar"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Du är inte prenumerat hos den profilen."
@@ -4158,7 +4230,7 @@ msgstr "Ingen profil-ID i begäran."
 msgid "Unsubscribed"
 msgstr "Prenumeration avslutad"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4168,7 +4240,6 @@ msgstr ""
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Användare"
@@ -4363,17 +4434,23 @@ msgstr "%1$s grupper, sida %2$d"
 msgid "Search for more groups"
 msgstr "Sök efter fler grupper"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s är inte en medlem i någon grupp."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Prova att [söka efter grupper](%%action.groupsearch%%) och gå med i dem."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Uppdateringar från %1$s på %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4429,7 +4506,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Insticksmoduler"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Version"
 
@@ -4494,22 +4571,22 @@ msgstr "Kunde inte uppdatera meddelande med ny URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Databasfel vid infogning av hashtag: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Problem vid sparande av notis. För långt."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem vid sparande av notis. Okänd användare."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "För många notiser för snabbt; ta en vilopaus och posta igen om ett par "
 "minuter."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4517,19 +4594,19 @@ msgstr ""
 "För många duplicerade meddelanden för snabbt; ta en vilopaus och posta igen "
 "om ett par minuter."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Du är utestängd från att posta notiser på denna webbplats."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Problem med att spara notis."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Problem med att spara gruppinkorg."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4554,7 +4631,12 @@ msgstr "Inte prenumerant!"
 msgid "Couldn't delete self-subscription."
 msgstr "Kunde inte ta bort själv-prenumeration."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Kunde inte ta bort prenumeration."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Kunde inte ta bort prenumeration."
 
@@ -4563,19 +4645,19 @@ msgstr "Kunde inte ta bort prenumeration."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Välkommen till %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Kunde inte skapa grupp."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Kunde inte ställa in grupp-URI."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Kunde inte ställa in gruppmedlemskap."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Kunde inte spara lokal gruppinformation."
 
@@ -4616,194 +4698,170 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr "Namnlös sida"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Primär webbplatsnavigation"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personlig profil och vänners tidslinje"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Personligt"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Ändra din e-post, avatar, lösenord, profil"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Konto"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Anslut till tjänster"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Anslut"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Ändra webbplatskonfiguration"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Administratör"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Bjud in vänner och kollegor att gå med dig på %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Bjud in"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logga ut från webbplatsen"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Logga ut"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Skapa ett konto"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Registrera"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Logga in på webbplatsen"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Logga in"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjälp mig!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hjälp"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Sök efter personer eller text"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Sök"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Webbplatsnotis"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Lokala vyer"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Sidnotis"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Sekundär webbplatsnavigation"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hjälp"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "Frågor & svar"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Användarvillkor"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Sekretess"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Källa"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Emblem"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Programvarulicens för StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4812,12 +4870,12 @@ msgstr ""
 "**%%site.name%%** är en mikrobloggtjänst tillhandahållen av [%%site.broughtby"
 "%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** är en mikrobloggtjänst. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4828,54 +4886,54 @@ msgstr ""
 "version %s, tillgänglig under [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Licens för webbplatsinnehåll"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Innehåll och data av %1$s är privat och konfidensiell."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr "Innehåll och data copyright av %1$s. Alla rättigheter reserverade."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Innehåll och data copyright av medarbetare. Alla rättigheter reserverade."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Alla "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "licens."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Numrering av sidor"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Senare"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Tidigare"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Kan inte hantera fjärrinnehåll ännu."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Kan inte hantera inbäddat XML-innehåll ännu."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Kan inte hantera inbäddat Base64-innehåll ännu."
 
@@ -4890,91 +4948,78 @@ msgid "Changes to that panel are not allowed."
 msgstr "Ändringar av den panelen tillåts inte."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() är inte implementerat."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSetting() är inte implementerat."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Kunde inte ta bort utseendeinställning."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Grundläggande webbplatskonfiguration"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Webbplats"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Konfiguration av utseende"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Utseende"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Konfiguration av användare"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Användare"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Konfiguration av åtkomst"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Åtkomst"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Konfiguration av sökvägar"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Sökvägar"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Konfiguration av sessioner"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Sessioner"
+msgid "Edit site notice"
+msgstr "Webbplatsnotis"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Konfiguration av sökvägar"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5165,12 +5210,12 @@ msgstr "%s lämnade grupp %s"
 msgid "Fullname: %s"
 msgstr "Fullständigt namn: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Plats: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Hemsida: %s"
@@ -5503,6 +5548,11 @@ msgstr "Välj en tagg för att begränsa lista"
 msgid "Go"
 msgstr "Gå"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL till gruppen eller ämnets hemsida eller blogg"
@@ -5638,11 +5688,11 @@ msgstr "Logga in med ett användarnamn och lösenord"
 msgid "Sign up for a new account"
 msgstr "Registrera dig för ett nytt konto"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "E-postadressbekräftelse"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5671,12 +5721,12 @@ msgstr ""
 "Tack för din tid,  \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s lyssnar nu på dina notiser på %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5701,17 +5751,17 @@ msgstr ""
 "----\n"
 "Ändra din e-postadress eller notiferingsinställningar på %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Biografi: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Ny e-postadress för att skicka till %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5732,21 +5782,21 @@ msgstr ""
 "Med vänliga hälsningar,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s status"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS-bekräftelse"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Du har blivit knuffad av %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5773,12 +5823,12 @@ msgstr ""
 "Med vänliga hälsningar,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Nytt privat meddelande från %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5811,12 +5861,12 @@ msgstr ""
 "Med vänliga hälsningar,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) lade till din notis som en favorit"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5853,12 +5903,12 @@ msgstr ""
 "Med vänliga hälsningar,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) skickade en notis för din uppmärksamhet"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6117,10 +6167,6 @@ msgstr "Svar"
 msgid "Favorites"
 msgstr "Favoriter"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Användare"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Inkorg"
@@ -6146,7 +6192,7 @@ msgstr "Taggar i %ss notiser"
 msgid "Unknown"
 msgstr "Okänd"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Prenumerationer"
 
@@ -6154,23 +6200,23 @@ msgstr "Prenumerationer"
 msgid "All subscriptions"
 msgstr "Alla prenumerationer"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Prenumeranter"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Alla prenumeranter"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "Användar-ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Medlem sedan"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Alla grupper"
 
@@ -6210,7 +6256,12 @@ msgstr "Upprepa denna notis?"
 msgid "Repeat this notice"
 msgstr "Upprepa denna notis"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Blockera denna användare från denna grupp"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Ingen enskild användare definierad för enanvändarläge."
 
@@ -6364,47 +6415,64 @@ msgstr "Meddelande"
 msgid "Moderate"
 msgstr "Moderera"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Användarprofil"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administratörer"
+
+#: lib/userprofile.php:355
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderera"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "ett par sekunder sedan"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "för nån minut sedan"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "för %d minuter sedan"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "för en timma sedan"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "för %d timmar sedan"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "för en dag sedan"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "för %d dagar sedan"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "för en månad sedan"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "för %d månader sedan"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "för ett år sedan"
 
index f0527f3fa983c6229a8b0f61c9995d17ae257960..c8a2f5c1ad42e3ef7c2fd855f921b5da2beb09ec 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:50+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:01+0000\n"
 "Language-Team: Telugu\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: te\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "అంగీకరించు"
@@ -105,7 +106,7 @@ msgstr "అటువంటి పేజీ లేదు"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -121,7 +122,7 @@ msgstr "%1$s మరియు మిత్రులు, పేజీ %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -176,7 +177,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "మీరు మరియు మీ స్నేహితులు"
 
@@ -203,11 +204,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "నిర్ధారణ సంకేతం కనబడలేదు."
@@ -569,7 +570,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "ఖాతా"
 
@@ -656,18 +657,6 @@ msgstr ""
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s యొక్క మైక్రోబ్లాగు"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s కాలరేఖ"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -678,12 +667,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s బహిరంగ కాలరేఖ"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "అందరి నుండి %s తాజాకరణలు!"
@@ -703,7 +692,7 @@ msgstr "%s యొక్క పునరావృతాలు"
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
@@ -744,7 +733,7 @@ msgstr "మీ వ్యక్తిగత అవతారాన్ని మీ
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -929,7 +918,7 @@ msgid "Conversation"
 msgstr "సంభాషణ"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "సందేశాలు"
 
@@ -948,7 +937,7 @@ msgstr "మీరు ఈ ఉపకరణం యొక్క యజమాని 
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1139,8 +1128,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1260,7 +1250,7 @@ msgstr "వివరణ చాలా పెద్దదిగా ఉంది (1
 msgid "Could not update group."
 msgstr "గుంపుని తాజాకరించలేకున్నాం."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "మారుపేర్లని సృష్టించలేకపోయాం."
 
@@ -1380,7 +1370,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "సరైన ఈమెయిల్ చిరునామా కాదు:"
 
@@ -1565,6 +1555,25 @@ msgstr "అటువంటి ఫైలు లేదు."
 msgid "Cannot read file."
 msgstr "ఫైలుని చదవలేకపోతున్నాం."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "తప్పుడు పరిమాణం."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "వాడుకరిని ఇప్పటికే గుంపునుండి నిరోధించారు."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1710,12 +1719,18 @@ msgstr "నిర్వాహకున్ని చేయి"
 msgid "Make this user an admin"
 msgstr "ఈ వాడుకరిని నిర్వాహకున్ని చేయి"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s కాలరేఖ"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "గుంపులు"
@@ -2285,8 +2300,8 @@ msgstr "విషయ రకం "
 msgid "Only "
 msgstr "మాత్రమే "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2430,7 +2445,8 @@ msgstr "కొత్త సంకేతపదాన్ని భద్రపర
 msgid "Password saved."
 msgstr "సంకేతపదం భద్రమయ్యింది."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2553,7 +2569,7 @@ msgstr "నేపథ్యాల సంచయం"
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "వైదొలగు"
@@ -2611,11 +2627,11 @@ msgstr "సరైన ఈమెయిల్ చిరునామా కాదు
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "సందేశపు విషయం సరైనది కాదు"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2693,7 +2709,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "భాష"
 
@@ -2719,7 +2735,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "స్వపరిచయం చాలా పెద్దగా ఉంది (%d అక్షరాలు గరిష్ఠం)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "కాలమండలాన్ని ఎంచుకోలేదు."
 
@@ -3025,7 +3041,7 @@ msgid "Same as password above. Required."
 msgstr "పై సంకేతపదం మరోసారి. తప్పనిసరి."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "ఈమెయిల్"
 
@@ -3122,7 +3138,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "చందాచేరు"
 
@@ -3225,6 +3241,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "%sకి స్పందనలు"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "వాడుకరికి ప్రొఫైలు లేదు."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "స్టేటస్‌నెట్"
@@ -3239,7 +3265,9 @@ msgstr "మీరు ఇప్పటికే లోనికి ప్రవే
 msgid "User is already sandboxed."
 msgstr "వాడుకరిని ఇప్పటికే గుంపునుండి నిరోధించారు."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3264,7 +3292,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "సైటు అమరికలను భద్రపరచు"
@@ -3296,8 +3324,8 @@ msgstr "సంస్ధ"
 msgid "Description"
 msgstr "వివరణ"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "గణాంకాలు"
 
@@ -3431,45 +3459,45 @@ msgstr "మారుపేర్లు"
 msgid "Group actions"
 msgstr "గుంపు చర్యలు"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s గుంపు"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "సభ్యులు"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(ఏమీలేదు)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "అందరు సభ్యులూ"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "సృష్టితం"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3479,7 +3507,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3488,7 +3516,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "నిర్వాహకులు"
 
@@ -3600,147 +3628,138 @@ msgid "User is already silenced."
 msgstr "వాడుకరిని ఇప్పటికే గుంపునుండి నిరోధించారు."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+#, fuzzy
+msgid "Basic settings for this StatusNet site"
 msgstr "ఈ స్టేటస్&zwnj;నెట్ సైటుకి ప్రాధమిక అమరికలు."
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "సైటు పేరు తప్పనిసరిగా సున్నా కంటే ఎక్కువ పొడవుండాలి."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "మీకు సరైన సంప్రదింపు ఈమెయిలు చిరునామా ఉండాలి."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "గుర్తు తెలియని భాష \"%s\"."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "కనిష్ఠ పాఠ్య పరిమితి 140 అక్షరాలు."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "సాధారణ"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "సైటు పేరు"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "మీ సైటు యొక్క పేరు, ఇలా \"మీకంపెనీ మైక్రోబ్లాగు\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "ఈ వాడుకరికై నమోదైన ఈమెయిల్ చిరునామాలు ఏమీ లేవు."
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "స్థానిక"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "అప్రమేయ కాలమండలం"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
+#: actions/siteadminpanel.php:262
+#, fuzzy
+msgid "Default language"
 msgstr "అప్రమేయ సైటు భాష"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr ""
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr ""
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr ""
-
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "తరచుదనం"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr ""
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "పరిమితులు"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "పాఠ్యపు పరిమితి"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "సందేశాలలోని అక్షరాల గరిష్ఠ సంఖ్య."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "సైటు గమనిక"
+
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "కొత్త సందేశం"
+
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "సైటు గమనిక"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr ""
+
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "సైటు గమనిక"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "SMS అమరికలు"
@@ -3835,6 +3854,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "చందాలు"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "తరచుదనం"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "సైటు అమరికలను భద్రపరచు"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -4036,7 +4115,7 @@ msgstr ""
 msgid "Unsubscribed"
 msgstr "చందాదార్లు"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4228,16 +4307,22 @@ msgstr "%1$s గుంపు సభ్యులు, పేజీ %2$d"
 msgid "Search for more groups"
 msgstr "మరిన్ని గుంపులకై వెతుకు"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s ఏ గుంపు లోనూ సభ్యులు కాదు."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr "[గుంపులని వెతికి](%%action.groupsearch%%) వాటిలో చేరడానికి ప్రయత్నించండి."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4281,7 +4366,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "సంచిక"
 
@@ -4345,41 +4430,41 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "ఈ సైటులో నోటీసులు రాయడం నుండి మిమ్మల్ని నిషేధించారు."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4406,7 +4491,12 @@ msgstr "చందాదార్లు"
 msgid "Couldn't delete self-subscription."
 msgstr "చందాని తొలగించలేకపోయాం."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "చందాని తొలగించలేకపోయాం."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "చందాని తొలగించలేకపోయాం."
 
@@ -4415,20 +4505,20 @@ msgstr "చందాని తొలగించలేకపోయాం."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "@%2$s, %1$sకి స్వాగతం!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "గుంపుని సృష్టించలేకపోయాం."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "చందాని సృష్టించలేకపోయాం."
@@ -4471,194 +4561,187 @@ msgstr "%1$s - %2$s"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "వ్యక్తిగత"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "మీ ఈమెయిలు, అవతారం, సంకేతపదం మరియు ప్రౌఫైళ్ళను మార్చుకోండి"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "ఖాతా"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "అనుసంధానాలు"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "అనుసంధానించు"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "చందాలు"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "నిర్వాహకులు"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "ఈ ఫారాన్ని ఉపయోగించి మీ స్నేహితులను మరియు సహోద్యోగులను ఈ సేవను వినియోగించుకోమని ఆహ్వానించండి."
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "ఆహ్వానించు"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "సైటు నుండి నిష్క్రమించు"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "నిష్క్రమించు"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "కొత్త ఖాతా సృష్టించు"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "నమోదు"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "సైటులోని ప్రవేశించు"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "ప్రవేశించండి"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "సహాయం కావాలి!"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "సహాయం"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "మరిన్ని గుంపులకై వెతుకు"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "వెతుకు"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "సైటు గమనిక"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "స్థానిక వీక్షణలు"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "పేజీ గమనిక"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "చందాలు"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "సహాయం"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "గురించి"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "ప్రశ్నలు"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "సేవా నియమాలు"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "అంతరంగికత"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "మూలము"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "సంప్రదించు"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "బాడ్జి"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "స్టేటస్‌నెట్ మృదూపకరణ లైసెన్సు"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4667,12 +4750,12 @@ msgstr ""
 "**%%site.name%%** అనేది [%%site.broughtby%%](%%site.broughtbyurl%%) వారు "
 "అందిస్తున్న మైక్రో బ్లాగింగు సదుపాయం. "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** అనేది మైక్రో బ్లాగింగు సదుపాయం."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4683,54 +4766,54 @@ msgstr ""
 "html) కింద లభ్యమయ్యే [స్టేటస్&zwnj;నెట్](http://status.net/) మైక్రోబ్లాగింగ్ ఉపకరణం సంచిక %s "
 "పై నడుస్తుంది."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "కొత్త సందేశం"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "అన్నీ "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "పేజీకరణ"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "తర్వాత"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "ఇంతక్రితం"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4745,93 +4828,83 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "ప్రాథమిక సైటు స్వరూపణం"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "సైటు"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "రూపకల్పన స్వరూపణం"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "రూపురేఖలు"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "వాడుకరి స్వరూపణం"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "వాడుకరి"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS నిర్ధారణ"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "అంగీకరించు"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS నిర్ధారణ"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "రూపకల్పన స్వరూపణం"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "సంచిక"
+msgid "Edit site notice"
+msgstr "సైటు గమనిక"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS నిర్ధారణ"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5026,12 +5099,12 @@ msgstr "%2$s గుంపు నుండి %1$s వైదొలిగారు
 msgid "Fullname: %s"
 msgstr "పూర్తిపేరు: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "ప్రాంతం: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "హోంపేజీ: %s"
@@ -5327,6 +5400,11 @@ msgstr ""
 msgid "Go"
 msgstr "వెళ్ళు"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5467,11 +5545,11 @@ msgstr "వాడుకరిపేరు మరియు సంకేతపద
 msgid "Sign up for a new account"
 msgstr "కొత్త ఖాతా సృష్టించుకోండి"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "ఈమెయిల్ చిరునామా నిర్ధారణ"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5488,12 +5566,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s ఇప్పుడు %2$sలో మీ నోటీసులని వింటున్నారు."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5518,17 +5596,17 @@ msgstr ""
 "----\n"
 "మీ ఈమెయిలు చిరునామాని లేదా గమనింపుల ఎంపికలను %8$s వద్ద మార్చుకోండి\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "స్వపరిచయం: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5541,21 +5619,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s స్థితి"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS నిర్ధారణ"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5571,12 +5649,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "%s నుండి కొత్త అంతరంగిక సందేశం"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5595,12 +5673,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr ""
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5621,12 +5699,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) మీకు ఒక నోటీసుని పంపించారు"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5884,10 +5962,6 @@ msgstr "స్పందనలు"
 msgid "Favorites"
 msgstr "ఇష్టాంశాలు"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "వాడుకరి"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "వచ్చినవి"
@@ -5913,7 +5987,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "చందాలు"
 
@@ -5921,23 +5995,23 @@ msgstr "చందాలు"
 msgid "All subscriptions"
 msgstr "అన్ని చందాలు"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "చందాదార్లు"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "అందరు చందాదార్లు"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "వాడుకరి ID"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "సభ్యులైన తేదీ"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "అన్ని గుంపులు"
 
@@ -5978,7 +6052,12 @@ msgstr "ఈ నోటీసుని పునరావృతించాలా?
 msgid "Repeat this notice"
 msgstr "ఈ నోటీసుని పునరావృతించు"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "ఈ గుంపునుండి ఈ వాడుకరిని నిరోధించు"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6138,47 +6217,63 @@ msgstr "సందేశం"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "వాడుకరి ప్రొఫైలు"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "నిర్వాహకులు"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "కొన్ని క్షణాల క్రితం"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "ఓ నిమిషం క్రితం"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d నిమిషాల క్రితం"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "ఒక గంట క్రితం"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d గంటల క్రితం"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "ఓ రోజు క్రితం"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "%d రోజుల క్రితం"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "ఓ నెల క్రితం"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "%d నెలల క్రితం"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "ఒక సంవత్సరం క్రితం"
 
index 71aaa68132161073fb6d54e31400c0e9a47720a9..805e552688f1a4f9c3a3d7ae182b5a59c77bf120 100644 (file)
@@ -9,19 +9,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:53+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:04+0000\n"
 "Language-Team: Turkish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: tr\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Kabul et"
@@ -108,7 +109,7 @@ msgstr "Böyle bir durum mesajı yok."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -124,7 +125,7 @@ msgstr "%s ve arkadaşları"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -179,7 +180,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s ve arkadaşları"
@@ -207,11 +208,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Onay kodu bulunamadı."
@@ -583,7 +584,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "Hakkında"
@@ -676,18 +677,6 @@ msgstr "%1$s'in %2$s'deki durum mesajları "
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s adli kullanicinin durum mesajlari"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -698,12 +687,12 @@ msgstr "%1$s'in %2$s'deki durum mesajları "
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -723,7 +712,7 @@ msgstr "%s için cevaplar"
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%s adli kullanicinin durum mesajlari"
@@ -765,7 +754,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -959,7 +948,7 @@ msgid "Conversation"
 msgstr "Yer"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Durum mesajları"
 
@@ -981,7 +970,7 @@ msgstr "Bize o profili yollamadınız"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1185,8 +1174,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1311,7 +1301,7 @@ msgstr "Hakkında bölümü çok uzun (azm 140 karakter)."
 msgid "Could not update group."
 msgstr "Kullanıcı güncellenemedi."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Avatar bilgisi kaydedilemedi"
@@ -1435,7 +1425,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Geçersiz bir eposta adresi."
 
@@ -1628,6 +1618,25 @@ msgstr "Böyle bir durum mesajı yok."
 msgid "Cannot read file."
 msgstr "Böyle bir durum mesajı yok."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Geçersiz büyüklük."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Bize o profili yollamadınız"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Kullanıcının profili yok."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1779,12 +1788,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%s adli kullanicinin durum mesajlari"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr ""
@@ -2371,8 +2386,8 @@ msgstr "Bağlan"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2520,7 +2535,8 @@ msgstr "Yeni parola kaydedilemedi."
 msgid "Password saved."
 msgstr "Parola kaydedildi."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2645,7 +2661,7 @@ msgstr ""
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Geri al"
@@ -2705,11 +2721,11 @@ msgstr "Geçersiz bir eposta adresi."
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "%s adli kullanicinin durum mesajlari"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Geçersiz durum mesajı"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2792,7 +2808,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr ""
 
@@ -2818,7 +2834,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Hakkında bölümü çok uzun (azm 140 karakter)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3125,7 +3141,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Eposta"
 
@@ -3214,7 +3230,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Abone ol"
 
@@ -3316,6 +3332,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "%s için cevaplar"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Bize o profili yollamadınız"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Kullanıcının profili yok."
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3331,7 +3357,9 @@ msgstr "Bize o profili yollamadınız"
 msgid "User is already sandboxed."
 msgstr "Kullanıcının profili yok."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3355,7 +3383,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3391,8 +3419,8 @@ msgstr "Yer"
 msgid "Description"
 msgstr "Abonelikler"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "İstatistikler"
 
@@ -3526,47 +3554,47 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Üyelik başlangıcı"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Yarat"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3576,7 +3604,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3585,7 +3613,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3697,149 +3725,137 @@ msgid "User is already silenced."
 msgstr "Kullanıcının profili yok."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Geçersiz bir eposta adresi."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Yeni durum mesajı"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Kullanıcı için kaydedilmiş eposta adresi yok."
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Yer"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Yeni durum mesajı"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Yeni durum mesajı"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Yeni durum mesajı"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3936,6 +3952,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Abonelikler"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Ayarlar"
+
 #: actions/subedit.php:70
 #, fuzzy
 msgid "You are not subscribed to that profile."
@@ -4144,7 +4220,7 @@ msgstr "Yetkilendirme isteği yok!"
 msgid "Unsubscribed"
 msgstr "Aboneliği sonlandır"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4344,16 +4420,22 @@ msgstr "Bütün abonelikler"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Bize o profili yollamadınız"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4397,7 +4479,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Kişisel"
@@ -4465,41 +4547,41 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4527,7 +4609,12 @@ msgstr "Bu kullanıcıyı zaten takip etmiyorsunuz!"
 msgid "Couldn't delete self-subscription."
 msgstr "Abonelik silinemedi."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Abonelik silinemedi."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Abonelik silinemedi."
 
@@ -4536,22 +4623,22 @@ msgstr "Abonelik silinemedi."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "Avatar bilgisi kaydedilemedi"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Abonelik oluşturulamadı."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Abonelik oluşturulamadı."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Abonelik oluşturulamadı."
@@ -4595,192 +4682,185 @@ msgstr "%1$s'in %2$s'deki durum mesajları "
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Kişisel"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Parolayı değiştir"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Hakkında"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Sunucuya yönlendirme yapılamadı: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Bağlan"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Abonelikler"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Geçersiz büyüklük."
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Çıkış"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Yeni hesap oluştur"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Kayıt"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Giriş"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Yardım"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Yardım"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Ara"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Abonelikler"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Yardım"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Hakkında"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "SSS"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Gizlilik"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Kaynak"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "İletişim"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4789,12 +4869,12 @@ msgstr ""
 "**%%site.name%%** [%%site.broughtby%%](%%site.broughtbyurl%%)\" tarafından "
 "hazırlanan anında mesajlaşma ağıdır. "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** bir aninda mesajlaşma sosyal ağıdır."
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4805,56 +4885,56 @@ msgstr ""
 "licenses/agpl-3.0.html) lisansı ile korunan [StatusNet](http://status.net/) "
 "microbloglama yazılımının %s. versiyonunu kullanmaktadır."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "« Sonra"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "Önce »"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4869,95 +4949,86 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Eposta adresi onayı"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Yeni durum mesajı"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "Eposta adresi onayı"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Kişisel"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Eposta adresi onayı"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Eposta adresi onayı"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Kabul et"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Eposta adresi onayı"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Eposta adresi onayı"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Kişisel"
+msgid "Edit site notice"
+msgstr "Yeni durum mesajı"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Eposta adresi onayı"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5153,12 +5224,12 @@ msgstr "%1$s'in %2$s'deki durum mesajları "
 msgid "Fullname: %s"
 msgstr "Tam İsim"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5461,6 +5532,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5608,11 +5684,11 @@ msgstr "Geçersiz kullanıcı adı veya parola."
 msgid "Sign up for a new account"
 msgstr "Yeni hesap oluştur"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Eposta adresi onayı"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5629,12 +5705,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s %2$s'da durumunuzu takip ediyor"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5655,17 +5731,17 @@ msgstr ""
 "Kendisini durumsuz bırakmayın!,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "Hakkında"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5678,21 +5754,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s durum"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5708,12 +5784,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5732,12 +5808,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%1$s %2$s'da durumunuzu takip ediyor"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5758,12 +5834,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6013,10 +6089,6 @@ msgstr "Cevaplar"
 msgid "Favorites"
 msgstr ""
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -6042,7 +6114,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Abonelikler"
 
@@ -6050,24 +6122,24 @@ msgstr "Abonelikler"
 msgid "All subscriptions"
 msgstr "Bütün abonelikler"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Abone olanlar"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "Abone olanlar"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Üyelik başlangıcı"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -6111,7 +6183,12 @@ msgstr "Böyle bir durum mesajı yok."
 msgid "Repeat this notice"
 msgstr "Böyle bir durum mesajı yok."
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Böyle bir kullanıcı yok."
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6274,47 +6351,62 @@ msgstr ""
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Kullanıcının profili yok."
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "birkaç saniye önce"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "yaklaşık bir dakika önce"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "yaklaşık %d dakika önce"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "yaklaşık bir saat önce"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "yaklaşık %d saat önce"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "yaklaşık bir gün önce"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "yaklaşık %d gün önce"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "yaklaşık bir ay önce"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "yaklaşık %d ay önce"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "yaklaşık bir yıl önce"
 
index fd168ba50c824d96b3dee0c34b4db390d74e0f79..78aa5dc23586b03b0d7b643acf0df9c8feb37b7e 100644 (file)
@@ -10,12 +10,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:56+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:07+0000\n"
 "Language-Team: Ukrainian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: uk\n"
 "X-Message-Group: out-statusnet\n"
@@ -23,7 +23,8 @@ msgstr ""
 "10< =4 && (n%100<10 or n%100>=20) ? 1 : 2);\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 msgid "Access"
 msgstr "Погодитись"
 
@@ -46,7 +47,6 @@ msgstr ""
 
 #. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgctxt "LABEL"
 msgid "Private"
 msgstr "Приватно"
@@ -77,7 +77,6 @@ msgid "Save access settings"
 msgstr "Зберегти параметри доступу"
 
 #: actions/accessadminpanel.php:203
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Save"
 msgstr "Зберегти"
@@ -106,7 +105,7 @@ msgstr "Немає такої сторінки"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -122,7 +121,7 @@ msgstr "%1$s та друзі, сторінка %2$d"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -183,7 +182,7 @@ msgstr ""
 "«розштовхати» %s або щось йому написати."
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 msgid "You and friends"
 msgstr "Ви з друзями"
 
@@ -210,11 +209,11 @@ msgstr "Оновлення від %1$s та друзів на %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API метод не знайдено."
 
@@ -579,7 +578,7 @@ msgstr ""
 "на доступ до Вашого акаунту %4$s лише тим стороннім додаткам, яким Ви "
 "довіряєте."
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "Акаунт"
 
@@ -623,11 +622,11 @@ msgstr "Такого допису немає."
 
 #: actions/apistatusesretweet.php:83
 msgid "Cannot repeat your own notice."
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð²Ñ\82оÑ\80Ñ\83ваÑ\82и Ð\92аÑ\88омÑ\83 Ð²Ð»Ð°Ñ\81номÑ\83 Ð´Ð¾Ð¿Ð¸Ñ\81Ñ\83."
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82и Ð\92аÑ\88 Ð²Ð»Ð°Ñ\81ний Ð´Ð¾Ð¿Ð¸Ñ\81."
 
 #: actions/apistatusesretweet.php:91
 msgid "Already repeated that notice."
-msgstr "Цьому допису вже вторували."
+msgstr "Цей допис вже повторено."
 
 #: actions/apistatusesshow.php:138
 msgid "Status deleted."
@@ -668,18 +667,6 @@ msgstr "%1$s / Обрані від %2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%1$s оновлення обраних від %2$s / %2$s."
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s стрічка"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "Оновлення від %1$s на %2$s!"
-
 #: actions/apitimelinementions.php:117
 #, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -690,12 +677,12 @@ msgstr "%1$s / Оновленні відповіді %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "%1$s оновив цю відповідь на допис від %2$s / %3$s."
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s загальна стрічка"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s оновлення від усіх!"
@@ -703,19 +690,19 @@ msgstr "%s оновлення від усіх!"
 #: actions/apitimelineretweetedtome.php:111
 #, php-format
 msgid "Repeated to %s"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83ваннÑ\8f Ð·Ð° %s"
+msgstr "Ð\9fовÑ\82оÑ\80ено Ð´Ð»Ñ\8f %s"
 
 #: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83вання %s"
+msgstr "Ð\9fовÑ\82оÑ\80ення %s"
 
 #: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Дописи позначені з %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Оновлення позначені з %1$s на %2$s!"
@@ -755,7 +742,7 @@ msgstr "Ви можете завантажити аватару. Максима
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "Користувач з невідповідним профілем"
 
@@ -941,7 +928,7 @@ msgid "Conversation"
 msgstr "Розмова"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Дописи"
 
@@ -960,7 +947,7 @@ msgstr "Ви не є власником цього додатку."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr "Виникли певні проблеми з токеном поточної сесії."
 
@@ -1154,8 +1141,9 @@ msgstr "Повернутись до початкових налаштувань"
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1271,7 +1259,7 @@ msgstr "опис надто довгий (%d знаків максимум)."
 msgid "Could not update group."
 msgstr "Не вдалося оновити групу."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 msgid "Could not create aliases."
 msgstr "Неможна призначити додаткові імена."
 
@@ -1393,7 +1381,7 @@ msgid "Cannot normalize that email address"
 msgstr "Не можна полагодити цю поштову адресу"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Це недійсна електронна адреса."
 
@@ -1584,6 +1572,22 @@ msgstr "Такого файлу немає."
 msgid "Cannot read file."
 msgstr "Не можу прочитати файл."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+msgid "Invalid role."
+msgstr "Невірна роль."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr "Цю роль вже зарезервовано і не може бути встановлено."
+
+#: actions/grantrole.php:75
+msgid "You cannot grant user roles on this site."
+msgstr "Ви не можете надавати користувачеві жодних ролей на цьому сайті."
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr "Користувач вже має цю роль."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1731,12 +1735,18 @@ msgstr "Зробити адміном"
 msgid "Make this user an admin"
 msgstr "Надати цьому користувачеві права адміністратора"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s стрічка"
+
 #: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Оновлення членів %1$s на %2$s!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "Групи"
@@ -1999,7 +2009,6 @@ msgstr "Можна додати персональне повідомлення
 
 #. TRANS: Send button for inviting friends
 #: actions/invite.php:198
-#, fuzzy
 msgctxt "BUTTON"
 msgid "Send"
 msgstr "Надіслати"
@@ -2361,8 +2370,8 @@ msgstr "тип змісту "
 msgid "Only "
 msgstr "Лише "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Такий формат даних не підтримується."
 
@@ -2503,7 +2512,8 @@ msgstr "Неможна зберегти новий пароль."
 msgid "Password saved."
 msgstr "Пароль збережено."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr "Шлях"
 
@@ -2623,7 +2633,7 @@ msgstr "Директорія фонів"
 msgid "SSL"
 msgstr "SSL-шифрування"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr "Ніколи"
 
@@ -2679,11 +2689,11 @@ msgstr "Це недійсний особистий теґ: %s"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Користувачі з особистим теґом %1$s — сторінка %2$d"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Недійсний зміст допису"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Ліцензія допису «%1$s» є несумісною з ліцензією сайту «%2$s»."
@@ -2763,7 +2773,7 @@ msgstr ""
 "Позначте себе теґами (літери, цифри, -, . та _), відокремлюючи кожен комою "
 "або пробілом"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Мова"
 
@@ -2790,7 +2800,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "Ви перевищили ліміт (%d знаків максимум)."
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "Часовий пояс не обрано."
 
@@ -3111,7 +3121,7 @@ msgid "Same as password above. Required."
 msgstr "Такий само, як і пароль вище. Неодмінно."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Пошта"
 
@@ -3216,7 +3226,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL-адреса Вашого профілю на іншому сумісному сервісі"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Підписатись"
 
@@ -3239,7 +3249,7 @@ msgstr "Не вдалося отримати токен запиту."
 
 #: actions/repeat.php:57
 msgid "Only logged-in users can repeat notices."
-msgstr "Ð\9bиÑ\88е ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96, Ñ\89о Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ñ\81иÑ\81Ñ\82емÑ\96, Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð²Ñ\82оÑ\80Ñ\83ваÑ\82и Ð´Ð¾Ð¿Ð¸Ñ\81ам."
+msgstr "Ð\9bиÑ\88е ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96, Ñ\89о Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8cÑ\81Ñ\8f Ñ\83 Ñ\81иÑ\81Ñ\82емÑ\96, Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\8eваÑ\82и Ð´Ð¾Ð¿Ð¸Ñ\81и."
 
 #: actions/repeat.php:64 actions/repeat.php:71
 msgid "No notice specified."
@@ -3247,19 +3257,19 @@ msgstr "Зазначеного допису немає."
 
 #: actions/repeat.php:76
 msgid "You can't repeat your own notice."
-msgstr "Ð\92и Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð²Ñ\82оÑ\80Ñ\83ваÑ\82и Ñ\81воÑ\97м Ð²Ð»Ð°Ñ\81ним Ð´Ð¾Ð¿Ð¸Ñ\81ам."
+msgstr "Ð\92и Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\8eваÑ\82и Ñ\81воÑ\97 Ð²Ð»Ð°Ñ\81нÑ\96 Ð´Ð¾Ð¿Ð¸Ñ\81и."
 
 #: actions/repeat.php:90
 msgid "You already repeated that notice."
-msgstr "Ð\92и Ð²Ð¶Ðµ Ð²Ñ\82оÑ\80Ñ\83вали Ñ\86Ñ\8cомÑ\83 Ð´Ð¾Ð¿Ð¸Ñ\81Ñ\83."
+msgstr "Ð\92и Ð²Ð¶Ðµ Ð¿Ð¾Ð²Ñ\82оÑ\80или Ñ\86ей Ð´Ð¾Ð¿Ð¸Ñ\81."
 
 #: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83ваннÑ\8f"
+msgstr "Ð\9fовÑ\82оÑ\80ено"
 
 #: actions/repeat.php:119
 msgid "Repeated!"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83ваÑ\82и!"
+msgstr "Ð\9fовÑ\82оÑ\80ено!"
 
 #: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
@@ -3319,6 +3329,14 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "Відповіді до %1$s на %2$s!"
 
+#: actions/revokerole.php:75
+msgid "You cannot revoke user roles on this site."
+msgstr "Ви не можете позбавляти користувачів ролей на цьому сайті."
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr "Користувач не має цієї ролі."
+
 #: actions/rsd.php:146 actions/version.php:157
 msgid "StatusNet"
 msgstr "StatusNet"
@@ -3331,7 +3349,9 @@ msgstr "Ви не можете нікого ізолювати на цьому 
 msgid "User is already sandboxed."
 msgstr "Користувача ізольовано доки набереться уму-розуму."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr "Сесії"
 
@@ -3355,7 +3375,7 @@ msgstr "Сесія наладки"
 msgid "Turn on debugging output for sessions."
 msgstr "Виводити дані сесії наладки."
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Зберегти налаштування сайту"
@@ -3386,8 +3406,8 @@ msgstr "Організація"
 msgid "Description"
 msgstr "Опис"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Статистика"
 
@@ -3529,45 +3549,45 @@ msgstr "Додаткові імена"
 msgid "Group actions"
 msgstr "Діяльність групи"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Стрічка дописів групи %s (RSS 1.0)"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Стрічка дописів групи %s (RSS 2.0)"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Стрічка дописів групи %s (Atom)"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF для групи %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Учасники"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Пусто)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "Всі учасники"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 msgid "Created"
 msgstr "Створено"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3582,7 +3602,7 @@ msgstr ""
 "короткі дописи про своє життя та інтереси. [Приєднуйтесь](%%action.register%"
 "%) зараз і долучіться до спілкування! ([Дізнатися більше](%%doc.help%%))"
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3595,7 +3615,7 @@ msgstr ""
 "забезпеченні [StatusNet](http://status.net/). Члени цієї групи роблять "
 "короткі дописи про своє життя та інтереси. "
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr "Адміни"
 
@@ -3706,7 +3726,7 @@ msgstr ""
 #: actions/showstream.php:305
 #, php-format
 msgid "Repeat of %s"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83ваннÑ\8f %s"
+msgstr "Ð\9fовÑ\82оÑ\80еннÑ\8f Ð·Ð° %s"
 
 #: actions/silence.php:65 actions/unsilence.php:65
 msgid "You cannot silence users on this site."
@@ -3717,150 +3737,136 @@ msgid "User is already silenced."
 msgstr "Користувачу наразі заклеїли рота скотчем."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
-msgstr "Ð\97агалÑ\8cнÑ\96 Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f Ñ\86Ñ\8cого Ñ\81айÑ\82Ñ\83 StatusNet."
+msgid "Basic settings for this StatusNet site"
+msgstr "Ð\9eÑ\81новнÑ\96 Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f Ñ\86Ñ\8cого Ñ\81айÑ\82Ñ\83 StatusNet"
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr "Ім’я сайту не може бути порожнім."
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 msgid "You must have a valid contact email address."
 msgstr "Електронна адреса має бути чинною."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Невідома мова «%s»."
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr "Помилковий снепшот URL."
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr "Помилкове значення снепшоту."
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr "Частота повторення снепшотів має містити цифру."
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr "Ліміт текстових повідомлень становить 140 знаків."
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 "Часове обмеження при надсиланні дублікату повідомлення має становити від 1 і "
 "більше секунд."
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr "Основні"
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 msgid "Site name"
 msgstr "Назва сайту"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr "Назва Вашого сайту, штибу \"Мікроблоґи компанії ...\""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr "Надано"
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr "Текст використаний для посілань кредитів унизу кожної сторінки"
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr "Наданий URL"
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr "URL використаний для посілань кредитів унизу кожної сторінки"
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 msgid "Contact email address for your site"
 msgstr "Контактна електронна адреса для Вашого сайту"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 msgid "Local"
 msgstr "Локаль"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr "Часовий пояс за замовчуванням"
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr "Часовий пояс за замовчуванням для сайту; зазвичай UTC."
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr "Мова сайту за замовчуванням"
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr "Снепшоти"
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
-msgstr "Випадково під час веб-хіта"
-
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
-msgstr "Згідно плану робіт"
-
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
-msgstr "Снепшоти даних"
-
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
-msgstr "Коли надсилати статистичні дані до серверів status.net"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
+msgstr "Мова за замовчуванням"
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
-msgstr "Частота"
-
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
-msgstr "Снепшоти надсилатимуться раз на N веб-хітів"
-
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr "Звітня URL-адреса"
-
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr "Снепшоти надсилатимуться на цю URL-адресу"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
+msgstr ""
+"Мова сайту на випадок, коли автовизначення мови за настройками браузера не "
+"доступно"
 
-#: actions/siteadminpanel.php:315
+#: actions/siteadminpanel.php:271
 msgid "Limits"
 msgstr "Обмеження"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Text limit"
 msgstr "Текстові обмеження"
 
-#: actions/siteadminpanel.php:318
+#: actions/siteadminpanel.php:274
 msgid "Maximum number of characters for notices."
 msgstr "Максимальна кількість знаків у дописі."
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "Dupe limit"
 msgstr "Часове обмеження"
 
-#: actions/siteadminpanel.php:322
+#: actions/siteadminpanel.php:278
 msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 "Як довго користувачі мають зачекати (в секундах) аби надіслати той самий "
 "допис ще раз."
 
+#: actions/sitenoticeadminpanel.php:56
+msgid "Site Notice"
+msgstr "Повідомлення сайту"
+
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
+msgstr "Змінити повідомлення сайту"
+
+#: actions/sitenoticeadminpanel.php:103
+msgid "Unable to save site notice."
+msgstr "Не вдається зберегти повідомлення сайту."
+
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
+msgstr "Максимальна довжина повідомлення сайту становить 255 символів"
+
+#: actions/sitenoticeadminpanel.php:176
+msgid "Site notice text"
+msgstr "Текст повідомлення сайту"
+
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
+msgstr "Текст повідомлення сайту (255 символів максимум; HTML дозволено)"
+
+#: actions/sitenoticeadminpanel.php:198
+msgid "Save site notice"
+msgstr "Зберегти повідомлення сайту"
+
 #: actions/smssettings.php:58
 msgid "SMS settings"
 msgstr "Налаштування СМС"
@@ -3960,6 +3966,64 @@ msgstr ""
 msgid "No code entered"
 msgstr "Код не введено"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr "Снепшоти"
+
+#: actions/snapshotadminpanel.php:65
+msgid "Manage snapshot configuration"
+msgstr "Керування конфігурацією знімку"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr "Помилкове значення снепшоту."
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr "Частота повторення снепшотів має містити цифру."
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr "Помилковий снепшот URL."
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr "Випадково під час веб-хіта"
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr "Згідно плану робіт"
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr "Снепшоти даних"
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr "Коли надсилати статистичні дані до серверів status.net"
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr "Частота"
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr "Снепшоти надсилатимуться раз на N веб-хітів"
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr "Звітня URL-адреса"
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr "Снепшоти надсилатимуться на цю URL-адресу"
+
+#: actions/snapshotadminpanel.php:248
+msgid "Save snapshot settings"
+msgstr "Зберегти налаштування знімку"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr "Ви не підписані до цього профілю."
@@ -4167,7 +4231,7 @@ msgstr "У запиті відсутній ID профілю."
 msgid "Unsubscribed"
 msgstr "Відписано"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4175,7 +4239,6 @@ msgstr "Ліцензія «%1$s» не відповідає ліцензії с
 
 #. TRANS: User admin panel title
 #: actions/useradminpanel.php:59
-#, fuzzy
 msgctxt "TITLE"
 msgid "User"
 msgstr "Користувач"
@@ -4370,17 +4433,23 @@ msgstr "Групи %1$s, сторінка %2$d"
 msgid "Search for more groups"
 msgstr "Шукати групи ще"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr "%s не є учасником жодної групи."
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 "Спробуйте [знайти якісь групи](%%action.groupsearch%%) і приєднайтеся до них."
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "Оновлення від %1$s на %2$s!"
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4436,7 +4505,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Додатки"
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 msgid "Version"
 msgstr "Версія"
 
@@ -4501,22 +4570,22 @@ msgstr "Не можна оновити повідомлення з новим UR
 msgid "DB error inserting hashtag: %s"
 msgstr "Помилка бази даних при додаванні теґу: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 msgid "Problem saving notice. Too long."
 msgstr "Проблема при збереженні допису. Надто довге."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при збереженні допису. Невідомий користувач."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Дуже багато дописів за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4524,19 +4593,19 @@ msgstr ""
 "Дуже багато повідомлень за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "Вам заборонено надсилати дописи до цього сайту."
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Проблема при збереженні допису."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 msgid "Problem saving group inbox."
 msgstr "Проблема при збереженні вхідних дописів для групи."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
@@ -4561,7 +4630,11 @@ msgstr "Не підписано!"
 msgid "Couldn't delete self-subscription."
 msgstr "Не можу видалити самопідписку."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+msgid "Couldn't delete subscription OMB token."
+msgstr "Не вдається видалити токен підписки OMB."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Не вдалося видалити підписку."
 
@@ -4570,19 +4643,19 @@ msgstr "Не вдалося видалити підписку."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Вітаємо на %1$s, @%2$s!"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "Не вдалося створити нову групу."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 msgid "Could not set group URI."
 msgstr "Не вдалося встановити URI групи."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 msgid "Could not set group membership."
 msgstr "Не вдалося встановити членство."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 msgid "Could not save local group info."
 msgstr "Не вдалося зберегти інформацію про локальну групу."
 
@@ -4623,194 +4696,170 @@ msgstr "%1$s — %2$s"
 msgid "Untitled page"
 msgstr "Сторінка без заголовку"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "Відправна навігація по сайту"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
-#, fuzzy
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Персональний профіль і стрічка друзів"
 
-#: lib/action.php:442
-#, fuzzy
+#: lib/action.php:433
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Особисте"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
-#, fuzzy
+#: lib/action.php:435
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Змінити електронну адресу, аватару, пароль, профіль"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Акаунт"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
-#, fuzzy
+#: lib/action.php:440
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "З’єднання з сервісами"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "З’єднання"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
-#, fuzzy
+#: lib/action.php:446
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Змінити конфігурацію сайту"
 
-#: lib/action.php:460
-#, fuzzy
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr "Адмін"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
-#, fuzzy, php-format
+#: lib/action.php:453
+#, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Запросіть друзів та колег приєднатись до Вас на %s"
 
-#: lib/action.php:467
-#, fuzzy
+#: lib/action.php:456
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Запросити"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
-#, fuzzy
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Вийти з сайту"
 
-#: lib/action.php:476
-#, fuzzy
+#: lib/action.php:465
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Вийти"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
-#, fuzzy
+#: lib/action.php:470
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Створити новий акаунт"
 
-#: lib/action.php:484
-#, fuzzy
+#: lib/action.php:473
 msgctxt "MENU"
 msgid "Register"
 msgstr "Реєстрація"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
-#, fuzzy
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Увійти на сайт"
 
-#: lib/action.php:490
-#, fuzzy
+#: lib/action.php:479
 msgctxt "MENU"
 msgid "Login"
 msgstr "Увійти"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
-#, fuzzy
+#: lib/action.php:482
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Допоможіть!"
 
-#: lib/action.php:496
-#, fuzzy
+#: lib/action.php:485
 msgctxt "MENU"
 msgid "Help"
-msgstr "Ð\94опомога"
+msgstr "Ð\94овÑ\96дка"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
-#, fuzzy
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Пошук людей або текстів"
 
-#: lib/action.php:502
-#, fuzzy
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr "Пошук"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 msgid "Site notice"
 msgstr "Зауваження сайту"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "Огляд"
 
-#: lib/action.php:656
+#: lib/action.php:645
 msgid "Page notice"
 msgstr "Зауваження сторінки"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr "Другорядна навігація по сайту"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Допомога"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Про"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "ЧаПи"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr "Умови"
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Конфіденційність"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Джерело"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr "Бедж"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "Ліцензія програмного забезпечення StatusNet"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4819,12 +4868,12 @@ msgstr ""
 "**%%site.name%%** — це сервіс мікроблоґів наданий вам [%%site.broughtby%%](%%"
 "site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** — це сервіс мікроблоґів. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4835,54 +4884,54 @@ msgstr ""
 "для мікроблоґів, версія %s, доступному під [GNU Affero General Public "
 "License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 msgid "Site content license"
 msgstr "Ліцензія змісту сайту"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Зміст і дані %1$s є приватними і конфіденційними."
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr "Авторські права на зміст і дані належать %1$s. Всі права захищено."
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторські права на зміст і дані належать розробникам. Всі права захищено."
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "Всі "
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "ліцензія."
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "Нумерація сторінок"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr "Вперед"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 msgid "Before"
 msgstr "Назад"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr "Поки що не можу обробити віддалений контент."
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr "Поки що не можу обробити вбудований XML контент."
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr "Поки що не можу обробити вбудований контент Base64."
 
@@ -4897,91 +4946,76 @@ msgid "Changes to that panel are not allowed."
 msgstr "Для цієї панелі зміни не припустимі."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr "showForm() не виконано."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не виконано."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr "Немає можливості видалити налаштування дизайну."
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 msgid "Basic site configuration"
 msgstr "Основна конфігурація сайту"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
-#, fuzzy
+#: lib/adminpanelaction.php:350
 msgctxt "MENU"
 msgid "Site"
 msgstr "Сайт"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 msgid "Design configuration"
 msgstr "Конфігурація дизайну"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
-#, fuzzy
+#: lib/adminpanelaction.php:358
 msgctxt "MENU"
 msgid "Design"
 msgstr "Дизайн"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 msgid "User configuration"
 msgstr "Конфігурація користувача"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "Користувач"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 msgid "Access configuration"
 msgstr "Прийняти конфігурацію"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Погодитись"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 msgid "Paths configuration"
 msgstr "Конфігурація шляху"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-#, fuzzy
-msgctxt "MENU"
-msgid "Paths"
-msgstr "Шлях"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 msgid "Sessions configuration"
 msgstr "Конфігурація сесій"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
-#, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Сесії"
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
+msgid "Edit site notice"
+msgstr "Редагувати повідомлення сайту"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+msgid "Snapshots configuration"
+msgstr "Конфігурація знімків"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5172,12 +5206,12 @@ msgstr "%1$s залишив групу %2$s"
 msgid "Fullname: %s"
 msgstr "Повне ім’я: %s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "Локація: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "Веб-сторінка: %s"
@@ -5203,20 +5237,20 @@ msgstr "Помилка при відправці прямого повідомл
 
 #: lib/command.php:413
 msgid "Cannot repeat your own notice"
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð²Ñ\82оÑ\80Ñ\83ваÑ\82и Ð\92аÑ\88омÑ\83 Ð²Ð»Ð°Ñ\81номÑ\83 Ð´Ð¾Ð¿Ð¸Ñ\81Ñ\83"
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82и Ð\92аÑ\88 Ð²Ð»Ð°Ñ\81ний Ð´Ð¾Ð¿Ð¸Ñ\81"
 
 #: lib/command.php:418
 msgid "Already repeated that notice"
-msgstr "Цьому допису вже вторували"
+msgstr "Цей допис вже повторили"
 
 #: lib/command.php:426
 #, php-format
 msgid "Notice from %s repeated"
-msgstr "Допису від %s вторували"
+msgstr "Допис %s повторили"
 
 #: lib/command.php:428
 msgid "Error repeating notice."
-msgstr "Помилка із вторуванням допису."
+msgstr "Помилка при повторенні допису."
 
 #: lib/command.php:482
 #, php-format
@@ -5510,6 +5544,11 @@ msgstr "Оберіть теґ до звуженого списку"
 msgid "Go"
 msgstr "Вперед"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr "Надати цьому користувачеві роль \"%s\""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr "URL-адреса веб-сторінки, блоґу групи, або тематичного блоґу"
@@ -5646,11 +5685,11 @@ msgstr "Увійти використовуючи ім’я та пароль"
 msgid "Sign up for a new account"
 msgstr "Зареєструвати новий акаунт"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Підтвердження електронної адреси"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5679,12 +5718,12 @@ msgstr ""
 "Дякуємо за Ваш час \n"
 "%s\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s тепер слідкує за Вашими дописами на %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5709,17 +5748,17 @@ msgstr ""
 "----\n"
 "Змінити електронну адресу або умови сповіщення — %8$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, php-format
 msgid "Bio: %s"
 msgstr "Про себе: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Нова електронна адреса для надсилання повідомлень на %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5740,21 +5779,21 @@ msgstr ""
 "Щиро Ваші,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s статус"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Підтвердження СМС"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "Вас спробував «розштовхати» %s"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5781,12 +5820,12 @@ msgstr ""
 "З найкращими побажаннями,\n"
 "%4$s\n"
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Нове приватне повідомлення від %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5819,12 +5858,12 @@ msgstr ""
 "З найкращими побажаннями,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s (@%s) додав(ла) Ваш допис обраних"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5861,12 +5900,12 @@ msgstr ""
 "Щиро Ваші,\n"
 "%6$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr "%s (@%s) пропонує до Вашої уваги наступний допис"
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6067,7 +6106,7 @@ msgstr "в контексті"
 
 #: lib/noticelist.php:601
 msgid "Repeated by"
-msgstr "Ð\92Ñ\82оÑ\80Ñ\83ваннÑ\96"
+msgstr "Ð\9fовÑ\82оÑ\80ено"
 
 #: lib/noticelist.php:628
 msgid "Reply to this notice"
@@ -6079,7 +6118,7 @@ msgstr "Відповісти"
 
 #: lib/noticelist.php:673
 msgid "Notice repeated"
-msgstr "Ð\94опиÑ\81 Ð²Ñ\82оÑ\80Ñ\83вали"
+msgstr "Ð\94опиÑ\81 Ð¿Ð¾Ð²Ñ\82оÑ\80или"
 
 #: lib/nudgeform.php:116
 msgid "Nudge this user"
@@ -6125,10 +6164,6 @@ msgstr "Відповіді"
 msgid "Favorites"
 msgstr "Обрані"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "Користувач"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Вхідні"
@@ -6154,7 +6189,7 @@ msgstr "Теґи у дописах %s"
 msgid "Unknown"
 msgstr "Невідомо"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Підписки"
 
@@ -6162,23 +6197,23 @@ msgstr "Підписки"
 msgid "All subscriptions"
 msgstr "Всі підписки"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Підписчики"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 msgid "All subscribers"
 msgstr "Всі підписчики"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr "ІД"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "З нами від"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "Всі групи"
 
@@ -6216,9 +6251,14 @@ msgstr "Повторити цей допис?"
 
 #: lib/repeatform.php:132
 msgid "Repeat this notice"
-msgstr "Вторувати цьому допису"
+msgstr "Повторити цей допис"
+
+#: lib/revokeroleform.php:91
+#, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Відкликати роль \"%s\" для цього користувача"
 
-#: lib/router.php:668
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr "Користувача для однокористувацького режиму не визначено."
 
@@ -6372,47 +6412,61 @@ msgstr "Повідомлення"
 msgid "Moderate"
 msgstr "Модерувати"
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+msgid "User role"
+msgstr "Роль користувача"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr "Адміністратор"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "мить тому"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "хвилину тому"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "близько %d хвилин тому"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "годину тому"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "близько %d годин тому"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "день тому"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "близько %d днів тому"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "місяць тому"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "близько %d місяців тому"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "рік тому"
 
index d64fae91d4faece901ab57e9c2a34e0f096cbd21..59751aa5d11e8e0dbd7a0e2648a7cdf27f1065b2 100644 (file)
@@ -7,19 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:03:59+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:10+0000\n"
 "Language-Team: Vietnamese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: vi\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "Chấp nhận"
@@ -107,7 +108,7 @@ msgstr "Không có tin nhắn nào."
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -123,7 +124,7 @@ msgstr "%s và bạn bè"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -178,7 +179,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s và bạn bè"
@@ -206,11 +207,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Phương thức API không tìm thấy!"
@@ -585,7 +586,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "Giới thiệu"
@@ -677,18 +678,6 @@ msgstr "Tìm kiếm các tin nhắn ưa thích của %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "Tất cả các cập nhật của %s"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, fuzzy, php-format
-msgid "%s timeline"
-msgstr "Dòng tin nhắn của %s"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -699,12 +688,12 @@ msgstr "%1$s / Các cập nhật đang trả lời tới %2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, fuzzy, php-format
 msgid "%s public timeline"
 msgstr "Dòng tin công cộng"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s cập nhật từ tất cả mọi người!"
@@ -724,7 +713,7 @@ msgstr "Trả lời cho %s"
 msgid "Notices tagged with %s"
 msgstr "Thông báo được gắn thẻ %s"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Dòng tin nhắn cho %s"
@@ -768,7 +757,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 #, fuzzy
 msgid "User without matching profile"
 msgstr "Hồ sơ ở nơi khác không khớp với hồ sơ này của bạn"
@@ -963,7 +952,7 @@ msgid "Conversation"
 msgstr "Không có mã số xác nhận."
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "Tin nhắn"
 
@@ -985,7 +974,7 @@ msgstr "Bạn chưa cập nhật thông tin riêng"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "Có lỗi xảy ra khi thao tác. Hãy thử lại lần nữa."
@@ -1197,8 +1186,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1330,7 +1320,7 @@ msgstr "Lý lịch quá dài (không quá 140 ký tự)"
 msgid "Could not update group."
 msgstr "Không thể cập nhật thành viên."
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Không thể tạo favorite."
@@ -1461,7 +1451,7 @@ msgid "Cannot normalize that email address"
 msgstr "Không thể bình thường hóa địa chỉ GTalk này"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "Địa chỉ email không hợp lệ."
 
@@ -1667,6 +1657,25 @@ msgstr "Không có tin nhắn nào."
 msgid "Cannot read file."
 msgstr "Không có tin nhắn nào."
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "Kích thước không hợp lệ."
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "Bạn đã theo những người này:"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "Người dùng không có thông tin."
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1824,12 +1833,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr "Kênh mà bạn tham gia"
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, fuzzy, php-format
+msgid "%s timeline"
+msgstr "Dòng tin nhắn của %s"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 #, fuzzy
 msgid "Groups"
@@ -2460,8 +2475,8 @@ msgstr "Kết nối"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "Không hỗ trợ định dạng dữ liệu này."
 
@@ -2613,7 +2628,8 @@ msgstr "Không thể lưu mật khẩu mới"
 msgid "Password saved."
 msgstr "Đã lưu mật khẩu."
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2745,7 +2761,7 @@ msgstr "Background Theme:"
 msgid "SSL"
 msgstr "SMS"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "Khôi phục"
@@ -2804,11 +2820,11 @@ msgstr "Địa chỉ email không hợp lệ."
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "Nội dung tin nhắn không hợp lệ"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2888,7 +2904,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "Ngôn ngữ"
 
@@ -2914,7 +2930,7 @@ msgstr "Tự động theo những người nào đăng ký theo tôi"
 msgid "Bio is too long (max %d chars)."
 msgstr "Lý lịch quá dài (không quá 140 ký tự)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3228,7 +3244,7 @@ msgid "Same as password above. Required."
 msgstr "Cùng mật khẩu ở trên. Bắt buộc."
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "Email"
 
@@ -3332,7 +3348,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL trong hồ sơ cá nhân của bạn ở trên các trang microblogging khác"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "Theo bạn này"
 
@@ -3435,6 +3451,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "%s chào mừng bạn "
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "Bạn đã theo những người này:"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "Hồ sơ ở nơi khác không khớp với hồ sơ này của bạn"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3450,7 +3476,9 @@ msgstr "Bạn đã theo những người này:"
 msgid "User is already sandboxed."
 msgstr "Người dùng không có thông tin."
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3474,7 +3502,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3510,8 +3538,8 @@ msgstr "Thư mời đã gửi"
 msgid "Description"
 msgstr "Mô tả"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "Số liệu thống kê"
 
@@ -3647,47 +3675,47 @@ msgstr ""
 msgid "Group actions"
 msgstr "Mã nhóm"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Hộp thư đi của %s"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 msgid "Members"
 msgstr "Thành viên"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 #, fuzzy
 msgid "All members"
 msgstr "Thành viên"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "Tạo"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3697,7 +3725,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3706,7 +3734,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3820,150 +3848,139 @@ msgid "User is already silenced."
 msgstr "Người dùng không có thông tin."
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "Địa chỉ email không hợp lệ."
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "Thông báo mới"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "Dia chi email moi de gui tin nhan den %s"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "Thành phố"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "Ngôn ngữ bạn thích"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "Thông báo mới"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "Tin mới nhất"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "Không thể lưu thông tin Twitter của bạn!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "Thông báo mới"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "Thông báo mới"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -4075,6 +4092,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "Không có mã nào được nhập"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "Tôi theo"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "Thay đổi hình đại diện"
+
 #: actions/subedit.php:70
 #, fuzzy
 msgid "You are not subscribed to that profile."
@@ -4284,7 +4361,7 @@ msgstr "Không có URL cho hồ sơ để quay về."
 msgid "Unsubscribed"
 msgstr "Hết theo"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4493,16 +4570,22 @@ msgstr "Thành viên"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4546,7 +4629,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "Cá nhân"
@@ -4617,41 +4700,41 @@ msgstr "Không thể cập nhật thông tin user với địa chỉ email đã
 msgid "DB error inserting hashtag: %s"
 msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%s (%s)"
@@ -4679,7 +4762,12 @@ msgstr "Chưa đăng nhận!"
 msgid "Couldn't delete self-subscription."
 msgstr "Không thể xóa đăng nhận."
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "Không thể xóa đăng nhận."
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "Không thể xóa đăng nhận."
 
@@ -4688,22 +4776,22 @@ msgstr "Không thể xóa đăng nhận."
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%s chào mừng bạn "
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "Không thể tạo favorite."
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "Không thể tạo đăng nhận."
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Không thể tạo đăng nhận."
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "Không thể tạo đăng nhận."
@@ -4748,62 +4836,54 @@ msgstr "%s (%s)"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "Cá nhân"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Thay đổi mật khẩu của bạn"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "Giới thiệu"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Không thể chuyển đến máy chủ: %s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "Kết nối"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Tôi theo"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
@@ -4811,132 +4891,133 @@ msgstr ""
 "Điền địa chỉ email và nội dung tin nhắn để gửi thư mời bạn bè và đồng nghiệp "
 "của bạn tham gia vào dịch vụ này."
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "Thư mời"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "Thoát"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Tạo tài khoản mới"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "Đăng ký"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "Đăng nhập"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hướng dẫn"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "Hướng dẫn"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "Tìm kiếm"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "Thông báo mới"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "Thông báo mới"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Tôi theo"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "Hướng dẫn"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "Giới thiệu"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "Riêng tư"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "Nguồn"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "Liên hệ"
 
-#: lib/action.php:782
+#: lib/action.php:771
 #, fuzzy
 msgid "Badge"
 msgstr "Tin đã gửi"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4945,12 +5026,12 @@ msgstr ""
 "**%%site.name%%** là dịch vụ gửi tin nhắn được cung cấp từ [%%site.broughtby%"
 "%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** là dịch vụ gửi tin nhắn. "
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, fuzzy, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4961,56 +5042,56 @@ msgstr ""
 "quyền [GNU Affero General Public License](http://www.fsf.org/licensing/"
 "licenses/agpl-3.0.html)."
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "Tìm theo nội dung của tin nhắn"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "Sau"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "Trước"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -5027,96 +5108,87 @@ msgid "Changes to that panel are not allowed."
 msgstr "Biệt hiệu không được cho phép."
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Không thể lưu thông tin Twitter của bạn!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Xac nhan dia chi email"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "Thư mời"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "Xác nhận SMS"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "Cá nhân"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "Xác nhận SMS"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "Xác nhận SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "Chấp nhận"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Xác nhận SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Xác nhận SMS"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "Cá nhân"
+msgid "Edit site notice"
+msgstr "Thông báo mới"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "Xác nhận SMS"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5314,12 +5386,12 @@ msgstr "%s và nhóm"
 msgid "Fullname: %s"
 msgstr "Tên đầy đủ"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, fuzzy, php-format
 msgid "Location: %s"
 msgstr "Thành phố: %s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, fuzzy, php-format
 msgid "Homepage: %s"
 msgstr "Trang chủ hoặc Blog: %s"
@@ -5630,6 +5702,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5779,11 +5856,11 @@ msgstr "Sai tên đăng nhập hoặc mật khẩu."
 msgid "Sign up for a new account"
 msgstr "Tạo tài khoản mới"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "Xac nhan dia chi email"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, fuzzy, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5815,12 +5892,12 @@ msgstr ""
 "%4$s\n"
 "\n"
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s đang theo dõi lưu ý của bạn trên %2$s."
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5841,17 +5918,17 @@ msgstr ""
 "Người bạn trung thành của bạn,\n"
 "%4$s.\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "Thành phố: %s"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "Dia chi email moi de gui tin nhan den %s"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5872,21 +5949,21 @@ msgstr ""
 "Chúc sức khỏe,\n"
 "%4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, fuzzy, php-format
 msgid "%s status"
 msgstr "Trạng thái của %1$s vào %2$s"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "Xác nhận SMS"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5902,12 +5979,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "Bạn có tin nhắn riêng từ %s"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5940,12 +6017,12 @@ msgstr ""
 "Chúc sức khỏe,\n"
 "%5$s\n"
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s da them tin nhan cua ban vao danh sach tin nhan ua thich"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, fuzzy, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5979,12 +6056,12 @@ msgstr ""
 "Chúc sức khỏe,\n"
 "%5$s\n"
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6241,10 +6318,6 @@ msgstr "Trả lời"
 msgid "Favorites"
 msgstr "Ưa thích"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Hộp thư đến"
@@ -6271,7 +6344,7 @@ msgstr "cảnh báo tin nhắn"
 msgid "Unknown"
 msgstr "Không tìm thấy action"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "Tôi theo bạn này"
 
@@ -6279,24 +6352,24 @@ msgstr "Tôi theo bạn này"
 msgid "All subscriptions"
 msgstr "Tất cả đăng nhận"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "Bạn này theo tôi"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "Bạn này theo tôi"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "Gia nhập từ"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 #, fuzzy
 msgid "All groups"
 msgstr "Nhóm"
@@ -6343,7 +6416,12 @@ msgstr "Trả lời tin nhắn này"
 msgid "Repeat this notice"
 msgstr "Trả lời tin nhắn này"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "Ban user"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6515,47 +6593,62 @@ msgstr "Tin mới nhất"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "Hồ sơ"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "vài giây trước"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "1 phút trước"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d phút trước"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "1 giờ trước"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d giờ trước"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "1 ngày trước"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "%d ngày trước"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "1 tháng trước"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "%d tháng trước"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "1 năm trước"
 
index 45fdfe6dc05c0883be670b8ed17f639366d3fe72..cc176161695678fe0428ffc3d3b236be41e1d18c 100644 (file)
@@ -10,19 +10,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:04:02+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:13+0000\n"
 "Language-Team: Simplified Chinese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: zh-hans\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "接受"
@@ -109,7 +110,7 @@ msgstr "没有该页面"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -125,7 +126,7 @@ msgstr "%s 及好友"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -180,7 +181,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s 及好友"
@@ -208,11 +209,11 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 方法未实现!"
@@ -583,7 +584,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 msgid "Account"
 msgstr "帐号"
 
@@ -675,18 +676,6 @@ msgstr "%s 的收藏 / %s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s 收藏了 %s 的 %s 通告。"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr "%s 时间表"
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr "%2$s 上 %1$s 的更新!"
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -697,12 +686,12 @@ msgstr "%1$s / 回复 %2$s 的消息"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr "回复 %2$s / %3$s 的 %1$s 更新。"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s 公众时间表"
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "来自所有人的 %s 消息!"
@@ -722,7 +711,7 @@ msgstr "%s 的回复"
 msgid "Notices tagged with %s"
 msgstr "带 %s 标签的通告"
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s 上 %1$s 的更新!"
@@ -764,7 +753,7 @@ msgstr "您可以在这里上传个人头像。"
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr "找不到匹配的用户。"
 
@@ -959,7 +948,7 @@ msgid "Conversation"
 msgstr "确认码"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr "通告"
 
@@ -981,7 +970,7 @@ msgstr "您未告知此个人信息"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "会话标识有问题,请重试。"
@@ -1189,8 +1178,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1318,7 +1308,7 @@ msgstr "描述过长(不能超过140字符)。"
 msgid "Could not update group."
 msgstr "无法更新组"
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "无法创建收藏。"
@@ -1444,7 +1434,7 @@ msgid "Cannot normalize that email address"
 msgstr "无法识别此电子邮件"
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "不是有效的电子邮件。"
 
@@ -1643,6 +1633,25 @@ msgstr "没有这份通告。"
 msgid "Cannot read file."
 msgstr "没有这份通告。"
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "大小不正确。"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "无法向此用户发送消息。"
+
+#: actions/grantrole.php:82
+#, fuzzy
+msgid "User already has this role."
+msgstr "用户没有个人信息。"
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1801,12 +1810,18 @@ msgstr "admin管理员"
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr "%s 时间表"
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s 上 %1$s 的更新!"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr "组"
@@ -2410,8 +2425,8 @@ msgstr "连接"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr "不支持的数据格式。"
 
@@ -2560,7 +2575,8 @@ msgstr "无法保存新密码。"
 msgid "Password saved."
 msgstr "密码已保存。"
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2688,7 +2704,7 @@ msgstr ""
 msgid "SSL"
 msgstr "SMS短信"
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 #, fuzzy
 msgid "Never"
 msgstr "恢复"
@@ -2747,11 +2763,11 @@ msgstr "不是有效的电子邮件"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "用户自加标签 %s - 第 %d 页"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr "通告内容不正确"
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2829,7 +2845,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr "你的标签 (字母letters, 数字numbers, -, ., 和 _), 以逗号或空格分隔"
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr "语言"
 
@@ -2855,7 +2871,7 @@ msgstr "自动订阅任何订阅我的更新的人(这个选项最适合机器
 msgid "Bio is too long (max %d chars)."
 msgstr "自述过长(不能超过140字符)。"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr "未选择时区。"
 
@@ -3163,7 +3179,7 @@ msgid "Same as password above. Required."
 msgstr "相同的密码。此项必填。"
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "电子邮件"
 
@@ -3264,7 +3280,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "您在其他兼容的微博客服务的个人信息URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr "订阅"
 
@@ -3369,6 +3385,16 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "发送给 %1$s 的 %2$s 消息"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "无法向此用户发送消息。"
+
+#: actions/revokerole.php:82
+#, fuzzy
+msgid "User doesn't have this role."
+msgstr "找不到匹配的用户。"
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3384,7 +3410,9 @@ msgstr "无法向此用户发送消息。"
 msgid "User is already sandboxed."
 msgstr "用户没有个人信息。"
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3408,7 +3436,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3445,8 +3473,8 @@ msgstr "分页"
 msgid "Description"
 msgstr "描述"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr "统计"
 
@@ -3581,47 +3609,47 @@ msgstr ""
 msgid "Group actions"
 msgstr "组动作"
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s 的发件箱"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "注册于"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(没有)"
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr "所有成员"
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "创建"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3631,7 +3659,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3642,7 +3670,7 @@ msgstr ""
 "**%s** 是一个 %%%%site.name%%%% 的用户组,一个微博客服务 [micro-blogging]"
 "(http://en.wikipedia.org/wiki/Micro-blogging)"
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 #, fuzzy
 msgid "Admins"
 msgstr "admin管理员"
@@ -3758,150 +3786,139 @@ msgid "User is already silenced."
 msgstr "用户没有个人信息。"
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "不是有效的电子邮件"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "新通告"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "新的电子邮件地址,用于发布 %s 信息"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "本地显示"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
+#: actions/siteadminpanel.php:262
 #, fuzzy
-msgid "Default site language"
+msgid "Default language"
 msgstr "首选语言"
 
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
-msgstr ""
-
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "新通告"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:67
+#, fuzzy
+msgid "Edit site-wide message"
+msgstr "新消息"
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "无法保存 Twitter 设置!"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "新通告"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "新通告"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -4004,6 +4021,66 @@ msgstr ""
 msgid "No code entered"
 msgstr "没有输入验证码"
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "主站导航"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "头像设置"
+
 #: actions/subedit.php:70
 #, fuzzy
 msgid "You are not subscribed to that profile."
@@ -4214,7 +4291,7 @@ msgstr "服务器没有返回个人信息URL。"
 msgid "Unsubscribed"
 msgstr "退订"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4421,16 +4498,22 @@ msgstr "%s 组成员, 第 %d 页"
 msgid "Search for more groups"
 msgstr "检索人或文字"
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, fuzzy, php-format
 msgid "%s is not a member of any group."
 msgstr "您未告知此个人信息"
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr "%2$s 上 %1$s 的更新!"
+
 #: actions/version.php:73
 #, fuzzy, php-format
 msgid "StatusNet %s"
@@ -4474,7 +4557,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "个人"
@@ -4543,42 +4626,42 @@ msgstr "无法添加新URI的信息。"
 msgid "DB error inserting hashtag: %s"
 msgstr "添加标签时数据库出错:%s"
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。"
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。"
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr "在这个网站你被禁止发布消息。"
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
@@ -4607,7 +4690,12 @@ msgstr "未订阅!"
 msgid "Couldn't delete self-subscription."
 msgstr "无法删除订阅。"
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "无法删除订阅。"
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "无法删除订阅。"
 
@@ -4616,21 +4704,21 @@ msgstr "无法删除订阅。"
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "发送给 %1$s 的 %2$s 消息"
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 msgid "Could not create group."
 msgstr "无法创建组。"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "无法删除订阅。"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "无法删除订阅。"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "无法删除订阅。"
@@ -4673,198 +4761,191 @@ msgstr "%1$s (%2$s)"
 msgid "Untitled page"
 msgstr "无标题页"
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr "主站导航"
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "个人资料及朋友年表"
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "个人"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "修改资料"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "帐号"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "无法重定向到服务器:%s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "连接"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "主站导航"
 
-#: lib/action.php:460
+#: lib/action.php:449
 #, fuzzy
 msgctxt "MENU"
 msgid "Admin"
 msgstr "admin管理员"
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, fuzzy, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "使用这个表单来邀请好友和同事加入。"
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "邀请"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "登出本站"
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "登出"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "创建新帐号"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "注册"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "登入本站"
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "登录"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "帮助"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "帮助"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "检索人或文字"
 
-#: lib/action.php:502
+#: lib/action.php:491
 #, fuzzy
 msgctxt "MENU"
 msgid "Search"
 msgstr "搜索"
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "新通告"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr "本地显示"
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "新通告"
 
-#: lib/action.php:758
+#: lib/action.php:747
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "次项站导航"
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "帮助"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "关于"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "常见问题FAQ"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr "隐私"
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr "来源"
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "联系人"
 
-#: lib/action.php:782
+#: lib/action.php:771
 #, fuzzy
 msgid "Badge"
 msgstr "呼叫"
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr "StatusNet软件注册证"
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4873,12 +4954,12 @@ msgstr ""
 "**%%site.name%%** 是一个微博客服务,提供者为 [%%site.broughtby%%](%%site."
 "broughtbyurl%%)。"
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** 是一个微博客服务。"
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4889,56 +4970,56 @@ msgstr ""
 "General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)"
 "授权。"
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNet软件注册证"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr "全部"
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr "注册证"
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr "分页"
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 #, fuzzy
 msgid "After"
 msgstr "« 之后"
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "之前 »"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4955,99 +5036,89 @@ msgid "Changes to that panel are not allowed."
 msgstr "不允许注册。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "命令尚未实现。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "命令尚未实现。"
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "无法保存 Twitter 设置!"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "电子邮件地址确认"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "邀请"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS短信确认"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "个人"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS短信确认"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-#, fuzzy
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr "用户"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS短信确认"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "接受"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS短信确认"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS短信确认"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "个人"
+msgid "Edit site notice"
+msgstr "新通告"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "SMS短信确认"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5240,12 +5311,12 @@ msgstr "%s 离开群 %s"
 msgid "Fullname: %s"
 msgstr "全名:%s"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr "位置:%s"
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr "主页:%s"
@@ -5551,6 +5622,11 @@ msgstr "选择标签缩小清单"
 msgid "Go"
 msgstr "执行"
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 #, fuzzy
 msgid "URL of the homepage or blog of the group or topic"
@@ -5696,11 +5772,11 @@ msgstr "输入用户名和密码以登录。"
 msgid "Sign up for a new account"
 msgstr "创建新帐号"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "电子邮件地址确认"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5717,12 +5793,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "%1$s 开始关注您的 %2$s 信息。"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5742,19 +5818,19 @@ msgstr ""
 "\n"
 "为您效力的 %4$s\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr ""
 "自传Bio: %s\n"
 "\n"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr "新的电子邮件地址,用于发布 %s 信息"
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5774,21 +5850,21 @@ msgstr ""
 "\n"
 "为您效力的 %4$s"
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr "%s 状态"
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr "SMS短信确认"
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr "%s 振铃呼叫你"
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5804,12 +5880,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr "%s 发送了新的私人信息"
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5828,12 +5904,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "%s 收藏了您的通告"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5854,12 +5930,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -6114,10 +6190,6 @@ msgstr "回复"
 msgid "Favorites"
 msgstr "收藏夹"
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr "用户"
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "收件箱"
@@ -6144,7 +6216,7 @@ msgstr "%s's 的消息的标签"
 msgid "Unknown"
 msgstr "未知动作"
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr "订阅"
 
@@ -6152,25 +6224,25 @@ msgstr "订阅"
 msgid "All subscriptions"
 msgstr "所有订阅"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr "订阅者"
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "订阅者"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 #, fuzzy
 msgid "User ID"
 msgstr "用户"
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "用户始于"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr "所有组"
 
@@ -6215,7 +6287,12 @@ msgstr "无法删除通告。"
 msgid "Repeat this notice"
 msgstr "无法删除通告。"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "该组成员列表。"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6386,47 +6463,63 @@ msgstr "新消息"
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "用户没有个人信息。"
+
+#: lib/userprofile.php:354
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "admin管理员"
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
+#: lib/util.php:1015
 msgid "a few seconds ago"
 msgstr "几秒前"
 
-#: lib/util.php:1015
+#: lib/util.php:1017
 msgid "about a minute ago"
 msgstr "一分钟前"
 
-#: lib/util.php:1017
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d 分钟前"
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr "一小时前"
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d 小时前"
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr "一天前"
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr "%d 天前"
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr "一个月前"
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr "%d 个月前"
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr "一年前"
 
index 5cca450ca933717742f06ea872bdce9586264b19..3ea887beb80ea7d34888bb0ccbc6390a31e8f474 100644 (file)
@@ -7,19 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-02 21:02+0000\n"
-"PO-Revision-Date: 2010-03-02 21:04:05+0000\n"
+"POT-Creation-Date: 2010-03-06 23:49+0000\n"
+"PO-Revision-Date: 2010-03-06 23:51:15+0000\n"
 "Language-Team: Traditional Chinese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63350); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 "X-Language-Code: zh-hant\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 #. TRANS: Page title
-#: actions/accessadminpanel.php:55
+#. TRANS: Menu item for site administration
+#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:374
 #, fuzzy
 msgid "Access"
 msgstr "接受"
@@ -104,7 +105,7 @@ msgstr "無此通知"
 #: actions/otp.php:76 actions/remotesubscribe.php:145
 #: actions/remotesubscribe.php:154 actions/replies.php:73
 #: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105
-#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38
+#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:40
 #: actions/xrds.php:71 lib/command.php:163 lib/command.php:302
 #: lib/command.php:355 lib/command.php:401 lib/command.php:462
 #: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82
@@ -120,7 +121,7 @@ msgstr "%s與好友"
 
 #. TRANS: Page title. %1$s is user nickname
 #. TRANS: H1 text. %1$s is user nickname
-#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115
+#: actions/all.php:89 actions/all.php:181 actions/allrss.php:115
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
@@ -175,7 +176,7 @@ msgid ""
 msgstr ""
 
 #. TRANS: H1 text
-#: actions/all.php:174
+#: actions/all.php:178
 #, fuzzy
 msgid "You and friends"
 msgstr "%s與好友"
@@ -203,11 +204,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187
-#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
-#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
+#: actions/apitimelinegroup.php:160 actions/apitimelinehome.php:184
+#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:148
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:165 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "確認碼遺失"
@@ -574,7 +575,7 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310
+#: actions/apioauthauthorize.php:310 lib/action.php:438
 #, fuzzy
 msgid "Account"
 msgstr "關於"
@@ -665,18 +666,6 @@ msgstr "%1$s的狀態是%2$s"
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "&s的微型部落格"
 
-#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:138 actions/userrss.php:90
-#, php-format
-msgid "%s timeline"
-msgstr ""
-
-#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
-#: actions/userrss.php:92
-#, php-format
-msgid "Updates from %1$s on %2$s!"
-msgstr ""
-
 #: actions/apitimelinementions.php:117
 #, fuzzy, php-format
 msgid "%1$s / Updates mentioning %2$s"
@@ -687,12 +676,12 @@ msgstr "%1$s的狀態是%2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -712,7 +701,7 @@ msgstr ""
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:104 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:65
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "&s的微型部落格"
@@ -754,7 +743,7 @@ msgstr ""
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
-#: actions/userrss.php:103
+#: actions/userrss.php:106
 msgid "User without matching profile"
 msgstr ""
 
@@ -948,7 +937,7 @@ msgid "Conversation"
 msgstr "地點"
 
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
-#: lib/profileaction.php:216 lib/searchgroupnav.php:82
+#: lib/profileaction.php:218 lib/searchgroupnav.php:82
 msgid "Notices"
 msgstr ""
 
@@ -970,7 +959,7 @@ msgstr "無法連結到伺服器:%s"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1228
+#: lib/action.php:1217
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -1172,8 +1161,9 @@ msgstr ""
 #: actions/designadminpanel.php:586 actions/emailsettings.php:195
 #: actions/imsettings.php:163 actions/othersettings.php:126
 #: actions/pathsadminpanel.php:351 actions/profilesettings.php:174
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/smssettings.php:181 actions/subscriptions.php:208
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
+#: actions/sitenoticeadminpanel.php:195 actions/smssettings.php:181
+#: actions/snapshotadminpanel.php:245 actions/subscriptions.php:208
 #: actions/tagother.php:154 actions/useradminpanel.php:294
 #: lib/applicationeditform.php:333 lib/applicationeditform.php:334
 #: lib/designsettings.php:256 lib/groupeditform.php:202
@@ -1298,7 +1288,7 @@ msgstr "自我介紹過長(共140個字元)"
 msgid "Could not update group."
 msgstr "無法更新使用者"
 
-#: actions/editgroup.php:264 classes/User_group.php:478
+#: actions/editgroup.php:264 classes/User_group.php:493
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "無法存取個人圖像資料"
@@ -1421,7 +1411,7 @@ msgid "Cannot normalize that email address"
 msgstr ""
 
 #: actions/emailsettings.php:331 actions/register.php:201
-#: actions/siteadminpanel.php:143
+#: actions/siteadminpanel.php:144
 msgid "Not a valid email address."
 msgstr "此信箱無效"
 
@@ -1613,6 +1603,24 @@ msgstr "無此通知"
 msgid "Cannot read file."
 msgstr "無此通知"
 
+#: actions/grantrole.php:62 actions/revokerole.php:62
+#, fuzzy
+msgid "Invalid role."
+msgstr "尺寸錯誤"
+
+#: actions/grantrole.php:66 actions/revokerole.php:66
+msgid "This role is reserved and cannot be set."
+msgstr ""
+
+#: actions/grantrole.php:75
+#, fuzzy
+msgid "You cannot grant user roles on this site."
+msgstr "無法連結到伺服器:%s"
+
+#: actions/grantrole.php:82
+msgid "User already has this role."
+msgstr ""
+
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
 #: lib/profileformaction.php:70
@@ -1760,12 +1768,18 @@ msgstr ""
 msgid "Make this user an admin"
 msgstr ""
 
+#: actions/grouprss.php:138 actions/userrss.php:93
+#: lib/atomgroupnoticefeed.php:61 lib/atomusernoticefeed.php:67
+#, php-format
+msgid "%s timeline"
+msgstr ""
+
 #: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "&s的微型部落格"
 
-#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230
+#: actions/groups.php:62 lib/profileaction.php:212 lib/profileaction.php:232
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
 msgid "Groups"
 msgstr ""
@@ -2328,8 +2342,8 @@ msgstr "連結"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
-#: lib/apiaction.php:1068 lib/apiaction.php:1177
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1042
+#: lib/apiaction.php:1070 lib/apiaction.php:1179
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2475,7 +2489,8 @@ msgstr "無法存取新密碼"
 msgid "Password saved."
 msgstr ""
 
-#: actions/pathsadminpanel.php:59
+#. TRANS: Menu item for site administration
+#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:382
 msgid "Paths"
 msgstr ""
 
@@ -2600,7 +2615,7 @@ msgstr ""
 msgid "SSL"
 msgstr ""
 
-#: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294
+#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202
 msgid "Never"
 msgstr ""
 
@@ -2655,11 +2670,11 @@ msgstr "此信箱無效"
 msgid "Users self-tagged with %1$s - page %2$d"
 msgstr "&s的微型部落格"
 
-#: actions/postnotice.php:84
+#: actions/postnotice.php:95
 msgid "Invalid notice content"
 msgstr ""
 
-#: actions/postnotice.php:90
+#: actions/postnotice.php:101
 #, php-format
 msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
@@ -2736,7 +2751,7 @@ msgid ""
 "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated"
 msgstr ""
 
-#: actions/profilesettings.php:151 actions/siteadminpanel.php:280
+#: actions/profilesettings.php:151
 msgid "Language"
 msgstr ""
 
@@ -2762,7 +2777,7 @@ msgstr ""
 msgid "Bio is too long (max %d chars)."
 msgstr "自我介紹過長(共140個字元)"
 
-#: actions/profilesettings.php:235 actions/siteadminpanel.php:150
+#: actions/profilesettings.php:235 actions/siteadminpanel.php:151
 msgid "Timezone not selected."
 msgstr ""
 
@@ -3064,7 +3079,7 @@ msgid "Same as password above. Required."
 msgstr ""
 
 #: actions/register.php:438 actions/register.php:442
-#: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120
+#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:120
 msgid "Email"
 msgstr "電子信箱"
 
@@ -3149,7 +3164,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:368
+#: lib/userprofile.php:394
 msgid "Subscribe"
 msgstr ""
 
@@ -3250,6 +3265,15 @@ msgstr ""
 msgid "Replies to %1$s on %2$s!"
 msgstr "&s的微型部落格"
 
+#: actions/revokerole.php:75
+#, fuzzy
+msgid "You cannot revoke user roles on this site."
+msgstr "無法連結到伺服器:%s"
+
+#: actions/revokerole.php:82
+msgid "User doesn't have this role."
+msgstr ""
+
 #: actions/rsd.php:146 actions/version.php:157
 #, fuzzy
 msgid "StatusNet"
@@ -3264,7 +3288,9 @@ msgstr "無法連結到伺服器:%s"
 msgid "User is already sandboxed."
 msgstr ""
 
+#. TRANS: Menu item for site administration
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
+#: lib/adminpanelaction.php:390
 msgid "Sessions"
 msgstr ""
 
@@ -3288,7 +3314,7 @@ msgstr ""
 msgid "Turn on debugging output for sessions."
 msgstr ""
 
-#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
+#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
 #: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
@@ -3323,8 +3349,8 @@ msgstr "地點"
 msgid "Description"
 msgstr "所有訂閱"
 
-#: actions/showapplication.php:192 actions/showgroup.php:437
-#: lib/profileaction.php:174
+#: actions/showapplication.php:192 actions/showgroup.php:438
+#: lib/profileaction.php:176
 msgid "Statistics"
 msgstr ""
 
@@ -3457,47 +3483,47 @@ msgstr ""
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:336
+#: actions/showgroup.php:337
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:342
+#: actions/showgroup.php:343
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:348
+#: actions/showgroup.php:349
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:353
+#: actions/showgroup.php:354
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "無此通知"
 
-#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
+#: actions/showgroup.php:390 actions/showgroup.php:447 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "何時加入會員的呢?"
 
-#: actions/showgroup.php:394 lib/profileaction.php:117
-#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
+#: actions/showgroup.php:395 lib/profileaction.php:117
+#: lib/profileaction.php:150 lib/profileaction.php:238 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:400
+#: actions/showgroup.php:401
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:440
+#: actions/showgroup.php:441
 #, fuzzy
 msgid "Created"
 msgstr "新增"
 
-#: actions/showgroup.php:456
+#: actions/showgroup.php:457
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3507,7 +3533,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:462
+#: actions/showgroup.php:463
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3516,7 +3542,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:490
+#: actions/showgroup.php:491
 msgid "Admins"
 msgstr ""
 
@@ -3627,149 +3653,137 @@ msgid "User is already silenced."
 msgstr ""
 
 #: actions/siteadminpanel.php:69
-msgid "Basic settings for this StatusNet site."
+msgid "Basic settings for this StatusNet site"
 msgstr ""
 
-#: actions/siteadminpanel.php:132
+#: actions/siteadminpanel.php:133
 msgid "Site name must have non-zero length."
 msgstr ""
 
-#: actions/siteadminpanel.php:140
+#: actions/siteadminpanel.php:141
 #, fuzzy
 msgid "You must have a valid contact email address."
 msgstr "此信箱無效"
 
-#: actions/siteadminpanel.php:158
+#: actions/siteadminpanel.php:159
 #, php-format
 msgid "Unknown language \"%s\"."
 msgstr ""
 
 #: actions/siteadminpanel.php:165
-msgid "Invalid snapshot report URL."
-msgstr ""
-
-#: actions/siteadminpanel.php:171
-msgid "Invalid snapshot run value."
-msgstr ""
-
-#: actions/siteadminpanel.php:177
-msgid "Snapshot frequency must be a number."
-msgstr ""
-
-#: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
 msgstr ""
 
-#: actions/siteadminpanel.php:189
+#: actions/siteadminpanel.php:171
 msgid "Dupe limit must 1 or more seconds."
 msgstr ""
 
-#: actions/siteadminpanel.php:239
+#: actions/siteadminpanel.php:221
 msgid "General"
 msgstr ""
 
-#: actions/siteadminpanel.php:242
+#: actions/siteadminpanel.php:224
 #, fuzzy
 msgid "Site name"
 msgstr "新訊息"
 
-#: actions/siteadminpanel.php:243
+#: actions/siteadminpanel.php:225
 msgid "The name of your site, like \"Yourcompany Microblog\""
 msgstr ""
 
-#: actions/siteadminpanel.php:247
+#: actions/siteadminpanel.php:229
 msgid "Brought by"
 msgstr ""
 
-#: actions/siteadminpanel.php:248
+#: actions/siteadminpanel.php:230
 msgid "Text used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:252
+#: actions/siteadminpanel.php:234
 msgid "Brought by URL"
 msgstr ""
 
-#: actions/siteadminpanel.php:253
+#: actions/siteadminpanel.php:235
 msgid "URL used for credits link in footer of each page"
 msgstr ""
 
-#: actions/siteadminpanel.php:257
+#: actions/siteadminpanel.php:239
 #, fuzzy
 msgid "Contact email address for your site"
 msgstr "查無此使用者所註冊的信箱"
 
-#: actions/siteadminpanel.php:263
+#: actions/siteadminpanel.php:245
 #, fuzzy
 msgid "Local"
 msgstr "地點"
 
-#: actions/siteadminpanel.php:274
+#: actions/siteadminpanel.php:256
 msgid "Default timezone"
 msgstr ""
 
-#: actions/siteadminpanel.php:275
+#: actions/siteadminpanel.php:257
 msgid "Default timezone for the site; usually UTC."
 msgstr ""
 
-#: actions/siteadminpanel.php:281
-msgid "Default site language"
-msgstr ""
-
-#: actions/siteadminpanel.php:289
-msgid "Snapshots"
+#: actions/siteadminpanel.php:262
+msgid "Default language"
 msgstr ""
 
-#: actions/siteadminpanel.php:292
-msgid "Randomly during Web hit"
+#: actions/siteadminpanel.php:263
+msgid "Site language when autodetection from browser settings is not available"
 msgstr ""
 
-#: actions/siteadminpanel.php:293
-msgid "In a scheduled job"
+#: actions/siteadminpanel.php:271
+msgid "Limits"
 msgstr ""
 
-#: actions/siteadminpanel.php:295
-msgid "Data snapshots"
+#: actions/siteadminpanel.php:274
+msgid "Text limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:296
-msgid "When to send statistical data to status.net servers"
+#: actions/siteadminpanel.php:274
+msgid "Maximum number of characters for notices."
 msgstr ""
 
-#: actions/siteadminpanel.php:301
-msgid "Frequency"
+#: actions/siteadminpanel.php:278
+msgid "Dupe limit"
 msgstr ""
 
-#: actions/siteadminpanel.php:302
-msgid "Snapshots will be sent once every N web hits"
+#: actions/siteadminpanel.php:278
+msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
-#: actions/siteadminpanel.php:307
-msgid "Report URL"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:56
+#, fuzzy
+msgid "Site Notice"
+msgstr "新訊息"
 
-#: actions/siteadminpanel.php:308
-msgid "Snapshots will be sent to this URL"
+#: actions/sitenoticeadminpanel.php:67
+msgid "Edit site-wide message"
 msgstr ""
 
-#: actions/siteadminpanel.php:315
-msgid "Limits"
-msgstr ""
+#: actions/sitenoticeadminpanel.php:103
+#, fuzzy
+msgid "Unable to save site notice."
+msgstr "新訊息"
 
-#: actions/siteadminpanel.php:318
-msgid "Text limit"
+#: actions/sitenoticeadminpanel.php:113
+msgid "Max length for the site-wide notice is 255 chars"
 msgstr ""
 
-#: actions/siteadminpanel.php:318
-msgid "Maximum number of characters for notices."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:176
+#, fuzzy
+msgid "Site notice text"
+msgstr "新訊息"
 
-#: actions/siteadminpanel.php:322
-msgid "Dupe limit"
+#: actions/sitenoticeadminpanel.php:178
+msgid "Site-wide notice text (255 chars max; HTML okay)"
 msgstr ""
 
-#: actions/siteadminpanel.php:322
-msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+#: actions/sitenoticeadminpanel.php:198
+#, fuzzy
+msgid "Save site notice"
+msgstr "新訊息"
 
 #: actions/smssettings.php:58
 #, fuzzy
@@ -3866,6 +3880,66 @@ msgstr ""
 msgid "No code entered"
 msgstr ""
 
+#. TRANS: Menu item for site administration
+#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
+#: lib/adminpanelaction.php:406
+msgid "Snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:65
+#, fuzzy
+msgid "Manage snapshot configuration"
+msgstr "確認信箱"
+
+#: actions/snapshotadminpanel.php:127
+msgid "Invalid snapshot run value."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:133
+msgid "Snapshot frequency must be a number."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:144
+msgid "Invalid snapshot report URL."
+msgstr ""
+
+#: actions/snapshotadminpanel.php:200
+msgid "Randomly during Web hit"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:201
+msgid "In a scheduled job"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:206
+msgid "Data snapshots"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:208
+msgid "When to send statistical data to status.net servers"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:217
+msgid "Frequency"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:218
+msgid "Snapshots will be sent once every N web hits"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:226
+msgid "Report URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:227
+msgid "Snapshots will be sent to this URL"
+msgstr ""
+
+#: actions/snapshotadminpanel.php:248
+#, fuzzy
+msgid "Save snapshot settings"
+msgstr "線上即時通設定"
+
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
@@ -4070,7 +4144,7 @@ msgstr "無確認請求"
 msgid "Unsubscribed"
 msgstr "此帳號已註冊"
 
-#: actions/updateprofile.php:62 actions/userauthorization.php:337
+#: actions/updateprofile.php:64 actions/userauthorization.php:337
 #, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
@@ -4263,16 +4337,22 @@ msgstr "所有訂閱"
 msgid "Search for more groups"
 msgstr ""
 
-#: actions/usergroups.php:153
+#: actions/usergroups.php:157
 #, php-format
 msgid "%s is not a member of any group."
 msgstr ""
 
-#: actions/usergroups.php:158
+#: actions/usergroups.php:162
 #, php-format
 msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
+#: actions/userrss.php:95 lib/atomgroupnoticefeed.php:66
+#: lib/atomusernoticefeed.php:72
+#, php-format
+msgid "Updates from %1$s on %2$s!"
+msgstr ""
+
 #: actions/version.php:73
 #, php-format
 msgid "StatusNet %s"
@@ -4316,7 +4396,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:778
+#: actions/version.php:196 lib/action.php:767
 #, fuzzy
 msgid "Version"
 msgstr "地點"
@@ -4384,41 +4464,41 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:239
+#: classes/Notice.php:241
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:243
+#: classes/Notice.php:245
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:248
+#: classes/Notice.php:250
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:254
+#: classes/Notice.php:256
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:260
+#: classes/Notice.php:262
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:326 classes/Notice.php:352
+#: classes/Notice.php:328 classes/Notice.php:354
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:911
+#: classes/Notice.php:927
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:1442
+#: classes/Notice.php:1459
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
@@ -4445,7 +4525,12 @@ msgstr "此帳號已註冊"
 msgid "Couldn't delete self-subscription."
 msgstr "無法刪除帳號"
 
-#: classes/Subscription.php:179 lib/subs.php:69
+#: classes/Subscription.php:190
+#, fuzzy
+msgid "Couldn't delete subscription OMB token."
+msgstr "無法刪除帳號"
+
+#: classes/Subscription.php:201 lib/subs.php:69
 msgid "Couldn't delete subscription."
 msgstr "無法刪除帳號"
 
@@ -4454,22 +4539,22 @@ msgstr "無法刪除帳號"
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:462
+#: classes/User_group.php:477
 #, fuzzy
 msgid "Could not create group."
 msgstr "無法存取個人圖像資料"
 
-#: classes/User_group.php:471
+#: classes/User_group.php:486
 #, fuzzy
 msgid "Could not set group URI."
 msgstr "註冊失敗"
 
-#: classes/User_group.php:492
+#: classes/User_group.php:507
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "註冊失敗"
 
-#: classes/User_group.php:506
+#: classes/User_group.php:521
 #, fuzzy
 msgid "Could not save local group info."
 msgstr "註冊失敗"
@@ -4513,190 +4598,183 @@ msgstr "%1$s的狀態是%2$s"
 msgid "Untitled page"
 msgstr ""
 
-#: lib/action.php:433
+#: lib/action.php:424
 msgid "Primary site navigation"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Personal"
-#: lib/action.php:439
+#: lib/action.php:430
 msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:442
+#: lib/action.php:433
 #, fuzzy
 msgctxt "MENU"
 msgid "Personal"
 msgstr "地點"
 
 #. TRANS: Tooltip for main menu option "Account"
-#: lib/action.php:444
+#: lib/action.php:435
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "更改密碼"
 
-#: lib/action.php:447
-#, fuzzy
-msgctxt "MENU"
-msgid "Account"
-msgstr "關於"
-
 #. TRANS: Tooltip for main menu option "Services"
-#: lib/action.php:450
+#: lib/action.php:440
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "無法連結到伺服器:%s"
 
-#: lib/action.php:453
-#, fuzzy
-msgctxt "MENU"
+#: lib/action.php:443
 msgid "Connect"
 msgstr "連結"
 
 #. TRANS: Tooltip for menu option "Admin"
-#: lib/action.php:457
+#: lib/action.php:446
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "確認信箱"
 
-#: lib/action.php:460
+#: lib/action.php:449
 msgctxt "MENU"
 msgid "Admin"
 msgstr ""
 
 #. TRANS: Tooltip for main menu option "Invite"
-#: lib/action.php:464
+#: lib/action.php:453
 #, php-format
 msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:467
+#: lib/action.php:456
 #, fuzzy
 msgctxt "MENU"
 msgid "Invite"
 msgstr "尺寸錯誤"
 
 #. TRANS: Tooltip for main menu option "Logout"
-#: lib/action.php:473
+#: lib/action.php:462
 msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:476
+#: lib/action.php:465
 #, fuzzy
 msgctxt "MENU"
 msgid "Logout"
 msgstr "登出"
 
 #. TRANS: Tooltip for main menu option "Register"
-#: lib/action.php:481
+#: lib/action.php:470
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "新增帳號"
 
-#: lib/action.php:484
+#: lib/action.php:473
 #, fuzzy
 msgctxt "MENU"
 msgid "Register"
 msgstr "所有訂閱"
 
 #. TRANS: Tooltip for main menu option "Login"
-#: lib/action.php:487
+#: lib/action.php:476
 msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:490
+#: lib/action.php:479
 #, fuzzy
 msgctxt "MENU"
 msgid "Login"
 msgstr "登入"
 
 #. TRANS: Tooltip for main menu option "Help"
-#: lib/action.php:493
+#: lib/action.php:482
 #, fuzzy
 msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "求救"
 
-#: lib/action.php:496
+#: lib/action.php:485
 #, fuzzy
 msgctxt "MENU"
 msgid "Help"
 msgstr "求救"
 
 #. TRANS: Tooltip for main menu option "Search"
-#: lib/action.php:499
+#: lib/action.php:488
 msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:502
+#: lib/action.php:491
 msgctxt "MENU"
 msgid "Search"
 msgstr ""
 
 #. TRANS: DT element for site notice. String is hidden in default CSS.
-#: lib/action.php:524
+#. TRANS: Menu item for site administration
+#: lib/action.php:513 lib/adminpanelaction.php:398
 #, fuzzy
 msgid "Site notice"
 msgstr "新訊息"
 
-#: lib/action.php:590
+#: lib/action.php:579
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:656
+#: lib/action.php:645
 #, fuzzy
 msgid "Page notice"
 msgstr "新訊息"
 
-#: lib/action.php:758
+#: lib/action.php:747
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:763
+#: lib/action.php:752
 msgid "Help"
 msgstr "求救"
 
-#: lib/action.php:765
+#: lib/action.php:754
 msgid "About"
 msgstr "關於"
 
-#: lib/action.php:767
+#: lib/action.php:756
 msgid "FAQ"
 msgstr "常見問題"
 
-#: lib/action.php:771
+#: lib/action.php:760
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:774
+#: lib/action.php:763
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:776
+#: lib/action.php:765
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:780
+#: lib/action.php:769
 msgid "Contact"
 msgstr "好友名單"
 
-#: lib/action.php:782
+#: lib/action.php:771
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:810
+#: lib/action.php:799
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:813
+#: lib/action.php:802
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4705,12 +4783,12 @@ msgstr ""
 "**%%site.name%%**是由[%%site.broughtby%%](%%site.broughtbyurl%%)所提供的微型"
 "部落格服務"
 
-#: lib/action.php:815
+#: lib/action.php:804
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%**是個微型部落格"
 
-#: lib/action.php:817
+#: lib/action.php:806
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4718,55 +4796,55 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:832
+#: lib/action.php:821
 #, fuzzy
 msgid "Site content license"
 msgstr "新訊息"
 
-#: lib/action.php:837
+#: lib/action.php:826
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:842
+#: lib/action.php:831
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:845
+#: lib/action.php:834
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:858
+#: lib/action.php:847
 msgid "All "
 msgstr ""
 
-#: lib/action.php:864
+#: lib/action.php:853
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1163
+#: lib/action.php:1152
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1172
+#: lib/action.php:1161
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1180
+#: lib/action.php:1169
 #, fuzzy
 msgid "Before"
 msgstr "之前的內容»"
 
-#: lib/activity.php:449
+#: lib/activity.php:453
 msgid "Can't handle remote content yet."
 msgstr ""
 
-#: lib/activity.php:477
+#: lib/activity.php:481
 msgid "Can't handle embedded XML content yet."
 msgstr ""
 
-#: lib/activity.php:481
+#: lib/activity.php:485
 msgid "Can't handle embedded Base64 content yet."
 msgstr ""
 
@@ -4781,95 +4859,86 @@ msgid "Changes to that panel are not allowed."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:211
+#: lib/adminpanelaction.php:229
 msgid "showForm() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:241
+#: lib/adminpanelaction.php:259
 msgid "saveSettings() not implemented."
 msgstr ""
 
 #. TRANS: Client error message
-#: lib/adminpanelaction.php:265
+#: lib/adminpanelaction.php:283
 msgid "Unable to delete design setting."
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:330
+#: lib/adminpanelaction.php:348
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "確認信箱"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:332
+#: lib/adminpanelaction.php:350
 #, fuzzy
 msgctxt "MENU"
 msgid "Site"
 msgstr "新訊息"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:338
+#: lib/adminpanelaction.php:356
 #, fuzzy
 msgid "Design configuration"
 msgstr "確認信箱"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:340
+#: lib/adminpanelaction.php:358
 #, fuzzy
 msgctxt "MENU"
 msgid "Design"
 msgstr "地點"
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:346
+#: lib/adminpanelaction.php:364
 #, fuzzy
 msgid "User configuration"
 msgstr "確認信箱"
 
 #. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:348
-msgctxt "MENU"
+#: lib/adminpanelaction.php:366 lib/personalgroupnav.php:115
 msgid "User"
 msgstr ""
 
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:354
+#: lib/adminpanelaction.php:372
 #, fuzzy
 msgid "Access configuration"
 msgstr "確認信箱"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:356
-#, fuzzy
-msgctxt "MENU"
-msgid "Access"
-msgstr "接受"
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:362
+#: lib/adminpanelaction.php:380
 #, fuzzy
 msgid "Paths configuration"
 msgstr "確認信箱"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:364
-msgctxt "MENU"
-msgid "Paths"
-msgstr ""
-
 #. TRANS: Menu item title/tooltip
-#: lib/adminpanelaction.php:370
+#: lib/adminpanelaction.php:388
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "確認信箱"
 
-#. TRANS: Menu item for site administration
-#: lib/adminpanelaction.php:372
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:396
 #, fuzzy
-msgctxt "MENU"
-msgid "Sessions"
-msgstr "地點"
+msgid "Edit site notice"
+msgstr "新訊息"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:404
+#, fuzzy
+msgid "Snapshots configuration"
+msgstr "確認信箱"
 
 #: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
@@ -5056,12 +5125,12 @@ msgstr "%1$s的狀態是%2$s"
 msgid "Fullname: %s"
 msgstr "全名"
 
-#: lib/command.php:312 lib/mail.php:254
+#: lib/command.php:312 lib/mail.php:258
 #, php-format
 msgid "Location: %s"
 msgstr ""
 
-#: lib/command.php:315 lib/mail.php:256
+#: lib/command.php:315 lib/mail.php:260
 #, php-format
 msgid "Homepage: %s"
 msgstr ""
@@ -5361,6 +5430,11 @@ msgstr ""
 msgid "Go"
 msgstr ""
 
+#: lib/grantroleform.php:91
+#, php-format
+msgid "Grant this user the \"%s\" role"
+msgstr ""
+
 #: lib/groupeditform.php:163
 msgid "URL of the homepage or blog of the group or topic"
 msgstr ""
@@ -5503,11 +5577,11 @@ msgstr "使用者名稱或密碼無效"
 msgid "Sign up for a new account"
 msgstr "新增帳號"
 
-#: lib/mail.php:172
+#: lib/mail.php:173
 msgid "Email address confirmation"
 msgstr "確認信箱"
 
-#: lib/mail.php:174
+#: lib/mail.php:175
 #, php-format
 msgid ""
 "Hey, %s.\n"
@@ -5524,12 +5598,12 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: lib/mail.php:236
+#: lib/mail.php:240
 #, php-format
 msgid "%1$s is now listening to your notices on %2$s."
 msgstr "現在%1$s在%2$s成為你的粉絲囉"
 
-#: lib/mail.php:241
+#: lib/mail.php:245
 #, fuzzy, php-format
 msgid ""
 "%1$s is now listening to your notices on %2$s.\n"
@@ -5551,17 +5625,17 @@ msgstr ""
 "%4$s.\n"
 "敬上。\n"
 
-#: lib/mail.php:258
+#: lib/mail.php:262
 #, fuzzy, php-format
 msgid "Bio: %s"
 msgstr "自我介紹"
 
-#: lib/mail.php:286
+#: lib/mail.php:290
 #, php-format
 msgid "New email address for posting to %s"
 msgstr ""
 
-#: lib/mail.php:289
+#: lib/mail.php:293
 #, php-format
 msgid ""
 "You have a new posting address on %1$s.\n"
@@ -5574,21 +5648,21 @@ msgid ""
 "%4$s"
 msgstr ""
 
-#: lib/mail.php:413
+#: lib/mail.php:417
 #, php-format
 msgid "%s status"
 msgstr ""
 
-#: lib/mail.php:439
+#: lib/mail.php:443
 msgid "SMS confirmation"
 msgstr ""
 
-#: lib/mail.php:463
+#: lib/mail.php:467
 #, php-format
 msgid "You've been nudged by %s"
 msgstr ""
 
-#: lib/mail.php:467
+#: lib/mail.php:471
 #, php-format
 msgid ""
 "%1$s (%2$s) is wondering what you are up to these days and is inviting you "
@@ -5604,12 +5678,12 @@ msgid ""
 "%4$s\n"
 msgstr ""
 
-#: lib/mail.php:510
+#: lib/mail.php:517
 #, php-format
 msgid "New private message from %s"
 msgstr ""
 
-#: lib/mail.php:514
+#: lib/mail.php:521
 #, php-format
 msgid ""
 "%1$s (%2$s) sent you a private message:\n"
@@ -5628,12 +5702,12 @@ msgid ""
 "%5$s\n"
 msgstr ""
 
-#: lib/mail.php:559
+#: lib/mail.php:568
 #, fuzzy, php-format
 msgid "%s (@%s) added your notice as a favorite"
 msgstr "現在%1$s在%2$s成為你的粉絲囉"
 
-#: lib/mail.php:561
+#: lib/mail.php:570
 #, php-format
 msgid ""
 "%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n"
@@ -5654,12 +5728,12 @@ msgid ""
 "%6$s\n"
 msgstr ""
 
-#: lib/mail.php:624
+#: lib/mail.php:635
 #, php-format
 msgid "%s (@%s) sent a notice to your attention"
 msgstr ""
 
-#: lib/mail.php:626
+#: lib/mail.php:637
 #, php-format
 msgid ""
 "%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n"
@@ -5907,10 +5981,6 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
-#: lib/personalgroupnav.php:115
-msgid "User"
-msgstr ""
-
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5936,7 +6006,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
+#: lib/profileaction.php:109 lib/profileaction.php:194 lib/subgroupnav.php:82
 msgid "Subscriptions"
 msgstr ""
 
@@ -5944,24 +6014,24 @@ msgstr ""
 msgid "All subscriptions"
 msgstr "所有訂閱"
 
-#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90
+#: lib/profileaction.php:142 lib/profileaction.php:203 lib/subgroupnav.php:90
 msgid "Subscribers"
 msgstr ""
 
-#: lib/profileaction.php:157
+#: lib/profileaction.php:159
 #, fuzzy
 msgid "All subscribers"
 msgstr "所有訂閱"
 
-#: lib/profileaction.php:178
+#: lib/profileaction.php:180
 msgid "User ID"
 msgstr ""
 
-#: lib/profileaction.php:183
+#: lib/profileaction.php:185
 msgid "Member since"
 msgstr "何時加入會員的呢?"
 
-#: lib/profileaction.php:245
+#: lib/profileaction.php:247
 msgid "All groups"
 msgstr ""
 
@@ -6004,7 +6074,12 @@ msgstr "無此通知"
 msgid "Repeat this notice"
 msgstr "無此通知"
 
-#: lib/router.php:668
+#: lib/revokeroleform.php:91
+#, fuzzy, php-format
+msgid "Revoke the \"%s\" role from this user"
+msgstr "無此使用者"
+
+#: lib/router.php:671
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6165,47 +6240,62 @@ msgstr ""
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:1013
-msgid "a few seconds ago"
+#: lib/userprofile.php:352
+#, fuzzy
+msgid "User role"
+msgstr "無此通知"
+
+#: lib/userprofile.php:354
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#: lib/userprofile.php:355
+msgctxt "role"
+msgid "Moderator"
 msgstr ""
 
 #: lib/util.php:1015
-msgid "about a minute ago"
+msgid "a few seconds ago"
 msgstr ""
 
 #: lib/util.php:1017
+msgid "about a minute ago"
+msgstr ""
+
+#: lib/util.php:1019
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:1019
+#: lib/util.php:1021
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:1021
+#: lib/util.php:1023
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:1023
+#: lib/util.php:1025
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:1025
+#: lib/util.php:1027
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:1027
+#: lib/util.php:1029
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:1029
+#: lib/util.php:1031
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:1031
+#: lib/util.php:1033
 msgid "about a year ago"
 msgstr ""
 
diff --git a/plugins/Autocomplete/jquery-autocomplete/indicator.gif b/plugins/Autocomplete/jquery-autocomplete/indicator.gif
new file mode 100644 (file)
index 0000000..d0bce15
Binary files /dev/null and b/plugins/Autocomplete/jquery-autocomplete/indicator.gif differ
index 483b060abdba12d03806da23eccc0c26a129b063..203e5fe420c6e6f1e09e1bb172ab47f1c8466c50 100644 (file)
@@ -137,6 +137,7 @@ class CasAuthenticationPlugin extends AuthenticationPlugin
         $casSettings['server']=$this->server;
         $casSettings['port']=$this->port;
         $casSettings['path']=$this->path;
+        $casSettings['takeOverLogin']=$this->takeOverLogin;
     }
 
     function onPluginVersion(&$versions)
index 390a75d8b417261b8cdaf280913947b64174a8e9..a66774dc17e911caf71d08069d648c0485020817 100644 (file)
@@ -54,9 +54,18 @@ class CasloginAction extends Action
                 // We don't have to return to it again
                 common_set_returnto(null);
             } else {
-                $url = common_local_url('all',
-                                    array('nickname' =>
-                                          $user->nickname));
+                if(common_config('site', 'private') && $casSettings['takeOverLogin']) {
+                    //SSO users expect to just go to the URL they entered
+                    //if we don't have a returnto set, the user entered the
+                    //main StatusNet url, so send them there.
+                    $url = common_local_url('public');
+                } else {
+                    //With normal logins (regular form-based username/password),
+                    //the user would expect to go to their home after logging in.
+                    $url = common_local_url('public',
+                                        array('nickname' =>
+                                              $user->nickname));
+                }
             }
 
             common_redirect($url, 303);
index f5ea0b12a7b2094fd580afbba9c41adf1eafaee7..e754374198d1d9aa3669ba7464b0aec432c84d5b 100644 (file)
-<?php
-
-// commented in 0.4.22-RC2 for Sylvain Derosiaux
-// error_reporting(E_ALL ^ E_NOTICE);
-
-//
-// hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI'] in IIS
-//
-if (!$_SERVER['REQUEST_URI']) {
-       $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'];
-}
-
-//
-// another one by Vangelis Haniotakis also to make phpCAS work with PHP5
-//
-if (version_compare(PHP_VERSION,'5','>=')) {
-       require_once(dirname(__FILE__).'/CAS/domxml-php4-php5.php');
-}
-
-/**
- * @file CAS/CAS.php
- * Interface class of the phpCAS library
- *
- * @ingroup public
- */
-
-// ########################################################################
-//  CONSTANTS
-// ########################################################################
-
-// ------------------------------------------------------------------------
-//  CAS VERSIONS
-// ------------------------------------------------------------------------
-
-/**
- * phpCAS version. accessible for the user by phpCAS::getVersion().
- */
-define('PHPCAS_VERSION','1.0.1');
-
-// ------------------------------------------------------------------------
-//  CAS VERSIONS
-// ------------------------------------------------------------------------
- /**
-  * @addtogroup public
-  * @{
-  */
-
-/**
- * CAS version 1.0
- */
-define("CAS_VERSION_1_0",'1.0');
-/*!
- * CAS version 2.0
- */
-define("CAS_VERSION_2_0",'2.0');
-
-/** @} */
- /**
-  * @addtogroup publicPGTStorage
-  * @{
-  */
-// ------------------------------------------------------------------------
-//  FILE PGT STORAGE
-// ------------------------------------------------------------------------
- /**
-  * Default path used when storing PGT's to file
-  */
-define("CAS_PGT_STORAGE_FILE_DEFAULT_PATH",'/tmp');
-/**
- * phpCAS::setPGTStorageFile()'s 2nd parameter to write plain text files
- */
-define("CAS_PGT_STORAGE_FILE_FORMAT_PLAIN",'plain');
-/**
- * phpCAS::setPGTStorageFile()'s 2nd parameter to write xml files
- */
-define("CAS_PGT_STORAGE_FILE_FORMAT_XML",'xml');
-/**
- * Default format used when storing PGT's to file
- */
-define("CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT",CAS_PGT_STORAGE_FILE_FORMAT_PLAIN);
-// ------------------------------------------------------------------------
-//  DATABASE PGT STORAGE
-// ------------------------------------------------------------------------
- /**
-  * default database type when storing PGT's to database
-  */
-define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE",'mysql');
-/**
- * default host when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME",'localhost');
-/**
- * default port when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_PORT",'');
-/**
- * default database when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE",'phpCAS');
-/**
- * default table when storing PGT's to database
- */
-define("CAS_PGT_STORAGE_DB_DEFAULT_TABLE",'pgt');
-
-/** @} */
-// ------------------------------------------------------------------------
-// SERVICE ACCESS ERRORS
-// ------------------------------------------------------------------------
- /**
-  * @addtogroup publicServices
-  * @{
-  */
-
-/**
- * phpCAS::service() error code on success
- */
-define("PHPCAS_SERVICE_OK",0);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the CAS server did not respond.
- */
-define("PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE",1);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the response of the CAS server was ill-formed.
- */
-define("PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE",2);
-/**
- * phpCAS::service() error code when the PT could not retrieve because
- * the CAS server did not want to.
- */
-define("PHPCAS_SERVICE_PT_FAILURE",3);
-/**
- * phpCAS::service() error code when the service was not available.
- */
-define("PHPCAS_SERVICE_NOT AVAILABLE",4);
-
-/** @} */
-// ------------------------------------------------------------------------
-//  LANGUAGES
-// ------------------------------------------------------------------------
- /**
-  * @addtogroup publicLang
-  * @{
-  */
-
-define("PHPCAS_LANG_ENGLISH",    'english');
-define("PHPCAS_LANG_FRENCH",     'french');
-define("PHPCAS_LANG_GREEK",      'greek');
-define("PHPCAS_LANG_GERMAN",     'german');
-define("PHPCAS_LANG_JAPANESE",   'japanese');
-define("PHPCAS_LANG_SPANISH",    'spanish');
-define("PHPCAS_LANG_CATALAN",    'catalan');
-
-/** @} */
-
-/**
- * @addtogroup internalLang
- * @{
- */
-
-/**
- * phpCAS default language (when phpCAS::setLang() is not used)
- */
-define("PHPCAS_LANG_DEFAULT", PHPCAS_LANG_ENGLISH);
-
-/** @} */
-// ------------------------------------------------------------------------
-//  DEBUG
-// ------------------------------------------------------------------------
- /**
-  * @addtogroup publicDebug
-  * @{
-  */
-
-/**
- * The default directory for the debug file under Unix.
- */
-define('DEFAULT_DEBUG_DIR','/tmp/');
-
-/** @} */
-// ------------------------------------------------------------------------
-//  MISC
-// ------------------------------------------------------------------------
- /**
-  * @addtogroup internalMisc
-  * @{
-  */
-
-/**
- * This global variable is used by the interface class phpCAS.
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_CLIENT']  = null;
-
-/**
- * This global variable is used to store where the initializer is called from 
- * (to print a comprehensive error in case of multiple calls).
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_INIT_CALL'] = array('done' => FALSE,
-       'file' => '?',
-       'line' => -1,
-       'method' => '?');
-
-/**
- * This global variable is used to store where the method checking
- * the authentication is called from (to print comprehensive errors)
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_AUTH_CHECK_CALL'] = array('done' => FALSE,
-       'file' => '?',
-       'line' => -1,
-       'method' => '?',
-       'result' => FALSE);
-
-/**
- * This global variable is used to store phpCAS debug mode.
- *
- * @hideinitializer
- */
-$GLOBALS['PHPCAS_DEBUG']  = array('filename' => FALSE,
-       'indent' => 0,
-       'unique_id' => '');
-
-/** @} */
-
-// ########################################################################
-//  CLIENT CLASS
-// ########################################################################
-
-// include client class
-include_once(dirname(__FILE__).'/CAS/client.php');
-
-// ########################################################################
-//  INTERFACE CLASS
-// ########################################################################
-
-/**
- * @class phpCAS
- * The phpCAS class is a simple container for the phpCAS library. It provides CAS
- * authentication for web applications written in PHP.
- *
- * @ingroup public
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * \internal All its methods access the same object ($PHPCAS_CLIENT, declared 
- * at the end of CAS/client.php).
- */
-
-
-
-class phpCAS
-{
-       
-       // ########################################################################
-       //  INITIALIZATION
-       // ########################################################################
-       
-       /**
-        * @addtogroup publicInit
-        * @{
-        */
-       
-       /**
-        * phpCAS client initializer.
-        * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
-        * called, only once, and before all other methods (except phpCAS::getVersion()
-        * and phpCAS::setDebug()).
-        *
-        * @param $server_version the version of the CAS server
-        * @param $server_hostname the hostname of the CAS server
-        * @param $server_port the port the CAS server is running on
-        * @param $server_uri the URI the CAS server is responding on
-        * @param $start_session Have phpCAS start PHP sessions (default true)
-        *
-        * @return a newly created CASClient object
-        */
-       function client($server_version,
-                                       $server_hostname,
-                                       $server_port,
-                                       $server_uri,
-                                       $start_session = true)
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
-               
-               phpCAS::traceBegin();
-               if ( is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error($PHPCAS_INIT_CALL['method'].'() has already been called (at '.$PHPCAS_INIT_CALL['file'].':'.$PHPCAS_INIT_CALL['line'].')');
-               }
-               if ( gettype($server_version) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_version (should be `string\')');
-               }
-               if ( gettype($server_hostname) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');
-               }
-               if ( gettype($server_port) != 'integer' ) {
-                       phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');
-               }
-               if ( gettype($server_uri) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');
-               }
-               
-               // store where the initialzer is called from
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_INIT_CALL = array('done' => TRUE,
-                       'file' => $dbg[0]['file'],
-                       'line' => $dbg[0]['line'],
-                       'method' => __CLASS__.'::'.__FUNCTION__);
-               
-               // initialize the global object $PHPCAS_CLIENT
-               $PHPCAS_CLIENT = new CASClient($server_version,FALSE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_session);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * phpCAS proxy initializer.
-        * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
-        * called, only once, and before all other methods (except phpCAS::getVersion()
-        * and phpCAS::setDebug()).
-        *
-        * @param $server_version the version of the CAS server
-        * @param $server_hostname the hostname of the CAS server
-        * @param $server_port the port the CAS server is running on
-        * @param $server_uri the URI the CAS server is responding on
-        * @param $start_session Have phpCAS start PHP sessions (default true)
-        *
-        * @return a newly created CASClient object
-        */
-       function proxy($server_version,
-                                  $server_hostname,
-                                  $server_port,
-                                  $server_uri,
-                                  $start_session = true)
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
-               
-               phpCAS::traceBegin();
-               if ( is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error($PHPCAS_INIT_CALL['method'].'() has already been called (at '.$PHPCAS_INIT_CALL['file'].':'.$PHPCAS_INIT_CALL['line'].')');
-               }
-               if ( gettype($server_version) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_version (should be `string\')');
-               }
-               if ( gettype($server_hostname) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');
-               }
-               if ( gettype($server_port) != 'integer' ) {
-                       phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');
-               }
-               if ( gettype($server_uri) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');
-               }
-               
-               // store where the initialzer is called from
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_INIT_CALL = array('done' => TRUE,
-                       'file' => $dbg[0]['file'],
-                       'line' => $dbg[0]['line'],
-                       'method' => __CLASS__.'::'.__FUNCTION__);
-               
-               // initialize the global object $PHPCAS_CLIENT
-               $PHPCAS_CLIENT = new CASClient($server_version,TRUE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_session);
-               phpCAS::traceEnd();
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  DEBUGGING
-       // ########################################################################
-       
-       /**
-        * @addtogroup publicDebug
-        * @{
-        */
-       
-       /**
-        * Set/unset debug mode
-        *
-        * @param $filename the name of the file used for logging, or FALSE to stop debugging.
-        */
-       function setDebug($filename='')
-               {
-               global $PHPCAS_DEBUG;
-               
-               if ( $filename != FALSE && gettype($filename) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $dbg (should be FALSE or the name of the log file)');
-               }
-               
-               if ( empty($filename) ) {
-                       if ( preg_match('/^Win.*/',getenv('OS')) ) {
-                               if ( isset($_ENV['TMP']) ) {
-                                       $debugDir = $_ENV['TMP'].'/';
-                               } else if ( isset($_ENV['TEMP']) ) {
-                                       $debugDir = $_ENV['TEMP'].'/';
-                               } else {
-                                       $debugDir = '';
-                               }
-                       } else {
-                               $debugDir = DEFAULT_DEBUG_DIR;
-                       }
-                       $filename = $debugDir . 'phpCAS.log';
-               }
-               
-               if ( empty($PHPCAS_DEBUG['unique_id']) ) {
-                       $PHPCAS_DEBUG['unique_id'] = substr(strtoupper(md5(uniqid(''))),0,4);
-               }
-               
-               $PHPCAS_DEBUG['filename'] = $filename;
-               
-               phpCAS::trace('START ******************');
-               }
-       
-       /** @} */
-       /**
-        * @addtogroup internalDebug
-        * @{
-        */
-       
-       /**
-        * This method is a wrapper for debug_backtrace() that is not available 
-        * in all PHP versions (>= 4.3.0 only)
-        */
-       function backtrace()
-               {
-               if ( function_exists('debug_backtrace') ) {
-                       return debug_backtrace();
-               } else {
-                       // poor man's hack ... but it does work ...
-                       return array();
-               }
-               }
-       
-       /**
-        * Logs a string in debug mode.
-        *
-        * @param $str the string to write
-        *
-        * @private
-        */
-       function log($str)
-               {
-               $indent_str = ".";
-               global $PHPCAS_DEBUG;
-               
-               if ( $PHPCAS_DEBUG['filename'] ) {
-                       for ($i=0;$i<$PHPCAS_DEBUG['indent'];$i++) {
-                               $indent_str .= '|    ';
-                       }
-                       error_log($PHPCAS_DEBUG['unique_id'].' '.$indent_str.$str."\n",3,$PHPCAS_DEBUG['filename']);
-               }
-               
-               }
-       
-       /**
-        * This method is used by interface methods to print an error and where the function
-        * was originally called from.
-        *
-        * @param $msg the message to print
-        *
-        * @private
-        */
-       function error($msg)
-               {
-               $dbg = phpCAS::backtrace();
-               $function = '?';
-               $file = '?';
-               $line = '?';
-               if ( is_array($dbg) ) {
-                       for ( $i=1; $i<sizeof($dbg); $i++) {
-                               if ( is_array($dbg[$i]) ) {
-                                       if ( $dbg[$i]['class'] == __CLASS__ ) {
-                                               $function = $dbg[$i]['function'];
-                                               $file = $dbg[$i]['file'];
-                                               $line = $dbg[$i]['line'];
-                                       }
-                               }
-                       }
-               }
-               echo "<br />\n<b>phpCAS error</b>: <font color=\"FF0000\"><b>".__CLASS__."::".$function.'(): '.htmlentities($msg)."</b></font> in <b>".$file."</b> on line <b>".$line."</b><br />\n";
-               phpCAS::trace($msg);
-               phpCAS::traceExit();
-               exit();
-               }
-       
-       /**
-        * This method is used to log something in debug mode.
-        */
-       function trace($str)
-               {
-               $dbg = phpCAS::backtrace();
-               phpCAS::log($str.' ['.basename($dbg[1]['file']).':'.$dbg[1]['line'].']');
-               }
-       
-       /**
-        * This method is used to indicate the start of the execution of a function in debug mode.
-        */
-       function traceBegin()
-               {
-               global $PHPCAS_DEBUG;
-               
-               $dbg = phpCAS::backtrace();
-               $str = '=> ';
-               if ( !empty($dbg[2]['class']) ) {
-                       $str .= $dbg[2]['class'].'::';
-               }
-               $str .= $dbg[2]['function'].'(';      
-               if ( is_array($dbg[2]['args']) ) {
-                       foreach ($dbg[2]['args'] as $index => $arg) {
-                               if ( $index != 0 ) {
-                                       $str .= ', ';
-                               }
-                               $str .= str_replace("\n","",var_export($arg,TRUE));
-                       }
-               }
-               $str .= ') ['.basename($dbg[2]['file']).':'.$dbg[2]['line'].']';
-               phpCAS::log($str);
-               $PHPCAS_DEBUG['indent'] ++;
-               }
-       
-       /**
-        * This method is used to indicate the end of the execution of a function in debug mode.
-        *
-        * @param $res the result of the function
-        */
-       function traceEnd($res='')
-               {
-               global $PHPCAS_DEBUG;
-               
-               $PHPCAS_DEBUG['indent'] --;
-               $dbg = phpCAS::backtrace();
-               $str = '';
-               $str .= '<= '.str_replace("\n","",var_export($res,TRUE));
-               phpCAS::log($str);
-               }
-       
-       /**
-        * This method is used to indicate the end of the execution of the program
-        */
-       function traceExit()
-               {
-               global $PHPCAS_DEBUG;
-               
-               phpCAS::log('exit()');
-               while ( $PHPCAS_DEBUG['indent'] > 0 ) {
-                       phpCAS::log('-');
-                       $PHPCAS_DEBUG['indent'] --;
-               }
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  INTERNATIONALIZATION
-       // ########################################################################
-       /**
-        * @addtogroup publicLang
-        * @{
-        */
-       
-       /**
-        * This method is used to set the language used by phpCAS. 
-        * @note Can be called only once.
-        *
-        * @param $lang a string representing the language.
-        *
-        * @sa PHPCAS_LANG_FRENCH, PHPCAS_LANG_ENGLISH
-        */
-       function setLang($lang)
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               if ( gettype($lang) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $lang (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setLang($lang);
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  VERSION
-       // ########################################################################
-       /**
-        * @addtogroup public
-        * @{
-        */
-       
-       /**
-        * This method returns the phpCAS version.
-        *
-        * @return the phpCAS version.
-        */
-       function getVersion()
-               {
-               return PHPCAS_VERSION;
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  HTML OUTPUT
-       // ########################################################################
-       /**
-        * @addtogroup publicOutput
-        * @{
-        */
-       
-       /**
-        * This method sets the HTML header used for all outputs.
-        *
-        * @param $header the HTML header.
-        */
-       function setHTMLHeader($header)
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               if ( gettype($header) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $header (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setHTMLHeader($header);
-               }
-       
-       /**
-        * This method sets the HTML footer used for all outputs.
-        *
-        * @param $footer the HTML footer.
-        */
-       function setHTMLFooter($footer)
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               if ( gettype($footer) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $footer (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setHTMLFooter($footer);
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  PGT STORAGE
-       // ########################################################################
-       /**
-        * @addtogroup publicPGTStorage
-        * @{
-        */
-       
-       /**
-        * This method is used to tell phpCAS to store the response of the
-        * CAS server to PGT requests onto the filesystem. 
-        *
-        * @param $format the format used to store the PGT's (`plain' and `xml' allowed)
-        * @param $path the path where the PGT's should be stored
-        */
-       function setPGTStorageFile($format='',
-               $path='')
-               {
-               global $PHPCAS_CLIENT,$PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_CLIENT->isProxy() ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( $PHPCAS_AUTH_CHECK_CALL['done'] ) {
-                       phpCAS::error('this method should only be called before '.$PHPCAS_AUTH_CHECK_CALL['method'].'() (called at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].')');
-               }
-               if ( gettype($format) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $format (should be `string\')');
-               }
-               if ( gettype($path) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $format (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setPGTStorageFile($format,$path);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * This method is used to tell phpCAS to store the response of the
-        * CAS server to PGT requests into a database. 
-        * @note The connection to the database is done only when needed. 
-        * As a consequence, bad parameters are detected only when 
-        * initializing PGT storage, except in debug mode.
-        *
-        * @param $user the user to access the data with
-        * @param $password the user's password
-        * @param $database_type the type of the database hosting the data
-        * @param $hostname the server hosting the database
-        * @param $port the port the server is listening on
-        * @param $database the name of the database
-        * @param $table the name of the table storing the data
-        */
-       function setPGTStorageDB($user,
-                                                        $password,
-                                                        $database_type='',
-                                                                $hostname='',
-                                                                        $port=0,
-                                                                                $database='',
-                                                                                        $table='')
-               {
-               global $PHPCAS_CLIENT,$PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_CLIENT->isProxy() ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( $PHPCAS_AUTH_CHECK_CALL['done'] ) {
-                       phpCAS::error('this method should only be called before '.$PHPCAS_AUTH_CHECK_CALL['method'].'() (called at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].')');
-               }
-               if ( gettype($user) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $user (should be `string\')');
-               }
-               if ( gettype($password) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $password (should be `string\')');
-               }
-               if ( gettype($database_type) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $database_type (should be `string\')');
-               }
-               if ( gettype($hostname) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $hostname (should be `string\')');
-               }
-               if ( gettype($port) != 'integer' ) {
-                       phpCAS::error('type mismatched for parameter $port (should be `integer\')');
-               }
-               if ( gettype($database) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $database (should be `string\')');
-               }
-               if ( gettype($table) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $table (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setPGTStorageDB($this,$user,$password,$hostname,$port,$database,$table);
-               phpCAS::traceEnd();
-               }
-       
-       /** @} */
-       // ########################################################################
-       // ACCESS TO EXTERNAL SERVICES
-       // ########################################################################
-       /**
-        * @addtogroup publicServices
-        * @{
-        */
-       
-       /**
-        * This method is used to access an HTTP[S] service.
-        * 
-        * @param $url the service to access.
-        * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-        * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-        * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-        * @param $output the output of the service (also used to give an error
-        * message on failure).
-        *
-        * @return TRUE on success, FALSE otherwise (in this later case, $err_code
-        * gives the reason why it failed and $output contains an error message).
-        */
-       function serviceWeb($url,&$err_code,&$output)
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_CLIENT->isProxy() ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {
-                       phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {
-                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');
-               }
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               
-               $res = $PHPCAS_CLIENT->serviceWeb($url,$err_code,$output);
-               
-               phpCAS::traceEnd($res);
-               return $res;
-               }
-       
-       /**
-        * This method is used to access an IMAP/POP3/NNTP service.
-        * 
-        * @param $url a string giving the URL of the service, including the mailing box
-        * for IMAP URLs, as accepted by imap_open().
-        * @param $flags options given to imap_open().
-        * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
-        * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
-        * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.
-        * @param $err_msg an error message on failure
-        * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
-        * on success, FALSE on error).
-        *
-        * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
-        * gives the reason why it failed and $err_msg contains an error message).
-        */
-       function serviceMail($url,$flags,&$err_code,&$err_msg,&$pt)
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_CLIENT->isProxy() ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {
-                       phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {
-                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');
-               }
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               
-               if ( gettype($flags) != 'integer' ) {
-                       phpCAS::error('type mismatched for parameter $flags (should be `integer\')');
-               }
-               
-               $res = $PHPCAS_CLIENT->serviceMail($url,$flags,$err_code,$err_msg,$pt);
-               
-               phpCAS::traceEnd($res);
-               return $res;
-               }
-       
-       /** @} */
-       // ########################################################################
-       //  AUTHENTICATION
-       // ########################################################################
-       /**
-        * @addtogroup publicAuth
-        * @{
-        */
-       
-       /**
-        * Set the times authentication will be cached before really accessing the CAS server in gateway mode: 
-        * - -1: check only once, and then never again (until you pree login)
-        * - 0: always check
-        * - n: check every "n" time
-        *
-        * @param $n an integer.
-        */
-       function setCacheTimesForAuthRecheck($n)
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               if ( gettype($n) != 'integer' ) {
-                       phpCAS::error('type mismatched for parameter $header (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
-               }
-       
-       /**
-        * This method is called to check if the user is authenticated (use the gateway feature).
-        * @return TRUE when the user is authenticated; otherwise FALSE.
-        */
-       function checkAuthentication()
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               
-               $auth = $PHPCAS_CLIENT->checkAuthentication();
-               
-               // store where the authentication has been checked and the result
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,
-                       'file' => $dbg[0]['file'],
-                       'line' => $dbg[0]['line'],
-                       'method' => __CLASS__.'::'.__FUNCTION__,
-                       'result' => $auth );
-               phpCAS::traceEnd($auth);
-               return $auth; 
-               }
-       
-       /**
-        * This method is called to force authentication if the user was not already 
-        * authenticated. If the user is not authenticated, halt by redirecting to 
-        * the CAS server.
-        */
-       function forceAuthentication()
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               
-               $auth = $PHPCAS_CLIENT->forceAuthentication();
-               
-               // store where the authentication has been checked and the result
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,
-                       'file' => $dbg[0]['file'],
-                       'line' => $dbg[0]['line'],
-                       'method' => __CLASS__.'::'.__FUNCTION__,
-                       'result' => $auth );
-               
-               if ( !$auth ) {
-                       phpCAS::trace('user is not authenticated, redirecting to the CAS server');
-                       $PHPCAS_CLIENT->forceAuthentication();
-               } else {
-                       phpCAS::trace('no need to authenticate (user `'.phpCAS::getUser().'\' is already authenticated)');
-               }
-               
-               phpCAS::traceEnd();
-               return $auth; 
-               }
-       
-       /**
-        * This method is called to renew the authentication.
-        **/
-       function renewAuthentication() {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before'.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               
-               // store where the authentication has been checked and the result
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE, 'file' => $dbg[0]['file'], 'line' => $dbg[0]['line'], 'method' => __CLASS__.'::'.__FUNCTION__, 'result' => $auth );
-               
-               $PHPCAS_CLIENT->renewAuthentication();
-               phpCAS::traceEnd();
-       }
-
-       /**
-        * This method has been left from version 0.4.1 for compatibility reasons.
-        */
-       function authenticate()
-               {
-               phpCAS::error('this method is deprecated. You should use '.__CLASS__.'::forceAuthentication() instead');
-               }
-       
-       /**
-        * This method is called to check if the user is authenticated (previously or by
-        * tickets given in the URL).
-        *
-        * @return TRUE when the user is authenticated.
-        */
-       function isAuthenticated()
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               
-               // call the isAuthenticated method of the global $PHPCAS_CLIENT object
-               $auth = $PHPCAS_CLIENT->isAuthenticated();
-               
-               // store where the authentication has been checked and the result
-               $dbg = phpCAS::backtrace();
-               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,
-                       'file' => $dbg[0]['file'],
-                       'line' => $dbg[0]['line'],
-                       'method' => __CLASS__.'::'.__FUNCTION__,
-                       'result' => $auth );
-               phpCAS::traceEnd($auth);
-               return $auth;
-               }
-       
-       /**
-        * Checks whether authenticated based on $_SESSION. Useful to avoid
-        * server calls.
-        * @return true if authenticated, false otherwise.
-        * @since 0.4.22 by Brendan Arnold
-        */
-       function isSessionAuthenticated ()
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               return($PHPCAS_CLIENT->isSessionAuthenticated());
-               }
-       
-       /**
-        * This method returns the CAS user's login name.
-        * @warning should not be called only after phpCAS::forceAuthentication()
-        * or phpCAS::checkAuthentication().
-        *
-        * @return the login name of the authenticated user
-        */
-       function getUser()
-               {
-               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
-               }
-               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {
-                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');
-               }
-               return $PHPCAS_CLIENT->getUser();
-               }
-       
-    /**
-     * Handle logout requests.
-     */
-    function handleLogoutRequests($check_client=true, $allowed_clients=false)
-        {
-            global $PHPCAS_CLIENT;
-            if ( !is_object($PHPCAS_CLIENT) ) {
-                phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-            }
-            return($PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));
-        }
-   
-       /**
-        * This method returns the URL to be used to login.
-        * or phpCAS::isAuthenticated().
-        *
-        * @return the login name of the authenticated user
-        */
-       function getServerLoginURL()
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               return $PHPCAS_CLIENT->getServerLoginURL();
-               }
-       
-       /**
-        * Set the login URL of the CAS server.
-        * @param $url the login URL
-        * @since 0.4.21 by Wyman Chan
-        */
-       function setServerLoginURL($url='')
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after
-                               '.__CLASS__.'::client()');
-               }
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be
-                       `string\')');
-               }
-               $PHPCAS_CLIENT->setServerLoginURL($url);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * This method returns the URL to be used to login.
-        * or phpCAS::isAuthenticated().
-        *
-        * @return the login name of the authenticated user
-        */
-       function getServerLogoutURL()
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
-               }
-               return $PHPCAS_CLIENT->getServerLogoutURL();
-               }
-       
-       /**
-        * Set the logout URL of the CAS server.
-        * @param $url the logout URL
-        * @since 0.4.21 by Wyman Chan
-        */
-       function setServerLogoutURL($url='')
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after
-                               '.__CLASS__.'::client()');
-               }
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be
-                       `string\')');
-               }
-               $PHPCAS_CLIENT->setServerLogoutURL($url);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * This method is used to logout from CAS.
-        * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
-        * @public
-        */
-       function logout($params = "") {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if (!is_object($PHPCAS_CLIENT)) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }
-               $parsedParams = array();
-               if ($params != "") {
-                       if (is_string($params)) {
-                               phpCAS::error('method `phpCAS::logout($url)\' is now deprecated, use `phpCAS::logoutWithUrl($url)\' instead');
-                       }
-                       if (!is_array($params)) {
-                               phpCAS::error('type mismatched for parameter $params (should be `array\')');
-                       }
-                       foreach ($params as $key => $value) {
-                               if ($key != "service" && $key != "url") {
-                                       phpCAS::error('only `url\' and `service\' parameters are allowed for method `phpCAS::logout($params)\'');
-                               }
-                               $parsedParams[$key] = $value;
-                       }
-               }
-               $PHPCAS_CLIENT->logout($parsedParams);
-               // never reached
-               phpCAS::traceEnd();
-       }
-       
-       /**
-        * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-        * @param $service a URL that will be transmitted to the CAS server
-        */
-       function logoutWithRedirectService($service) {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }
-               if (!is_string($service)) {
-                       phpCAS::error('type mismatched for parameter $service (should be `string\')');
-               }
-               $PHPCAS_CLIENT->logout(array("service" => $service));
-               // never reached
-               phpCAS::traceEnd();
-       }
-       
-       /**
-        * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-        * @param $url a URL that will be transmitted to the CAS server
-        */
-       function logoutWithUrl($url) {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }
-               if (!is_string($url)) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               $PHPCAS_CLIENT->logout(array("url" => $url));
-               // never reached
-               phpCAS::traceEnd();
-       }
-       
-       /**
-        * This method is used to logout from CAS. Halts by redirecting to the CAS server.
-        * @param $service a URL that will be transmitted to the CAS server
-        * @param $url a URL that will be transmitted to the CAS server
-        */
-       function logoutWithRedirectServiceAndUrl($service, $url) {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }
-               if (!is_string($service)) {
-                       phpCAS::error('type mismatched for parameter $service (should be `string\')');
-               }
-               if (!is_string($url)) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               $PHPCAS_CLIENT->logout(array("service" => $service, "url" => $url));
-               // never reached
-               phpCAS::traceEnd();
-       }
-       
-       /**
-        * Set the fixed URL that will be used by the CAS server to transmit the PGT.
-        * When this method is not called, a phpCAS script uses its own URL for the callback.
-        *
-        * @param $url the URL
-        */
-       function setFixedCallbackURL($url='')
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( !$PHPCAS_CLIENT->isProxy() ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setCallbackURL($url);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * Set the fixed URL that will be set as the CAS service parameter. When this
-        * method is not called, a phpCAS script uses its own URL.
-        *
-        * @param $url the URL
-        */
-       function setFixedServiceURL($url)
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }  
-               if ( gettype($url) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $url (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setURL($url);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * Get the URL that is set as the CAS service parameter.
-        */
-       function getServiceURL()
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }  
-               return($PHPCAS_CLIENT->getURL());
-               }
-       
-       /**
-        * Retrieve a Proxy Ticket from the CAS server.
-        */
-       function retrievePT($target_service,&$err_code,&$err_msg)
-               {
-               global $PHPCAS_CLIENT;
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
-               }  
-               if ( gettype($target_service) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $target_service(should be `string\')');
-               }
-               return($PHPCAS_CLIENT->retrievePT($target_service,$err_code,$err_msg));
-               }
-       
-       /**
-        * Set the certificate of the CAS server.
-        *
-        * @param $cert the PEM certificate
-        */
-       function setCasServerCert($cert)
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }  
-               if ( gettype($cert) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $cert (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setCasServerCert($cert);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * Set the certificate of the CAS server CA.
-        *
-        * @param $cert the CA certificate
-        */
-       function setCasServerCACert($cert)
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }  
-               if ( gettype($cert) != 'string' ) {
-                       phpCAS::error('type mismatched for parameter $cert (should be `string\')');
-               }
-               $PHPCAS_CLIENT->setCasServerCACert($cert);
-               phpCAS::traceEnd();
-               }
-       
-       /**
-        * Set no SSL validation for the CAS server.
-        */
-       function setNoCasServerValidation()
-               {
-               global $PHPCAS_CLIENT;
-               phpCAS::traceBegin();
-               if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-               }  
-               $PHPCAS_CLIENT->setNoCasServerValidation();
-               phpCAS::traceEnd();
-               }
-       
-       /** @} */
-       
-  /**
-   * Change CURL options.
-   * CURL is used to connect through HTTPS to CAS server
-   * @param $key the option key
-   * @param $value the value to set
-   */
-   function setExtraCurlOption($key, $value)
-               {
-                 global $PHPCAS_CLIENT;
-                 phpCAS::traceBegin();
-                 if ( !is_object($PHPCAS_CLIENT) ) {
-                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');
-                 }  
-                 $PHPCAS_CLIENT->setExtraCurlOption($key, $value);
-                 phpCAS::traceEnd();
-               }
-
-}
-
-// ########################################################################
-// DOCUMENTATION
-// ########################################################################
-
-// ########################################################################
-//  MAIN PAGE
-
-/**
- * @mainpage
- *
- * The following pages only show the source documentation.
- *
- */
-
-// ########################################################################
-//  MODULES DEFINITION
-
-/** @defgroup public User interface */
-
-/** @defgroup publicInit Initialization
- *  @ingroup public */
-
-/** @defgroup publicAuth Authentication
- *  @ingroup public */
-
-/** @defgroup publicServices Access to external services
- *  @ingroup public */
-
-/** @defgroup publicConfig Configuration
- *  @ingroup public */
-
-/** @defgroup publicLang Internationalization
- *  @ingroup publicConfig */
-
-/** @defgroup publicOutput HTML output
- *  @ingroup publicConfig */
-
-/** @defgroup publicPGTStorage PGT storage
- *  @ingroup publicConfig */
-
-/** @defgroup publicDebug Debugging
- *  @ingroup public */
-
-
-/** @defgroup internal Implementation */
-
-/** @defgroup internalAuthentication Authentication
- *  @ingroup internal */
-
-/** @defgroup internalBasic CAS Basic client features (CAS 1.0, Service Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalProxy CAS Proxy features (CAS 2.0, Proxy Granting Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalPGTStorage PGT storage
- *  @ingroup internalProxy */
-
-/** @defgroup internalPGTStorageDB PGT storage in a database
- *  @ingroup internalPGTStorage */
-
-/** @defgroup internalPGTStorageFile PGT storage on the filesystem
- *  @ingroup internalPGTStorage */
-
-/** @defgroup internalCallback Callback from the CAS server
- *  @ingroup internalProxy */
-
-/** @defgroup internalProxied CAS proxied client features (CAS 2.0, Proxy Tickets)
- *  @ingroup internal */
-
-/** @defgroup internalConfig Configuration
- *  @ingroup internal */
-
-/** @defgroup internalOutput HTML output
- *  @ingroup internalConfig */
-
-/** @defgroup internalLang Internationalization
- *  @ingroup internalConfig
- *
- * To add a new language:
- * - 1. define a new constant PHPCAS_LANG_XXXXXX in CAS/CAS.php
- * - 2. copy any file from CAS/languages to CAS/languages/XXXXXX.php
- * - 3. Make the translations
- */
-
-/** @defgroup internalDebug Debugging
- *  @ingroup internal */
-
-/** @defgroup internalMisc Miscellaneous
- *  @ingroup internal */
-
-// ########################################################################
-//  EXAMPLES
-
-/**
- * @example example_simple.php
- */
- /**
-  * @example example_proxy.php
-  */
-  /**
-   * @example example_proxy2.php
-   */
-   /**
-    * @example example_lang.php
-    */
-    /**
-     * @example example_html.php
-     */
-     /**
-      * @example example_file.php
-      */
-      /**
-       * @example example_db.php
-       */
-       /**
-        * @example example_service.php
-        */
-        /**
-         * @example example_session_proxy.php
-         */
-         /**
-          * @example example_session_service.php
-          */
-          /**
-           * @example example_gateway.php
-           */
-
-
-
-?>
+<?php\r
+\r
+// commented in 0.4.22-RC2 for Sylvain Derosiaux\r
+// error_reporting(E_ALL ^ E_NOTICE);\r
+\r
+//\r
+// hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI'] in IIS\r
+//\r
+if (!$_SERVER['REQUEST_URI']) {\r
+       $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'];\r
+}\r
+\r
+//\r
+// another one by Vangelis Haniotakis also to make phpCAS work with PHP5\r
+//\r
+if (version_compare(PHP_VERSION,'5','>=')) {\r
+       require_once(dirname(__FILE__).'/CAS/domxml-php4-to-php5.php');\r
+}\r
+\r
+/**\r
+ * @file CAS/CAS.php\r
+ * Interface class of the phpCAS library\r
+ *\r
+ * @ingroup public\r
+ */\r
+\r
+// ########################################################################\r
+//  CONSTANTS\r
+// ########################################################################\r
+\r
+// ------------------------------------------------------------------------\r
+//  CAS VERSIONS\r
+// ------------------------------------------------------------------------\r
+\r
+/**\r
+ * phpCAS version. accessible for the user by phpCAS::getVersion().\r
+ */\r
+define('PHPCAS_VERSION','1.1.0RC6');\r
+\r
+// ------------------------------------------------------------------------\r
+//  CAS VERSIONS\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * @addtogroup public\r
+  * @{\r
+  */\r
+\r
+/**\r
+ * CAS version 1.0\r
+ */\r
+define("CAS_VERSION_1_0",'1.0');\r
+/*!\r
+ * CAS version 2.0\r
+ */\r
+define("CAS_VERSION_2_0",'2.0');\r
+\r
+// ------------------------------------------------------------------------\r
+//  SAML defines\r
+// ------------------------------------------------------------------------\r
+\r
+/**\r
+ * SAML protocol\r
+ */\r
+define("SAML_VERSION_1_1", 'S1');\r
+\r
+/**\r
+ * XML header for SAML POST\r
+ */\r
+define("SAML_XML_HEADER", '<?xml version="1.0" encoding="UTF-8"?>');\r
+\r
+/**\r
+ * SOAP envelope for SAML POST\r
+ */\r
+define ("SAML_SOAP_ENV", '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>');\r
+\r
+/**\r
+ * SOAP body for SAML POST\r
+ */\r
+define ("SAML_SOAP_BODY", '<SOAP-ENV:Body>');\r
+\r
+/**\r
+ * SAMLP request\r
+ */\r
+define ("SAMLP_REQUEST", '<samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"  MajorVersion="1" MinorVersion="1" RequestID="_192.168.16.51.1024506224022" IssueInstant="2002-06-19T17:03:44.022Z">');\r
+define ("SAMLP_REQUEST_CLOSE", '</samlp:Request>');\r
+\r
+/**\r
+ * SAMLP artifact tag (for the ticket)\r
+ */\r
+define ("SAML_ASSERTION_ARTIFACT", '<samlp:AssertionArtifact>');\r
+\r
+/**\r
+ * SAMLP close\r
+ */\r
+define ("SAML_ASSERTION_ARTIFACT_CLOSE", '</samlp:AssertionArtifact>');\r
+\r
+/**\r
+ * SOAP body close\r
+ */\r
+define ("SAML_SOAP_BODY_CLOSE", '</SOAP-ENV:Body>');\r
+\r
+/**\r
+ * SOAP envelope close\r
+ */\r
+define ("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');\r
+\r
+/**\r
+ * SAML Attributes\r
+ */\r
+define("SAML_ATTRIBUTES", 'SAMLATTRIBS');\r
+\r
+\r
+\r
+/** @} */\r
+ /**\r
+  * @addtogroup publicPGTStorage\r
+  * @{\r
+  */\r
+// ------------------------------------------------------------------------\r
+//  FILE PGT STORAGE\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * Default path used when storing PGT's to file\r
+  */\r
+define("CAS_PGT_STORAGE_FILE_DEFAULT_PATH",'/tmp');\r
+/**\r
+ * phpCAS::setPGTStorageFile()'s 2nd parameter to write plain text files\r
+ */\r
+define("CAS_PGT_STORAGE_FILE_FORMAT_PLAIN",'plain');\r
+/**\r
+ * phpCAS::setPGTStorageFile()'s 2nd parameter to write xml files\r
+ */\r
+define("CAS_PGT_STORAGE_FILE_FORMAT_XML",'xml');\r
+/**\r
+ * Default format used when storing PGT's to file\r
+ */\r
+define("CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT",CAS_PGT_STORAGE_FILE_FORMAT_PLAIN);\r
+// ------------------------------------------------------------------------\r
+//  DATABASE PGT STORAGE\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * default database type when storing PGT's to database\r
+  */\r
+define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE",'mysql');\r
+/**\r
+ * default host when storing PGT's to database\r
+ */\r
+define("CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME",'localhost');\r
+/**\r
+ * default port when storing PGT's to database\r
+ */\r
+define("CAS_PGT_STORAGE_DB_DEFAULT_PORT",'');\r
+/**\r
+ * default database when storing PGT's to database\r
+ */\r
+define("CAS_PGT_STORAGE_DB_DEFAULT_DATABASE",'phpCAS');\r
+/**\r
+ * default table when storing PGT's to database\r
+ */\r
+define("CAS_PGT_STORAGE_DB_DEFAULT_TABLE",'pgt');\r
+\r
+/** @} */\r
+// ------------------------------------------------------------------------\r
+// SERVICE ACCESS ERRORS\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * @addtogroup publicServices\r
+  * @{\r
+  */\r
+\r
+/**\r
+ * phpCAS::service() error code on success\r
+ */\r
+define("PHPCAS_SERVICE_OK",0);\r
+/**\r
+ * phpCAS::service() error code when the PT could not retrieve because\r
+ * the CAS server did not respond.\r
+ */\r
+define("PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE",1);\r
+/**\r
+ * phpCAS::service() error code when the PT could not retrieve because\r
+ * the response of the CAS server was ill-formed.\r
+ */\r
+define("PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE",2);\r
+/**\r
+ * phpCAS::service() error code when the PT could not retrieve because\r
+ * the CAS server did not want to.\r
+ */\r
+define("PHPCAS_SERVICE_PT_FAILURE",3);\r
+/**\r
+ * phpCAS::service() error code when the service was not available.\r
+ */\r
+define("PHPCAS_SERVICE_NOT AVAILABLE",4);\r
+\r
+/** @} */\r
+// ------------------------------------------------------------------------\r
+//  LANGUAGES\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * @addtogroup publicLang\r
+  * @{\r
+  */\r
+\r
+define("PHPCAS_LANG_ENGLISH",    'english');\r
+define("PHPCAS_LANG_FRENCH",     'french');\r
+define("PHPCAS_LANG_GREEK",      'greek');\r
+define("PHPCAS_LANG_GERMAN",     'german');\r
+define("PHPCAS_LANG_JAPANESE",   'japanese');\r
+define("PHPCAS_LANG_SPANISH",    'spanish');\r
+define("PHPCAS_LANG_CATALAN",    'catalan');\r
+\r
+/** @} */\r
+\r
+/**\r
+ * @addtogroup internalLang\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * phpCAS default language (when phpCAS::setLang() is not used)\r
+ */\r
+define("PHPCAS_LANG_DEFAULT", PHPCAS_LANG_ENGLISH);\r
+\r
+/** @} */\r
+// ------------------------------------------------------------------------\r
+//  DEBUG\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * @addtogroup publicDebug\r
+  * @{\r
+  */\r
+\r
+/**\r
+ * The default directory for the debug file under Unix.\r
+ */\r
+define('DEFAULT_DEBUG_DIR','/tmp/');\r
+\r
+/** @} */\r
+// ------------------------------------------------------------------------\r
+//  MISC\r
+// ------------------------------------------------------------------------\r
+ /**\r
+  * @addtogroup internalMisc\r
+  * @{\r
+  */\r
+\r
+/**\r
+ * This global variable is used by the interface class phpCAS.\r
+ *\r
+ * @hideinitializer\r
+ */\r
+$GLOBALS['PHPCAS_CLIENT']  = null;\r
+\r
+/**\r
+ * This global variable is used to store where the initializer is called from \r
+ * (to print a comprehensive error in case of multiple calls).\r
+ *\r
+ * @hideinitializer\r
+ */\r
+$GLOBALS['PHPCAS_INIT_CALL'] = array('done' => FALSE,\r
+       'file' => '?',\r
+       'line' => -1,\r
+       'method' => '?');\r
+\r
+/**\r
+ * This global variable is used to store where the method checking\r
+ * the authentication is called from (to print comprehensive errors)\r
+ *\r
+ * @hideinitializer\r
+ */\r
+$GLOBALS['PHPCAS_AUTH_CHECK_CALL'] = array('done' => FALSE,\r
+       'file' => '?',\r
+       'line' => -1,\r
+       'method' => '?',\r
+       'result' => FALSE);\r
+\r
+/**\r
+ * This global variable is used to store phpCAS debug mode.\r
+ *\r
+ * @hideinitializer\r
+ */\r
+$GLOBALS['PHPCAS_DEBUG']  = array('filename' => FALSE,\r
+       'indent' => 0,\r
+       'unique_id' => '');\r
+\r
+/** @} */\r
+\r
+// ########################################################################\r
+//  CLIENT CLASS\r
+// ########################################################################\r
+\r
+// include client class\r
+include_once(dirname(__FILE__).'/CAS/client.php');\r
+\r
+// ########################################################################\r
+//  INTERFACE CLASS\r
+// ########################################################################\r
+\r
+/**\r
+ * @class phpCAS\r
+ * The phpCAS class is a simple container for the phpCAS library. It provides CAS\r
+ * authentication for web applications written in PHP.\r
+ *\r
+ * @ingroup public\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ *\r
+ * \internal All its methods access the same object ($PHPCAS_CLIENT, declared \r
+ * at the end of CAS/client.php).\r
+ */\r
+\r
+\r
+\r
+class phpCAS\r
+{\r
+       \r
+       // ########################################################################\r
+       //  INITIALIZATION\r
+       // ########################################################################\r
+       \r
+       /**\r
+        * @addtogroup publicInit\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * phpCAS client initializer.\r
+        * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be\r
+        * called, only once, and before all other methods (except phpCAS::getVersion()\r
+        * and phpCAS::setDebug()).\r
+        *\r
+        * @param $server_version the version of the CAS server\r
+        * @param $server_hostname the hostname of the CAS server\r
+        * @param $server_port the port the CAS server is running on\r
+        * @param $server_uri the URI the CAS server is responding on\r
+        * @param $start_session Have phpCAS start PHP sessions (default true)\r
+        *\r
+        * @return a newly created CASClient object\r
+        */\r
+       function client($server_version,\r
+                                       $server_hostname,\r
+                                       $server_port,\r
+                                       $server_uri,\r
+                                       $start_session = true)\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error($PHPCAS_INIT_CALL['method'].'() has already been called (at '.$PHPCAS_INIT_CALL['file'].':'.$PHPCAS_INIT_CALL['line'].')');\r
+               }\r
+               if ( gettype($server_version) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_version (should be `string\')');\r
+               }\r
+               if ( gettype($server_hostname) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');\r
+               }\r
+               if ( gettype($server_port) != 'integer' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');\r
+               }\r
+               if ( gettype($server_uri) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');\r
+               }\r
+               \r
+               // store where the initializer is called from\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_INIT_CALL = array('done' => TRUE,\r
+                       'file' => $dbg[0]['file'],\r
+                       'line' => $dbg[0]['line'],\r
+                       'method' => __CLASS__.'::'.__FUNCTION__);\r
+               \r
+               // initialize the global object $PHPCAS_CLIENT\r
+               $PHPCAS_CLIENT = new CASClient($server_version,FALSE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_session);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * phpCAS proxy initializer.\r
+        * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be\r
+        * called, only once, and before all other methods (except phpCAS::getVersion()\r
+        * and phpCAS::setDebug()).\r
+        *\r
+        * @param $server_version the version of the CAS server\r
+        * @param $server_hostname the hostname of the CAS server\r
+        * @param $server_port the port the CAS server is running on\r
+        * @param $server_uri the URI the CAS server is responding on\r
+        * @param $start_session Have phpCAS start PHP sessions (default true)\r
+        *\r
+        * @return a newly created CASClient object\r
+        */\r
+       function proxy($server_version,\r
+                                  $server_hostname,\r
+                                  $server_port,\r
+                                  $server_uri,\r
+                                  $start_session = true)\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error($PHPCAS_INIT_CALL['method'].'() has already been called (at '.$PHPCAS_INIT_CALL['file'].':'.$PHPCAS_INIT_CALL['line'].')');\r
+               }\r
+               if ( gettype($server_version) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_version (should be `string\')');\r
+               }\r
+               if ( gettype($server_hostname) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');\r
+               }\r
+               if ( gettype($server_port) != 'integer' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');\r
+               }\r
+               if ( gettype($server_uri) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');\r
+               }\r
+               \r
+               // store where the initialzer is called from\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_INIT_CALL = array('done' => TRUE,\r
+                       'file' => $dbg[0]['file'],\r
+                       'line' => $dbg[0]['line'],\r
+                       'method' => __CLASS__.'::'.__FUNCTION__);\r
+               \r
+               // initialize the global object $PHPCAS_CLIENT\r
+               $PHPCAS_CLIENT = new CASClient($server_version,TRUE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_session);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  DEBUGGING\r
+       // ########################################################################\r
+       \r
+       /**\r
+        * @addtogroup publicDebug\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * Set/unset debug mode\r
+        *\r
+        * @param $filename the name of the file used for logging, or FALSE to stop debugging.\r
+        */\r
+       function setDebug($filename='')\r
+               {\r
+               global $PHPCAS_DEBUG;\r
+               \r
+               if ( $filename != FALSE && gettype($filename) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $dbg (should be FALSE or the name of the log file)');\r
+               }\r
+               \r
+               if ( empty($filename) ) {\r
+                       if ( preg_match('/^Win.*/',getenv('OS')) ) {\r
+                               if ( isset($_ENV['TMP']) ) {\r
+                                       $debugDir = $_ENV['TMP'].'/';\r
+                               } else if ( isset($_ENV['TEMP']) ) {\r
+                                       $debugDir = $_ENV['TEMP'].'/';\r
+                               } else {\r
+                                       $debugDir = '';\r
+                               }\r
+                       } else {\r
+                               $debugDir = DEFAULT_DEBUG_DIR;\r
+                       }\r
+                       $filename = $debugDir . 'phpCAS.log';\r
+               }\r
+               \r
+               if ( empty($PHPCAS_DEBUG['unique_id']) ) {\r
+                       $PHPCAS_DEBUG['unique_id'] = substr(strtoupper(md5(uniqid(''))),0,4);\r
+               }\r
+               \r
+               $PHPCAS_DEBUG['filename'] = $filename;\r
+               \r
+               phpCAS::trace('START ******************');\r
+               }\r
+       \r
+       /** @} */\r
+       /**\r
+        * @addtogroup internalDebug\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method is a wrapper for debug_backtrace() that is not available \r
+        * in all PHP versions (>= 4.3.0 only)\r
+        */\r
+       function backtrace()\r
+               {\r
+               if ( function_exists('debug_backtrace') ) {\r
+                       return debug_backtrace();\r
+               } else {\r
+                       // poor man's hack ... but it does work ...\r
+                       return array();\r
+               }\r
+               }\r
+       \r
+       /**\r
+        * Logs a string in debug mode.\r
+        *\r
+        * @param $str the string to write\r
+        *\r
+        * @private\r
+        */\r
+       function log($str)\r
+               {\r
+               $indent_str = ".";\r
+               global $PHPCAS_DEBUG;\r
+               \r
+               if ( $PHPCAS_DEBUG['filename'] ) {\r
+                       for ($i=0;$i<$PHPCAS_DEBUG['indent'];$i++) {\r
+                               $indent_str .= '|    ';\r
+                       }\r
+                       error_log($PHPCAS_DEBUG['unique_id'].' '.$indent_str.$str."\n",3,$PHPCAS_DEBUG['filename']);\r
+               }\r
+               \r
+               }\r
+       \r
+       /**\r
+        * This method is used by interface methods to print an error and where the function\r
+        * was originally called from.\r
+        *\r
+        * @param $msg the message to print\r
+        *\r
+        * @private\r
+        */\r
+       function error($msg)\r
+               {\r
+               $dbg = phpCAS::backtrace();\r
+               $function = '?';\r
+               $file = '?';\r
+               $line = '?';\r
+               if ( is_array($dbg) ) {\r
+                       for ( $i=1; $i<sizeof($dbg); $i++) {\r
+                               if ( is_array($dbg[$i]) ) {\r
+                                       if ( $dbg[$i]['class'] == __CLASS__ ) {\r
+                                               $function = $dbg[$i]['function'];\r
+                                               $file = $dbg[$i]['file'];\r
+                                               $line = $dbg[$i]['line'];\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               echo "<br />\n<b>phpCAS error</b>: <font color=\"FF0000\"><b>".__CLASS__."::".$function.'(): '.htmlentities($msg)."</b></font> in <b>".$file."</b> on line <b>".$line."</b><br />\n";\r
+               phpCAS::trace($msg);\r
+               phpCAS::traceExit();\r
+               exit();\r
+               }\r
+       \r
+       /**\r
+        * This method is used to log something in debug mode.\r
+        */\r
+       function trace($str)\r
+               {\r
+               $dbg = phpCAS::backtrace();\r
+               phpCAS::log($str.' ['.basename($dbg[1]['file']).':'.$dbg[1]['line'].']');\r
+               }\r
+       \r
+       /**\r
+        * This method is used to indicate the start of the execution of a function in debug mode.\r
+        */\r
+       function traceBegin()\r
+               {\r
+               global $PHPCAS_DEBUG;\r
+               \r
+               $dbg = phpCAS::backtrace();\r
+               $str = '=> ';\r
+               if ( !empty($dbg[2]['class']) ) {\r
+                       $str .= $dbg[2]['class'].'::';\r
+               }\r
+               $str .= $dbg[2]['function'].'(';      \r
+               if ( is_array($dbg[2]['args']) ) {\r
+                       foreach ($dbg[2]['args'] as $index => $arg) {\r
+                               if ( $index != 0 ) {\r
+                                       $str .= ', ';\r
+                               }\r
+                               $str .= str_replace("\n","",var_export($arg,TRUE));\r
+                       }\r
+               }\r
+               $str .= ') ['.basename($dbg[2]['file']).':'.$dbg[2]['line'].']';\r
+               phpCAS::log($str);\r
+               $PHPCAS_DEBUG['indent'] ++;\r
+               }\r
+       \r
+       /**\r
+        * This method is used to indicate the end of the execution of a function in debug mode.\r
+        *\r
+        * @param $res the result of the function\r
+        */\r
+       function traceEnd($res='')\r
+               {\r
+               global $PHPCAS_DEBUG;\r
+               \r
+               $PHPCAS_DEBUG['indent'] --;\r
+               $dbg = phpCAS::backtrace();\r
+               $str = '';\r
+               $str .= '<= '.str_replace("\n","",var_export($res,TRUE));\r
+               phpCAS::log($str);\r
+               }\r
+       \r
+       /**\r
+        * This method is used to indicate the end of the execution of the program\r
+        */\r
+       function traceExit()\r
+               {\r
+               global $PHPCAS_DEBUG;\r
+               \r
+               phpCAS::log('exit()');\r
+               while ( $PHPCAS_DEBUG['indent'] > 0 ) {\r
+                       phpCAS::log('-');\r
+                       $PHPCAS_DEBUG['indent'] --;\r
+               }\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  INTERNATIONALIZATION\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup publicLang\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method is used to set the language used by phpCAS. \r
+        * @note Can be called only once.\r
+        *\r
+        * @param $lang a string representing the language.\r
+        *\r
+        * @sa PHPCAS_LANG_FRENCH, PHPCAS_LANG_ENGLISH\r
+        */\r
+       function setLang($lang)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( gettype($lang) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $lang (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setLang($lang);\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  VERSION\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup public\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method returns the phpCAS version.\r
+        *\r
+        * @return the phpCAS version.\r
+        */\r
+       function getVersion()\r
+               {\r
+               return PHPCAS_VERSION;\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  HTML OUTPUT\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup publicOutput\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method sets the HTML header used for all outputs.\r
+        *\r
+        * @param $header the HTML header.\r
+        */\r
+       function setHTMLHeader($header)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( gettype($header) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $header (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setHTMLHeader($header);\r
+               }\r
+       \r
+       /**\r
+        * This method sets the HTML footer used for all outputs.\r
+        *\r
+        * @param $footer the HTML footer.\r
+        */\r
+       function setHTMLFooter($footer)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( gettype($footer) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $footer (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setHTMLFooter($footer);\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  PGT STORAGE\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup publicPGTStorage\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method is used to tell phpCAS to store the response of the\r
+        * CAS server to PGT requests onto the filesystem. \r
+        *\r
+        * @param $format the format used to store the PGT's (`plain' and `xml' allowed)\r
+        * @param $path the path where the PGT's should be stored\r
+        */\r
+       function setPGTStorageFile($format='',\r
+               $path='')\r
+               {\r
+               global $PHPCAS_CLIENT,$PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_CLIENT->isProxy() ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( $PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called before '.$PHPCAS_AUTH_CHECK_CALL['method'].'() (called at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].')');\r
+               }\r
+               if ( gettype($format) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $format (should be `string\')');\r
+               }\r
+               if ( gettype($path) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $format (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setPGTStorageFile($format,$path);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * This method is used to tell phpCAS to store the response of the\r
+        * CAS server to PGT requests into a database. \r
+        * @note The connection to the database is done only when needed. \r
+        * As a consequence, bad parameters are detected only when \r
+        * initializing PGT storage, except in debug mode.\r
+        *\r
+        * @param $user the user to access the data with\r
+        * @param $password the user's password\r
+        * @param $database_type the type of the database hosting the data\r
+        * @param $hostname the server hosting the database\r
+        * @param $port the port the server is listening on\r
+        * @param $database the name of the database\r
+        * @param $table the name of the table storing the data\r
+        */\r
+       function setPGTStorageDB($user,\r
+                                                        $password,\r
+                                                        $database_type='',\r
+                                                                $hostname='',\r
+                                                                        $port=0,\r
+                                                                                $database='',\r
+                                                                                        $table='')\r
+               {\r
+               global $PHPCAS_CLIENT,$PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_CLIENT->isProxy() ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( $PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called before '.$PHPCAS_AUTH_CHECK_CALL['method'].'() (called at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].')');\r
+               }\r
+               if ( gettype($user) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $user (should be `string\')');\r
+               }\r
+               if ( gettype($password) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $password (should be `string\')');\r
+               }\r
+               if ( gettype($database_type) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $database_type (should be `string\')');\r
+               }\r
+               if ( gettype($hostname) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $hostname (should be `string\')');\r
+               }\r
+               if ( gettype($port) != 'integer' ) {\r
+                       phpCAS::error('type mismatched for parameter $port (should be `integer\')');\r
+               }\r
+               if ( gettype($database) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $database (should be `string\')');\r
+               }\r
+               if ( gettype($table) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $table (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setPGTStorageDB($user,$password,$database_type,$hostname,$port,$database,$table);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       // ACCESS TO EXTERNAL SERVICES\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup publicServices\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * This method is used to access an HTTP[S] service.\r
+        * \r
+        * @param $url the service to access.\r
+        * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on\r
+        * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,\r
+        * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.\r
+        * @param $output the output of the service (also used to give an error\r
+        * message on failure).\r
+        *\r
+        * @return TRUE on success, FALSE otherwise (in this later case, $err_code\r
+        * gives the reason why it failed and $output contains an error message).\r
+        */\r
+       function serviceWeb($url,&$err_code,&$output)\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_CLIENT->isProxy() ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {\r
+                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               \r
+               $res = $PHPCAS_CLIENT->serviceWeb($url,$err_code,$output);\r
+               \r
+               phpCAS::traceEnd($res);\r
+               return $res;\r
+               }\r
+       \r
+       /**\r
+        * This method is used to access an IMAP/POP3/NNTP service.\r
+        * \r
+        * @param $url a string giving the URL of the service, including the mailing box\r
+        * for IMAP URLs, as accepted by imap_open().\r
+        * @param $service a string giving for CAS retrieve Proxy ticket\r
+        * @param $flags options given to imap_open().\r
+        * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on\r
+        * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,\r
+        * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT AVAILABLE.\r
+        * @param $err_msg an error message on failure\r
+        * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL\r
+        * on success, FALSE on error).\r
+        *\r
+        * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code\r
+        * gives the reason why it failed and $err_msg contains an error message).\r
+        */\r
+       function serviceMail($url,$service,$flags,&$err_code,&$err_msg,&$pt)\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_CLIENT->isProxy() ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {\r
+                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               \r
+               if ( gettype($flags) != 'integer' ) {\r
+                       phpCAS::error('type mismatched for parameter $flags (should be `integer\')');\r
+               }\r
+               \r
+               $res = $PHPCAS_CLIENT->serviceMail($url,$service,$flags,$err_code,$err_msg,$pt);\r
+               \r
+               phpCAS::traceEnd($res);\r
+               return $res;\r
+               }\r
+       \r
+       /** @} */\r
+       // ########################################################################\r
+       //  AUTHENTICATION\r
+       // ########################################################################\r
+       /**\r
+        * @addtogroup publicAuth\r
+        * @{\r
+        */\r
+       \r
+       /**\r
+        * Set the times authentication will be cached before really accessing the CAS server in gateway mode: \r
+        * - -1: check only once, and then never again (until you pree login)\r
+        * - 0: always check\r
+        * - n: check every "n" time\r
+        *\r
+        * @param $n an integer.\r
+        */\r
+       function setCacheTimesForAuthRecheck($n)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( gettype($n) != 'integer' ) {\r
+                       phpCAS::error('type mismatched for parameter $header (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);\r
+               }\r
+       \r
+       /**\r
+        * This method is called to check if the user is authenticated (use the gateway feature).\r
+        * @return TRUE when the user is authenticated; otherwise FALSE.\r
+        */\r
+       function checkAuthentication()\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               \r
+               $auth = $PHPCAS_CLIENT->checkAuthentication();\r
+               \r
+               // store where the authentication has been checked and the result\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,\r
+                       'file' => $dbg[0]['file'],\r
+                       'line' => $dbg[0]['line'],\r
+                       'method' => __CLASS__.'::'.__FUNCTION__,\r
+                       'result' => $auth );\r
+               phpCAS::traceEnd($auth);\r
+               return $auth; \r
+               }\r
+\r
+       /**\r
+        * This method is called to force authentication if the user was not already \r
+        * authenticated. If the user is not authenticated, halt by redirecting to \r
+        * the CAS server.\r
+        */\r
+       function forceAuthentication()\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               \r
+               $auth = $PHPCAS_CLIENT->forceAuthentication();\r
+               \r
+               // store where the authentication has been checked and the result\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,\r
+                       'file' => $dbg[0]['file'],\r
+                       'line' => $dbg[0]['line'],\r
+                       'method' => __CLASS__.'::'.__FUNCTION__,\r
+                       'result' => $auth );\r
+               \r
+               if ( !$auth ) {\r
+                       phpCAS::trace('user is not authenticated, redirecting to the CAS server');\r
+                       $PHPCAS_CLIENT->forceAuthentication();\r
+               } else {\r
+                       phpCAS::trace('no need to authenticate (user `'.phpCAS::getUser().'\' is already authenticated)');\r
+               }\r
+               \r
+               phpCAS::traceEnd();\r
+               return $auth; \r
+               }\r
+       \r
+       /**\r
+        * This method is called to renew the authentication.\r
+        **/\r
+       function renewAuthentication() {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before'.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               \r
+               // store where the authentication has been checked and the result\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE, 'file' => $dbg[0]['file'], 'line' => $dbg[0]['line'], 'method' => __CLASS__.'::'.__FUNCTION__, 'result' => $auth );\r
+               \r
+               $PHPCAS_CLIENT->renewAuthentication();\r
+               phpCAS::traceEnd();\r
+       }\r
+\r
+       /**\r
+        * This method has been left from version 0.4.1 for compatibility reasons.\r
+        */\r
+       function authenticate()\r
+               {\r
+               phpCAS::error('this method is deprecated. You should use '.__CLASS__.'::forceAuthentication() instead');\r
+               }\r
+       \r
+       /**\r
+        * This method is called to check if the user is authenticated (previously or by\r
+        * tickets given in the URL).\r
+        *\r
+        * @return TRUE when the user is authenticated.\r
+        */\r
+       function isAuthenticated()\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               \r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               \r
+               // call the isAuthenticated method of the global $PHPCAS_CLIENT object\r
+               $auth = $PHPCAS_CLIENT->isAuthenticated();\r
+               \r
+               // store where the authentication has been checked and the result\r
+               $dbg = phpCAS::backtrace();\r
+               $PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,\r
+                       'file' => $dbg[0]['file'],\r
+                       'line' => $dbg[0]['line'],\r
+                       'method' => __CLASS__.'::'.__FUNCTION__,\r
+                       'result' => $auth );\r
+               phpCAS::traceEnd($auth);\r
+               return $auth;\r
+               }\r
+       \r
+       /**\r
+        * Checks whether authenticated based on $_SESSION. Useful to avoid\r
+        * server calls.\r
+        * @return true if authenticated, false otherwise.\r
+        * @since 0.4.22 by Brendan Arnold\r
+        */\r
+       function isSessionAuthenticated ()\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               return($PHPCAS_CLIENT->isSessionAuthenticated());\r
+               }\r
+       \r
+       /**\r
+        * This method returns the CAS user's login name.\r
+        * @warning should not be called only after phpCAS::forceAuthentication()\r
+        * or phpCAS::checkAuthentication().\r
+        *\r
+        * @return the login name of the authenticated user\r
+        */\r
+       function getUser()\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {\r
+                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');\r
+               }\r
+               return $PHPCAS_CLIENT->getUser();\r
+               }\r
+       \r
+       /**\r
+        * This method returns the CAS user's login name.\r
+        * @warning should not be called only after phpCAS::forceAuthentication()\r
+        * or phpCAS::checkAuthentication().\r
+        *\r
+        * @return the login name of the authenticated user\r
+        */\r
+       function getAttributes()\r
+               {\r
+               global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['done'] ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');\r
+               }\r
+               if ( !$PHPCAS_AUTH_CHECK_CALL['result'] ) {\r
+                       phpCAS::error('authentication was checked (by '.$PHPCAS_AUTH_CHECK_CALL['method'].'() at '.$PHPCAS_AUTH_CHECK_CALL['file'].':'.$PHPCAS_AUTH_CHECK_CALL['line'].') but the method returned FALSE');\r
+               }\r
+               return $PHPCAS_CLIENT->getAttributes();\r
+               }\r
+    /**\r
+     * Handle logout requests.\r
+     */\r
+    function handleLogoutRequests($check_client=true, $allowed_clients=false)\r
+        {\r
+            global $PHPCAS_CLIENT;\r
+            if ( !is_object($PHPCAS_CLIENT) ) {\r
+                phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+            }\r
+            return($PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));\r
+        }\r
+   \r
+       /**\r
+        * This method returns the URL to be used to login.\r
+        * or phpCAS::isAuthenticated().\r
+        *\r
+        * @return the login name of the authenticated user\r
+        */\r
+       function getServerLoginURL()\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               return $PHPCAS_CLIENT->getServerLoginURL();\r
+               }\r
+       \r
+       /**\r
+        * Set the login URL of the CAS server.\r
+        * @param $url the login URL\r
+        * @since 0.4.21 by Wyman Chan\r
+        */\r
+       function setServerLoginURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after\r
+                               '.__CLASS__.'::client()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be\r
+                       `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setServerLoginURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+               \r
+               \r
+       /**\r
+        * Set the serviceValidate URL of the CAS server.\r
+        * @param $url the serviceValidate URL\r
+        * @since 1.1.0 by Joachim Fritschi\r
+        */\r
+       function setServerServiceValidateURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after\r
+                               '.__CLASS__.'::client()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be\r
+                       `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setServerServiceValidateURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+               \r
+               \r
+        /**\r
+        * Set the proxyValidate URL of the CAS server.\r
+        * @param $url the proxyValidate URL\r
+        * @since 1.1.0 by Joachim Fritschi\r
+        */\r
+       function setServerProxyValidateURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after\r
+                               '.__CLASS__.'::client()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be\r
+                       `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setServerProxyValidateURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+               \r
+     /**\r
+        * Set the samlValidate URL of the CAS server.\r
+        * @param $url the samlValidate URL\r
+        * @since 1.1.0 by Joachim Fritschi\r
+        */\r
+       function setServerSamlValidateURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after\r
+                               '.__CLASS__.'::client()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be\r
+                       `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setServerSamlValidateURL($url);\r
+               phpCAS::traceEnd();\r
+               }                       \r
+       \r
+       /**\r
+        * This method returns the URL to be used to login.\r
+        * or phpCAS::isAuthenticated().\r
+        *\r
+        * @return the login name of the authenticated user\r
+        */\r
+       function getServerLogoutURL()\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');\r
+               }\r
+               return $PHPCAS_CLIENT->getServerLogoutURL();\r
+               }\r
+       \r
+       /**\r
+        * Set the logout URL of the CAS server.\r
+        * @param $url the logout URL\r
+        * @since 0.4.21 by Wyman Chan\r
+        */\r
+       function setServerLogoutURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after\r
+                               '.__CLASS__.'::client()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be\r
+                       `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setServerLogoutURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * This method is used to logout from CAS.\r
+        * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server\r
+        * @public\r
+        */\r
+       function logout($params = "") {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if (!is_object($PHPCAS_CLIENT)) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }\r
+               $parsedParams = array();\r
+               if ($params != "") {\r
+                       if (is_string($params)) {\r
+                               phpCAS::error('method `phpCAS::logout($url)\' is now deprecated, use `phpCAS::logoutWithUrl($url)\' instead');\r
+                       }\r
+                       if (!is_array($params)) {\r
+                               phpCAS::error('type mismatched for parameter $params (should be `array\')');\r
+                       }\r
+                       foreach ($params as $key => $value) {\r
+                               if ($key != "service" && $key != "url") {\r
+                                       phpCAS::error('only `url\' and `service\' parameters are allowed for method `phpCAS::logout($params)\'');\r
+                               }\r
+                               $parsedParams[$key] = $value;\r
+                       }\r
+               }\r
+               $PHPCAS_CLIENT->logout($parsedParams);\r
+               // never reached\r
+               phpCAS::traceEnd();\r
+       }\r
+       \r
+       /**\r
+        * This method is used to logout from CAS. Halts by redirecting to the CAS server.\r
+        * @param $service a URL that will be transmitted to the CAS server\r
+        */\r
+       function logoutWithRedirectService($service) {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }\r
+               if (!is_string($service)) {\r
+                       phpCAS::error('type mismatched for parameter $service (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->logout(array("service" => $service));\r
+               // never reached\r
+               phpCAS::traceEnd();\r
+       }\r
+       \r
+       /**\r
+        * This method is used to logout from CAS. Halts by redirecting to the CAS server.\r
+        * @param $url a URL that will be transmitted to the CAS server\r
+        */\r
+       function logoutWithUrl($url) {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }\r
+               if (!is_string($url)) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->logout(array("url" => $url));\r
+               // never reached\r
+               phpCAS::traceEnd();\r
+       }\r
+       \r
+       /**\r
+        * This method is used to logout from CAS. Halts by redirecting to the CAS server.\r
+        * @param $service a URL that will be transmitted to the CAS server\r
+        * @param $url a URL that will be transmitted to the CAS server\r
+        */\r
+       function logoutWithRedirectServiceAndUrl($service, $url) {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }\r
+               if (!is_string($service)) {\r
+                       phpCAS::error('type mismatched for parameter $service (should be `string\')');\r
+               }\r
+               if (!is_string($url)) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->logout(array("service" => $service, "url" => $url));\r
+               // never reached\r
+               phpCAS::traceEnd();\r
+       }\r
+       \r
+       /**\r
+        * Set the fixed URL that will be used by the CAS server to transmit the PGT.\r
+        * When this method is not called, a phpCAS script uses its own URL for the callback.\r
+        *\r
+        * @param $url the URL\r
+        */\r
+       function setFixedCallbackURL($url='')\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( !$PHPCAS_CLIENT->isProxy() ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }\r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setCallbackURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * Set the fixed URL that will be set as the CAS service parameter. When this\r
+        * method is not called, a phpCAS script uses its own URL.\r
+        *\r
+        * @param $url the URL\r
+        */\r
+       function setFixedServiceURL($url)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }  \r
+               if ( gettype($url) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $url (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setURL($url);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * Get the URL that is set as the CAS service parameter.\r
+        */\r
+       function getServiceURL()\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }  \r
+               return($PHPCAS_CLIENT->getURL());\r
+               }\r
+       \r
+       /**\r
+        * Retrieve a Proxy Ticket from the CAS server.\r
+        */\r
+       function retrievePT($target_service,&$err_code,&$err_msg)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');\r
+               }  \r
+               if ( gettype($target_service) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $target_service(should be `string\')');\r
+               }\r
+               return($PHPCAS_CLIENT->retrievePT($target_service,$err_code,$err_msg));\r
+               }\r
+       \r
+       /**\r
+        * Set the certificate of the CAS server.\r
+        *\r
+        * @param $cert the PEM certificate\r
+        */\r
+       function setCasServerCert($cert)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }  \r
+               if ( gettype($cert) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $cert (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setCasServerCert($cert);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * Set the certificate of the CAS server CA.\r
+        *\r
+        * @param $cert the CA certificate\r
+        */\r
+       function setCasServerCACert($cert)\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }  \r
+               if ( gettype($cert) != 'string' ) {\r
+                       phpCAS::error('type mismatched for parameter $cert (should be `string\')');\r
+               }\r
+               $PHPCAS_CLIENT->setCasServerCACert($cert);\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /**\r
+        * Set no SSL validation for the CAS server.\r
+        */\r
+       function setNoCasServerValidation()\r
+               {\r
+               global $PHPCAS_CLIENT;\r
+               phpCAS::traceBegin();\r
+               if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+               }  \r
+               $PHPCAS_CLIENT->setNoCasServerValidation();\r
+               phpCAS::traceEnd();\r
+               }\r
+       \r
+       /** @} */\r
+       \r
+  /**\r
+   * Change CURL options.\r
+   * CURL is used to connect through HTTPS to CAS server\r
+   * @param $key the option key\r
+   * @param $value the value to set\r
+   */\r
+   function setExtraCurlOption($key, $value)\r
+               {\r
+                 global $PHPCAS_CLIENT;\r
+                 phpCAS::traceBegin();\r
+                 if ( !is_object($PHPCAS_CLIENT) ) {\r
+                       phpCAS::error('this method should only be called after '.__CLASS__.'::client() or'.__CLASS__.'::proxy()');\r
+                 }  \r
+                 $PHPCAS_CLIENT->setExtraCurlOption($key, $value);\r
+                 phpCAS::traceEnd();\r
+               }\r
+\r
+}\r
+\r
+// ########################################################################\r
+// DOCUMENTATION\r
+// ########################################################################\r
+\r
+// ########################################################################\r
+//  MAIN PAGE\r
+\r
+/**\r
+ * @mainpage\r
+ *\r
+ * The following pages only show the source documentation.\r
+ *\r
+ */\r
+\r
+// ########################################################################\r
+//  MODULES DEFINITION\r
+\r
+/** @defgroup public User interface */\r
+\r
+/** @defgroup publicInit Initialization\r
+ *  @ingroup public */\r
+\r
+/** @defgroup publicAuth Authentication\r
+ *  @ingroup public */\r
+\r
+/** @defgroup publicServices Access to external services\r
+ *  @ingroup public */\r
+\r
+/** @defgroup publicConfig Configuration\r
+ *  @ingroup public */\r
+\r
+/** @defgroup publicLang Internationalization\r
+ *  @ingroup publicConfig */\r
+\r
+/** @defgroup publicOutput HTML output\r
+ *  @ingroup publicConfig */\r
+\r
+/** @defgroup publicPGTStorage PGT storage\r
+ *  @ingroup publicConfig */\r
+\r
+/** @defgroup publicDebug Debugging\r
+ *  @ingroup public */\r
+\r
+\r
+/** @defgroup internal Implementation */\r
+\r
+/** @defgroup internalAuthentication Authentication\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalBasic CAS Basic client features (CAS 1.0, Service Tickets)\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalProxy CAS Proxy features (CAS 2.0, Proxy Granting Tickets)\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalPGTStorage PGT storage\r
+ *  @ingroup internalProxy */\r
+\r
+/** @defgroup internalPGTStorageDB PGT storage in a database\r
+ *  @ingroup internalPGTStorage */\r
+\r
+/** @defgroup internalPGTStorageFile PGT storage on the filesystem\r
+ *  @ingroup internalPGTStorage */\r
+\r
+/** @defgroup internalCallback Callback from the CAS server\r
+ *  @ingroup internalProxy */\r
+\r
+/** @defgroup internalProxied CAS proxied client features (CAS 2.0, Proxy Tickets)\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalConfig Configuration\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalOutput HTML output\r
+ *  @ingroup internalConfig */\r
+\r
+/** @defgroup internalLang Internationalization\r
+ *  @ingroup internalConfig\r
+ *\r
+ * To add a new language:\r
+ * - 1. define a new constant PHPCAS_LANG_XXXXXX in CAS/CAS.php\r
+ * - 2. copy any file from CAS/languages to CAS/languages/XXXXXX.php\r
+ * - 3. Make the translations\r
+ */\r
+\r
+/** @defgroup internalDebug Debugging\r
+ *  @ingroup internal */\r
+\r
+/** @defgroup internalMisc Miscellaneous\r
+ *  @ingroup internal */\r
+\r
+// ########################################################################\r
+//  EXAMPLES\r
+\r
+/**\r
+ * @example example_simple.php\r
+ */\r
+ /**\r
+  * @example example_proxy.php\r
+  */\r
+  /**\r
+   * @example example_proxy2.php\r
+   */\r
+   /**\r
+    * @example example_lang.php\r
+    */\r
+    /**\r
+     * @example example_html.php\r
+     */\r
+     /**\r
+      * @example example_file.php\r
+      */\r
+      /**\r
+       * @example example_db.php\r
+       */\r
+       /**\r
+        * @example example_service.php\r
+        */\r
+        /**\r
+         * @example example_session_proxy.php\r
+         */\r
+         /**\r
+          * @example example_session_service.php\r
+          */\r
+          /**\r
+           * @example example_gateway.php\r
+           */\r
+\r
+\r
+\r
+?>\r
index 00797b9c5673598d672f156ac4cd64ce0c405bc2..5a589e4b2822bf405bdfcdc0a31194ec5c068cb0 100644 (file)
-<?php
-
-/**
- * @file CAS/PGTStorage/pgt-db.php
- * Basic class for PGT database storage
- */
-
-/**
- * @class PGTStorageDB
- * The PGTStorageDB class is a class for PGT database storage. An instance of 
- * this class is returned by CASClient::SetPGTStorageDB().
- *
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorageDB
- */
-
-class PGTStorageDB extends PGTStorage
-{
-  /** 
-   * @addtogroup internalPGTStorageDB
-   * @{ 
-   */
-
-  /**
-   * a string representing a PEAR DB URL to connect to the database. Written by
-   * PGTStorageDB::PGTStorageDB(), read by getURL().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_url='';
-
-  /**
-   * This method returns the PEAR DB URL to use to connect to the database.
-   *
-   * @return a PEAR DB URL
-   *
-   * @private
-   */
-  function getURL()
-    {
-      return $this->_url;
-    }
-
-  /**
-   * The handle of the connection to the database where PGT's are stored. Written by
-   * PGTStorageDB::init(), read by getLink().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_link = null;
-
-  /**
-   * This method returns the handle of the connection to the database where PGT's are 
-   * stored.
-   *
-   * @return a handle of connection.
-   *
-   * @private
-   */
-  function getLink()
-    {
-      return $this->_link;
-    }
-
-  /**
-   * The name of the table where PGT's are stored. Written by 
-   * PGTStorageDB::PGTStorageDB(), read by getTable().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_table = '';
-
-  /**
-   * This method returns the name of the table where PGT's are stored.
-   *
-   * @return the name of a table.
-   *
-   * @private
-   */
-  function getTable()
-    {
-      return $this->_table;
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-  
-  /**
-   * This method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageType()
-    {
-      return "database";
-    }
-
-  /**
-   * This method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageInfo()
-    {
-      return 'url=`'.$this->getURL().'\', table=`'.$this->getTable().'\'';
-    }
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-  
-  /**
-   * The class constructor, called by CASClient::SetPGTStorageDB().
-   *
-   * @param $cas_parent the CASClient instance that creates the object.
-   * @param $user the user to access the data with
-   * @param $password the user's password
-   * @param $database_type the type of the database hosting the data
-   * @param $hostname the server hosting the database
-   * @param $port the port the server is listening on
-   * @param $database the name of the database
-   * @param $table the name of the table storing the data
-   *
-   * @public
-   */
-  function PGTStorageDB($cas_parent,$user,$password,$database_type,$hostname,$port,$database,$table)
-    {
-      phpCAS::traceBegin();
-
-      // call the ancestor's constructor
-      $this->PGTStorage($cas_parent);
-
-      if ( empty($database_type) ) $database_type = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE;
-      if ( empty($hostname) ) $hostname = CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME;
-      if ( $port==0 ) $port = CAS_PGT_STORAGE_DB_DEFAULT_PORT;
-      if ( empty($database) ) $database = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE;
-      if ( empty($table) ) $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;
-
-      // build and store the PEAR DB URL
-      $this->_url = $database_type.':'.'//'.$user.':'.$password.'@'.$hostname.':'.$port.'/'.$database;
-
-      // XXX should use setURL and setTable
-      phpCAS::traceEnd();
-    }
-  
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-  
-  /**
-   * This method is used to initialize the storage. Halts on error.
-   *
-   * @public
-   */
-  function init()
-    {
-      phpCAS::traceBegin();
-      // if the storage has already been initialized, return immediatly
-      if ( $this->isInitialized() )
-               return;
-      // call the ancestor's method (mark as initialized)
-      parent::init();
-      
-         //include phpDB library (the test was introduced in release 0.4.8 for 
-         //the integration into Tikiwiki).
-         if (!class_exists('DB')) {
-               include_once('DB.php');
-         }
-
-      // try to connect to the database
-      $this->_link = DB::connect($this->getURL());
-      if ( DB::isError($this->_link) ) {
-       phpCAS::error('could not connect to database ('.DB::errorMessage($this->_link).')');
-      }
-      var_dump($this->_link);
-      phpCAS::traceBEnd();
-    }
-
-  /** @} */
-}
-
+<?php\r
+\r
+/**\r
+ * @file CAS/PGTStorage/pgt-db.php\r
+ * Basic class for PGT database storage\r
+ */\r
+\r
+/**\r
+ * @class PGTStorageDB\r
+ * The PGTStorageDB class is a class for PGT database storage. An instance of \r
+ * this class is returned by CASClient::SetPGTStorageDB().\r
+ *\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ *\r
+ * @ingroup internalPGTStorageDB\r
+ */\r
+\r
+class PGTStorageDB extends PGTStorage\r
+{\r
+  /** \r
+   * @addtogroup internalPGTStorageDB\r
+   * @{ \r
+   */\r
+\r
+  /**\r
+   * a string representing a PEAR DB URL to connect to the database. Written by\r
+   * PGTStorageDB::PGTStorageDB(), read by getURL().\r
+   *\r
+   * @hideinitializer\r
+   * @private\r
+   */\r
+  var $_url='';\r
+\r
+  /**\r
+   * This method returns the PEAR DB URL to use to connect to the database.\r
+   *\r
+   * @return a PEAR DB URL\r
+   *\r
+   * @private\r
+   */\r
+  function getURL()\r
+    {\r
+      return $this->_url;\r
+    }\r
+\r
+  /**\r
+   * The handle of the connection to the database where PGT's are stored. Written by\r
+   * PGTStorageDB::init(), read by getLink().\r
+   *\r
+   * @hideinitializer\r
+   * @private\r
+   */\r
+  var $_link = null;\r
+\r
+  /**\r
+   * This method returns the handle of the connection to the database where PGT's are \r
+   * stored.\r
+   *\r
+   * @return a handle of connection.\r
+   *\r
+   * @private\r
+   */\r
+  function getLink()\r
+    {\r
+      return $this->_link;\r
+    }\r
+\r
+  /**\r
+   * The name of the table where PGT's are stored. Written by \r
+   * PGTStorageDB::PGTStorageDB(), read by getTable().\r
+   *\r
+   * @hideinitializer\r
+   * @private\r
+   */\r
+  var $_table = '';\r
+\r
+  /**\r
+   * This method returns the name of the table where PGT's are stored.\r
+   *\r
+   * @return the name of a table.\r
+   *\r
+   * @private\r
+   */\r
+  function getTable()\r
+    {\r
+      return $this->_table;\r
+    }\r
+\r
+  // ########################################################################\r
+  //  DEBUGGING\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * This method returns an informational string giving the type of storage\r
+   * used by the object (used for debugging purposes).\r
+   *\r
+   * @return an informational string.\r
+   * @public\r
+   */\r
+  function getStorageType()\r
+    {\r
+      return "database";\r
+    }\r
+\r
+  /**\r
+   * This method returns an informational string giving informations on the\r
+   * parameters of the storage.(used for debugging purposes).\r
+   *\r
+   * @public\r
+   */\r
+  function getStorageInfo()\r
+    {\r
+      return 'url=`'.$this->getURL().'\', table=`'.$this->getTable().'\'';\r
+    }\r
+\r
+  // ########################################################################\r
+  //  CONSTRUCTOR\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * The class constructor, called by CASClient::SetPGTStorageDB().\r
+   *\r
+   * @param $cas_parent the CASClient instance that creates the object.\r
+   * @param $user the user to access the data with\r
+   * @param $password the user's password\r
+   * @param $database_type the type of the database hosting the data\r
+   * @param $hostname the server hosting the database\r
+   * @param $port the port the server is listening on\r
+   * @param $database the name of the database\r
+   * @param $table the name of the table storing the data\r
+   *\r
+   * @public\r
+   */\r
+  function PGTStorageDB($cas_parent,$user,$password,$database_type,$hostname,$port,$database,$table)\r
+    {\r
+      phpCAS::traceBegin();\r
+\r
+      // call the ancestor's constructor\r
+      $this->PGTStorage($cas_parent);\r
+\r
+      if ( empty($database_type) ) $database_type = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE_TYPE;\r
+      if ( empty($hostname) ) $hostname = CAS_PGT_STORAGE_DB_DEFAULT_HOSTNAME;\r
+      if ( $port==0 ) $port = CAS_PGT_STORAGE_DB_DEFAULT_PORT;\r
+      if ( empty($database) ) $database = CAS_PGT_STORAGE_DB_DEFAULT_DATABASE;\r
+      if ( empty($table) ) $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;\r
+\r
+      // build and store the PEAR DB URL\r
+      $this->_url = $database_type.':'.'//'.$user.':'.$password.'@'.$hostname.':'.$port.'/'.$database;\r
+\r
+      // XXX should use setURL and setTable\r
+      phpCAS::traceEnd();\r
+    }\r
+  \r
+  // ########################################################################\r
+  //  INITIALIZATION\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * This method is used to initialize the storage. Halts on error.\r
+   *\r
+   * @public\r
+   */\r
+  function init()\r
+    {\r
+      phpCAS::traceBegin();\r
+      // if the storage has already been initialized, return immediatly\r
+      if ( $this->isInitialized() )\r
+               return;\r
+      // call the ancestor's method (mark as initialized)\r
+      parent::init();\r
+      \r
+         //include phpDB library (the test was introduced in release 0.4.8 for \r
+         //the integration into Tikiwiki).\r
+         if (!class_exists('DB')) {\r
+               include_once('DB.php');\r
+         }\r
+\r
+      // try to connect to the database\r
+      $this->_link = DB::connect($this->getURL());\r
+      if ( DB::isError($this->_link) ) {\r
+       phpCAS::error('could not connect to database ('.DB::errorMessage($this->_link).')');\r
+      }\r
+      var_dump($this->_link);\r
+      phpCAS::traceBEnd();\r
+    }\r
+\r
+  /** @} */\r
+}\r
+\r
 ?>
\ No newline at end of file
index d48a60d670af1e8b4ce1206763806330fc891903..bc07485b8f8831a870c3bd6e986f3a2f88298c26 100644 (file)
-<?php
-
-/**
- * @file CAS/PGTStorage/pgt-file.php
- * Basic class for PGT file storage
- */
-
-/**
- * @class PGTStorageFile
- * The PGTStorageFile class is a class for PGT file storage. An instance of 
- * this class is returned by CASClient::SetPGTStorageFile().
- *
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorageFile
- */
-
-class PGTStorageFile extends PGTStorage
-{
-  /** 
-   * @addtogroup internalPGTStorageFile 
-   * @{ 
-   */
-
-  /**
-   * a string telling where PGT's should be stored on the filesystem. Written by
-   * PGTStorageFile::PGTStorageFile(), read by getPath().
-   *
-   * @private
-   */
-  var $_path;
-
-  /**
-   * This method returns the name of the directory where PGT's should be stored 
-   * on the filesystem.
-   *
-   * @return the name of a directory (with leading and trailing '/')
-   *
-   * @private
-   */
-  function getPath()
-    {
-      return $this->_path;
-    }
-
-  /**
-   * a string telling the format to use to store PGT's (plain or xml). Written by
-   * PGTStorageFile::PGTStorageFile(), read by getFormat().
-   *
-   * @private
-   */
-  var $_format;
-
-  /**
-   * This method returns the format to use when storing PGT's on the filesystem.
-   *
-   * @return a string corresponding to the format used (plain or xml).
-   *
-   * @private
-   */
-  function getFormat()
-    {
-      return $this->_format;
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-  
-  /**
-   * This method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageType()
-    {
-      return "file";
-    }
-
-  /**
-   * This method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @return an informational string.
-   * @public
-   */
-  function getStorageInfo()
-    {
-      return 'path=`'.$this->getPath().'\', format=`'.$this->getFormat().'\'';
-    }
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-  
-  /**
-   * The class constructor, called by CASClient::SetPGTStorageFile().
-   *
-   * @param $cas_parent the CASClient instance that creates the object.
-   * @param $format the format used to store the PGT's (`plain' and `xml' allowed).
-   * @param $path the path where the PGT's should be stored
-   *
-   * @public
-   */
-  function PGTStorageFile($cas_parent,$format,$path)
-    {
-      phpCAS::traceBegin();
-      // call the ancestor's constructor
-      $this->PGTStorage($cas_parent);
-
-      if (empty($format) ) $format = CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT;
-      if (empty($path) ) $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;
-
-      // check that the path is an absolute path
-      if (getenv("OS")=="Windows_NT"){
-       
-        if (!preg_match('`^[a-zA-Z]:`', $path)) {
-               phpCAS::error('an absolute path is needed for PGT storage to file');
-       }
-       
-      }
-      else
-      {
-      
-       if ( $path[0] != '/' ) {
-                       phpCAS::error('an absolute path is needed for PGT storage to file');
-       }
-
-       // store the path (with a leading and trailing '/')      
-       $path = preg_replace('|[/]*$|','/',$path);
-       $path = preg_replace('|^[/]*|','/',$path);
-      }
-      
-      $this->_path = $path;
-      // check the format and store it
-      switch ($format) {
-      case CAS_PGT_STORAGE_FILE_FORMAT_PLAIN:
-      case CAS_PGT_STORAGE_FILE_FORMAT_XML:
-       $this->_format = $format;
-       break;
-      default:
-       phpCAS::error('unknown PGT file storage format (`'.CAS_PGT_STORAGE_FILE_FORMAT_PLAIN.'\' and `'.CAS_PGT_STORAGE_FILE_FORMAT_XML.'\' allowed)');
-      }
-      phpCAS::traceEnd();      
-    }
-
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-  
-  /**
-   * This method is used to initialize the storage. Halts on error.
-   *
-   * @public
-   */
-  function init()
-    {
-      phpCAS::traceBegin();
-      // if the storage has already been initialized, return immediatly
-      if ( $this->isInitialized() )
-       return;
-      // call the ancestor's method (mark as initialized)
-      parent::init();
-      phpCAS::traceEnd();      
-    }
-
-  // ########################################################################
-  //  PGT I/O
-  // ########################################################################
-
-  /**
-   * This method returns the filename corresponding to a PGT Iou.
-   *
-   * @param $pgt_iou the PGT iou.
-   *
-   * @return a filename
-   * @private
-   */
-  function getPGTIouFilename($pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $filename = $this->getPath().$pgt_iou.'.'.$this->getFormat();
-      phpCAS::traceEnd($filename);
-      return $filename;
-    }
-  
-  /**
-   * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a
-   * warning on error.
-   *
-   * @param $pgt the PGT
-   * @param $pgt_iou the PGT iou
-   *
-   * @public
-   */
-  function write($pgt,$pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $fname = $this->getPGTIouFilename($pgt_iou);
-      if ( $f=fopen($fname,"w") ) {
-       if ( fputs($f,$pgt) === FALSE ) {
-         phpCAS::error('could not write PGT to `'.$fname.'\'');
-       }
-       fclose($f);
-      } else {
-       phpCAS::error('could not open `'.$fname.'\'');
-      }
-      phpCAS::traceEnd();      
-    }
-
-  /**
-   * This method reads a PGT corresponding to a PGT Iou and deletes the 
-   * corresponding file.
-   *
-   * @param $pgt_iou the PGT iou
-   *
-   * @return the corresponding PGT, or FALSE on error
-   *
-   * @public
-   */
-  function read($pgt_iou)
-    {
-      phpCAS::traceBegin();
-      $pgt = FALSE;
-      $fname = $this->getPGTIouFilename($pgt_iou);
-      if ( !($f=fopen($fname,"r")) ) {
-       phpCAS::trace('could not open `'.$fname.'\'');
-      } else {
-       if ( ($pgt=fgets($f)) === FALSE ) {
-         phpCAS::trace('could not read PGT from `'.$fname.'\'');
-       } 
-       fclose($f);
-      }
-
-      // delete the PGT file
-      @unlink($fname);
-
-      phpCAS::traceEnd($pgt);
-      return $pgt;
-    }
-  
-  /** @} */
-  
-}
-
-  
+<?php\r
+\r
+/**\r
+ * @file CAS/PGTStorage/pgt-file.php\r
+ * Basic class for PGT file storage\r
+ */\r
+\r
+/**\r
+ * @class PGTStorageFile\r
+ * The PGTStorageFile class is a class for PGT file storage. An instance of \r
+ * this class is returned by CASClient::SetPGTStorageFile().\r
+ *\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ *\r
+ * @ingroup internalPGTStorageFile\r
+ */\r
+\r
+class PGTStorageFile extends PGTStorage\r
+{\r
+  /** \r
+   * @addtogroup internalPGTStorageFile \r
+   * @{ \r
+   */\r
+\r
+  /**\r
+   * a string telling where PGT's should be stored on the filesystem. Written by\r
+   * PGTStorageFile::PGTStorageFile(), read by getPath().\r
+   *\r
+   * @private\r
+   */\r
+  var $_path;\r
+\r
+  /**\r
+   * This method returns the name of the directory where PGT's should be stored \r
+   * on the filesystem.\r
+   *\r
+   * @return the name of a directory (with leading and trailing '/')\r
+   *\r
+   * @private\r
+   */\r
+  function getPath()\r
+    {\r
+      return $this->_path;\r
+    }\r
+\r
+  /**\r
+   * a string telling the format to use to store PGT's (plain or xml). Written by\r
+   * PGTStorageFile::PGTStorageFile(), read by getFormat().\r
+   *\r
+   * @private\r
+   */\r
+  var $_format;\r
+\r
+  /**\r
+   * This method returns the format to use when storing PGT's on the filesystem.\r
+   *\r
+   * @return a string corresponding to the format used (plain or xml).\r
+   *\r
+   * @private\r
+   */\r
+  function getFormat()\r
+    {\r
+      return $this->_format;\r
+    }\r
+\r
+  // ########################################################################\r
+  //  DEBUGGING\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * This method returns an informational string giving the type of storage\r
+   * used by the object (used for debugging purposes).\r
+   *\r
+   * @return an informational string.\r
+   * @public\r
+   */\r
+  function getStorageType()\r
+    {\r
+      return "file";\r
+    }\r
+\r
+  /**\r
+   * This method returns an informational string giving informations on the\r
+   * parameters of the storage.(used for debugging purposes).\r
+   *\r
+   * @return an informational string.\r
+   * @public\r
+   */\r
+  function getStorageInfo()\r
+    {\r
+      return 'path=`'.$this->getPath().'\', format=`'.$this->getFormat().'\'';\r
+    }\r
+\r
+  // ########################################################################\r
+  //  CONSTRUCTOR\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * The class constructor, called by CASClient::SetPGTStorageFile().\r
+   *\r
+   * @param $cas_parent the CASClient instance that creates the object.\r
+   * @param $format the format used to store the PGT's (`plain' and `xml' allowed).\r
+   * @param $path the path where the PGT's should be stored\r
+   *\r
+   * @public\r
+   */\r
+  function PGTStorageFile($cas_parent,$format,$path)\r
+    {\r
+      phpCAS::traceBegin();\r
+      // call the ancestor's constructor\r
+      $this->PGTStorage($cas_parent);\r
+\r
+      if (empty($format) ) $format = CAS_PGT_STORAGE_FILE_DEFAULT_FORMAT;\r
+      if (empty($path) ) $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;\r
+\r
+      // check that the path is an absolute path\r
+      if (getenv("OS")=="Windows_NT"){\r
+       \r
+        if (!preg_match('`^[a-zA-Z]:`', $path)) {\r
+               phpCAS::error('an absolute path is needed for PGT storage to file');\r
+       }\r
+       \r
+      }\r
+      else\r
+      {\r
+      \r
+       if ( $path[0] != '/' ) {\r
+                       phpCAS::error('an absolute path is needed for PGT storage to file');\r
+       }\r
+\r
+       // store the path (with a leading and trailing '/')      \r
+       $path = preg_replace('|[/]*$|','/',$path);\r
+       $path = preg_replace('|^[/]*|','/',$path);\r
+      }\r
+      \r
+      $this->_path = $path;\r
+      // check the format and store it\r
+      switch ($format) {\r
+      case CAS_PGT_STORAGE_FILE_FORMAT_PLAIN:\r
+      case CAS_PGT_STORAGE_FILE_FORMAT_XML:\r
+       $this->_format = $format;\r
+       break;\r
+      default:\r
+       phpCAS::error('unknown PGT file storage format (`'.CAS_PGT_STORAGE_FILE_FORMAT_PLAIN.'\' and `'.CAS_PGT_STORAGE_FILE_FORMAT_XML.'\' allowed)');\r
+      }\r
+      phpCAS::traceEnd();      \r
+    }\r
+\r
+  // ########################################################################\r
+  //  INITIALIZATION\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * This method is used to initialize the storage. Halts on error.\r
+   *\r
+   * @public\r
+   */\r
+  function init()\r
+    {\r
+      phpCAS::traceBegin();\r
+      // if the storage has already been initialized, return immediatly\r
+      if ( $this->isInitialized() )\r
+       return;\r
+      // call the ancestor's method (mark as initialized)\r
+      parent::init();\r
+      phpCAS::traceEnd();      \r
+    }\r
+\r
+  // ########################################################################\r
+  //  PGT I/O\r
+  // ########################################################################\r
+\r
+  /**\r
+   * This method returns the filename corresponding to a PGT Iou.\r
+   *\r
+   * @param $pgt_iou the PGT iou.\r
+   *\r
+   * @return a filename\r
+   * @private\r
+   */\r
+  function getPGTIouFilename($pgt_iou)\r
+    {\r
+      phpCAS::traceBegin();\r
+      $filename = $this->getPath().$pgt_iou.'.'.$this->getFormat();\r
+      phpCAS::traceEnd($filename);\r
+      return $filename;\r
+    }\r
+  \r
+  /**\r
+   * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a\r
+   * warning on error.\r
+   *\r
+   * @param $pgt the PGT\r
+   * @param $pgt_iou the PGT iou\r
+   *\r
+   * @public\r
+   */\r
+  function write($pgt,$pgt_iou)\r
+    {\r
+      phpCAS::traceBegin();\r
+      $fname = $this->getPGTIouFilename($pgt_iou);\r
+      if ( $f=fopen($fname,"w") ) {\r
+       if ( fputs($f,$pgt) === FALSE ) {\r
+         phpCAS::error('could not write PGT to `'.$fname.'\'');\r
+       }\r
+       fclose($f);\r
+      } else {\r
+       phpCAS::error('could not open `'.$fname.'\'');\r
+      }\r
+      phpCAS::traceEnd();      \r
+    }\r
+\r
+  /**\r
+   * This method reads a PGT corresponding to a PGT Iou and deletes the \r
+   * corresponding file.\r
+   *\r
+   * @param $pgt_iou the PGT iou\r
+   *\r
+   * @return the corresponding PGT, or FALSE on error\r
+   *\r
+   * @public\r
+   */\r
+  function read($pgt_iou)\r
+    {\r
+      phpCAS::traceBegin();\r
+      $pgt = FALSE;\r
+      $fname = $this->getPGTIouFilename($pgt_iou);\r
+      if ( !($f=fopen($fname,"r")) ) {\r
+       phpCAS::trace('could not open `'.$fname.'\'');\r
+      } else {\r
+       if ( ($pgt=fgets($f)) === FALSE ) {\r
+         phpCAS::trace('could not read PGT from `'.$fname.'\'');\r
+       } \r
+       fclose($f);\r
+      }\r
+\r
+      // delete the PGT file\r
+      @unlink($fname);\r
+\r
+      phpCAS::traceEnd($pgt);\r
+      return $pgt;\r
+    }\r
+  \r
+  /** @} */\r
+  \r
+}\r
+\r
+  \r
 ?>
\ No newline at end of file
index 8fd3c9e12ba1577176e4ea7535c1e4789e9ff172..cd9b499671a97448a93b6db3544caab7415a0b83 100644 (file)
-<?php
-
-/**
- * @file CAS/PGTStorage/pgt-main.php
- * Basic class for PGT storage
- */
-
-/**
- * @class PGTStorage
- * The PGTStorage class is a generic class for PGT storage. This class should
- * not be instanciated itself but inherited by specific PGT storage classes.
- *
- * @author   Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- *
- * @ingroup internalPGTStorage
- */
-
-class PGTStorage
-{
-  /** 
-   * @addtogroup internalPGTStorage
-   * @{ 
-   */
-
-  // ########################################################################
-  //  CONSTRUCTOR
-  // ########################################################################
-  
-  /**
-   * The constructor of the class, should be called only by inherited classes.
-   *
-   * @param $cas_parent the CASclient instance that creates the current object.
-   *
-   * @protected
-   */
-  function PGTStorage($cas_parent)
-    {
-      phpCAS::traceBegin();
-      if ( !$cas_parent->isProxy() ) {
-       phpCAS::error('defining PGT storage makes no sense when not using a CAS proxy'); 
-      }
-      phpCAS::traceEnd();
-    }
-
-  // ########################################################################
-  //  DEBUGGING
-  // ########################################################################
-  
-  /**
-   * This virtual method returns an informational string giving the type of storage
-   * used by the object (used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageType()
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /**
-   * This virtual method returns an informational string giving informations on the
-   * parameters of the storage.(used for debugging purposes).
-   *
-   * @public
-   */
-  function getStorageInfo()
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  // ########################################################################
-  //  ERROR HANDLING
-  // ########################################################################
-  
-  /**
-   * string used to store an error message. Written by PGTStorage::setErrorMessage(),
-   * read by PGTStorage::getErrorMessage().
-   *
-   * @hideinitializer
-   * @private
-   * @deprecated not used.
-   */
-  var $_error_message=FALSE;
-
-  /**
-   * This method sets en error message, which can be read later by 
-   * PGTStorage::getErrorMessage().
-   *
-   * @param $error_message an error message
-   *
-   * @protected
-   * @deprecated not used.
-   */
-  function setErrorMessage($error_message)
-    {
-      $this->_error_message = $error_message;
-    }
-
-  /**
-   * This method returns an error message set by PGTStorage::setErrorMessage().
-   *
-   * @return an error message when set by PGTStorage::setErrorMessage(), FALSE
-   * otherwise.
-   *
-   * @public
-   * @deprecated not used.
-   */
-  function getErrorMessage()
-    {
-      return $this->_error_message;
-    }
-
-  // ########################################################################
-  //  INITIALIZATION
-  // ########################################################################
-
-  /**
-   * a boolean telling if the storage has already been initialized. Written by 
-   * PGTStorage::init(), read by PGTStorage::isInitialized().
-   *
-   * @hideinitializer
-   * @private
-   */
-  var $_initialized = FALSE;
-
-  /**
-   * This method tells if the storage has already been intialized.
-   *
-   * @return a boolean
-   *
-   * @protected
-   */
-  function isInitialized()
-    {
-      return $this->_initialized;
-    }
-
-  /**
-   * This virtual method initializes the object.
-   *
-   * @protected
-   */
-  function init()
-    {
-      $this->_initialized = TRUE;
-    }
-
-  // ########################################################################
-  //  PGT I/O
-  // ########################################################################
-
-  /**
-   * This virtual method stores a PGT and its corresponding PGT Iuo.
-   * @note Should never be called.
-   *
-   * @param $pgt the PGT
-   * @param $pgt_iou the PGT iou
-   *
-   * @protected
-   */
-  function write($pgt,$pgt_iou)
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /**
-   * This virtual method reads a PGT corresponding to a PGT Iou and deletes
-   * the corresponding storage entry.
-   * @note Should never be called.
-   *
-   * @param $pgt_iou the PGT iou
-   *
-   * @protected
-   */
-  function read($pgt_iou)
-    {
-      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); 
-    }
-
-  /** @} */
-  
-} 
-
-// include specific PGT storage classes
-include_once(dirname(__FILE__).'/pgt-file.php'); 
-include_once(dirname(__FILE__).'/pgt-db.php');
-  
+<?php\r
+\r
+/**\r
+ * @file CAS/PGTStorage/pgt-main.php\r
+ * Basic class for PGT storage\r
+ */\r
+\r
+/**\r
+ * @class PGTStorage\r
+ * The PGTStorage class is a generic class for PGT storage. This class should\r
+ * not be instanciated itself but inherited by specific PGT storage classes.\r
+ *\r
+ * @author   Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ *\r
+ * @ingroup internalPGTStorage\r
+ */\r
+\r
+class PGTStorage\r
+{\r
+  /** \r
+   * @addtogroup internalPGTStorage\r
+   * @{ \r
+   */\r
+\r
+  // ########################################################################\r
+  //  CONSTRUCTOR\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * The constructor of the class, should be called only by inherited classes.\r
+   *\r
+   * @param $cas_parent the CASclient instance that creates the current object.\r
+   *\r
+   * @protected\r
+   */\r
+  function PGTStorage($cas_parent)\r
+    {\r
+      phpCAS::traceBegin();\r
+      if ( !$cas_parent->isProxy() ) {\r
+       phpCAS::error('defining PGT storage makes no sense when not using a CAS proxy'); \r
+      }\r
+      phpCAS::traceEnd();\r
+    }\r
+\r
+  // ########################################################################\r
+  //  DEBUGGING\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * This virtual method returns an informational string giving the type of storage\r
+   * used by the object (used for debugging purposes).\r
+   *\r
+   * @public\r
+   */\r
+  function getStorageType()\r
+    {\r
+      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); \r
+    }\r
+\r
+  /**\r
+   * This virtual method returns an informational string giving informations on the\r
+   * parameters of the storage.(used for debugging purposes).\r
+   *\r
+   * @public\r
+   */\r
+  function getStorageInfo()\r
+    {\r
+      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); \r
+    }\r
+\r
+  // ########################################################################\r
+  //  ERROR HANDLING\r
+  // ########################################################################\r
+  \r
+  /**\r
+   * string used to store an error message. Written by PGTStorage::setErrorMessage(),\r
+   * read by PGTStorage::getErrorMessage().\r
+   *\r
+   * @hideinitializer\r
+   * @private\r
+   * @deprecated not used.\r
+   */\r
+  var $_error_message=FALSE;\r
+\r
+  /**\r
+   * This method sets en error message, which can be read later by \r
+   * PGTStorage::getErrorMessage().\r
+   *\r
+   * @param $error_message an error message\r
+   *\r
+   * @protected\r
+   * @deprecated not used.\r
+   */\r
+  function setErrorMessage($error_message)\r
+    {\r
+      $this->_error_message = $error_message;\r
+    }\r
+\r
+  /**\r
+   * This method returns an error message set by PGTStorage::setErrorMessage().\r
+   *\r
+   * @return an error message when set by PGTStorage::setErrorMessage(), FALSE\r
+   * otherwise.\r
+   *\r
+   * @public\r
+   * @deprecated not used.\r
+   */\r
+  function getErrorMessage()\r
+    {\r
+      return $this->_error_message;\r
+    }\r
+\r
+  // ########################################################################\r
+  //  INITIALIZATION\r
+  // ########################################################################\r
+\r
+  /**\r
+   * a boolean telling if the storage has already been initialized. Written by \r
+   * PGTStorage::init(), read by PGTStorage::isInitialized().\r
+   *\r
+   * @hideinitializer\r
+   * @private\r
+   */\r
+  var $_initialized = FALSE;\r
+\r
+  /**\r
+   * This method tells if the storage has already been intialized.\r
+   *\r
+   * @return a boolean\r
+   *\r
+   * @protected\r
+   */\r
+  function isInitialized()\r
+    {\r
+      return $this->_initialized;\r
+    }\r
+\r
+  /**\r
+   * This virtual method initializes the object.\r
+   *\r
+   * @protected\r
+   */\r
+  function init()\r
+    {\r
+      $this->_initialized = TRUE;\r
+    }\r
+\r
+  // ########################################################################\r
+  //  PGT I/O\r
+  // ########################################################################\r
+\r
+  /**\r
+   * This virtual method stores a PGT and its corresponding PGT Iuo.\r
+   * @note Should never be called.\r
+   *\r
+   * @param $pgt the PGT\r
+   * @param $pgt_iou the PGT iou\r
+   *\r
+   * @protected\r
+   */\r
+  function write($pgt,$pgt_iou)\r
+    {\r
+      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); \r
+    }\r
+\r
+  /**\r
+   * This virtual method reads a PGT corresponding to a PGT Iou and deletes\r
+   * the corresponding storage entry.\r
+   * @note Should never be called.\r
+   *\r
+   * @param $pgt_iou the PGT iou\r
+   *\r
+   * @protected\r
+   */\r
+  function read($pgt_iou)\r
+    {\r
+      phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); \r
+    }\r
+\r
+  /** @} */\r
+  \r
+} \r
+\r
+// include specific PGT storage classes\r
+include_once(dirname(__FILE__).'/pgt-file.php'); \r
+include_once(dirname(__FILE__).'/pgt-db.php');\r
+  \r
 ?>
\ No newline at end of file
index bbde55a284d04fedf7fcff613081ccb768c1ec93..ad5a23f8396bf6be3c307b064f8c652b10b92391 100644 (file)
@@ -351,6 +351,43 @@ class CASClient
                {
                return $this->_server['login_url'] = $url;
                }
+               
+               
+       /**
+        * This method sets the serviceValidate URL of the CAS server.
+        * @param $url the serviceValidate URL
+        * @private
+        * @since 1.1.0 by Joachim Fritschi
+        */
+       function setServerServiceValidateURL($url)
+               {
+               return $this->_server['service_validate_url'] = $url;
+               }
+               
+               
+       /**
+        * This method sets the proxyValidate URL of the CAS server.
+        * @param $url the proxyValidate URL
+        * @private
+        * @since 1.1.0 by Joachim Fritschi
+        */
+       function setServerProxyValidateURL($url)
+               {
+               return $this->_server['proxy_validate_url'] = $url;
+               }
+               
+               
+       /**
+        * This method sets the samlValidate URL of the CAS server.
+        * @param $url the samlValidate URL
+        * @private
+        * @since 1.1.0 by Joachim Fritschi
+        */
+       function setServerSamlValidateURL($url)
+               {
+               return $this->_server['saml_validate_url'] = $url;
+               }
+                       
        
        /**
         * This method is used to retrieve the service validating URL of the CAS server.
@@ -373,7 +410,25 @@ class CASClient
                //      return $this->_server['service_validate_url'].'?service='.preg_replace('/&/','%26',$this->getURL()); 
                return $this->_server['service_validate_url'].'?service='.urlencode($this->getURL()); 
                }
-       
+       /**
+       * This method is used to retrieve the SAML validating URL of the CAS server.
+       * @return a URL.
+       * @private
+       */
+       function getServerSamlValidateURL()
+       {
+       phpCAS::traceBegin();
+       // the URL is build only when needed
+       if ( empty($this->_server['saml_validate_url']) ) {
+               switch ($this->getServerVersion()) {
+               case SAML_VERSION_1_1:
+                       $this->_server['saml_validate_url'] = $this->getServerBaseURL().'samlValidate';
+                       break;
+                       }
+       }
+       phpCAS::traceEnd($this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL()));
+       return $this->_server['saml_validate_url'].'?TARGET='.urlencode($this->getURL());
+       }
        /**
         * This method is used to retrieve the proxy validating URL of the CAS server.
         * @return a URL.
@@ -497,31 +552,51 @@ class CASClient
                
                phpCAS::traceBegin();
                
-               if (!$this->isLogoutRequest() && !empty($_GET['ticket']) && $start_session) {
-            // copy old session vars and destroy the current session
-            if (!isset($_SESSION)) {
-               session_start();
-            }
-            $old_session = $_SESSION;
-            session_destroy();
-            // set up a new session, of name based on the ticket
-                       $session_id = preg_replace('/[^\w]/','',$_GET['ticket']);
-                       phpCAS::LOG("Session ID: " . $session_id);
-                       session_id($session_id);
-            if (!isset($_SESSION)) {
-               session_start();
-            }
-            // restore old session vars
-            $_SESSION = $old_session;
-            // Redirect to location without ticket.
-            header('Location: '.$this->getURL());
-               }
-               
-               //activate session mechanism if desired
-               if (!$this->isLogoutRequest() && $start_session) {
-                       session_start();
+               // the redirect header() call and DOM parsing code from domxml-php4-php5.php won't work in PHP4 compatibility mode
+               if (version_compare(PHP_VERSION,'5','>=') && ini_get('zend.ze1_compatibility_mode')) {
+                       phpCAS::error('phpCAS cannot support zend.ze1_compatibility_mode. Sorry.');
+               }
+               // skip Session Handling for logout requests and if don't want it'
+               if ($start_session && !$this->isLogoutRequest()) {
+                       phpCAS::trace("Starting session handling");
+                       // Check for Tickets from the CAS server
+                       if (empty($_GET['ticket'])){
+                               phpCAS::trace("No ticket found");
+                               // only create a session if necessary
+                               if (!isset($_SESSION)) {
+                                       phpCAS::trace("No session found, creating new session");
+                                       session_start();
+                               }
+                       }else{
+                               phpCAS::trace("Ticket found");
+                               // We have to copy any old data before renaming the session
+                               if (isset($_SESSION)) {
+                                       phpCAS::trace("Old active session found, saving old data and destroying session");
+                                       $old_session = $_SESSION;
+                                       session_destroy();      
+                               }else{
+                                       session_start();
+                                       phpCAS::trace("Starting possible old session to copy variables");
+                                       $old_session = $_SESSION;
+                                       session_destroy();      
+                               }
+                               // set up a new session, of name based on the ticket
+                               $session_id = preg_replace('/[^\w]/','',$_GET['ticket']);
+                               phpCAS::LOG("Session ID: " . $session_id);
+                               session_id($session_id);
+                               session_start();
+                               // restore old session vars
+                               if(isset($old_session)){
+                                       phpCAS::trace("Restoring old session vars");
+                                       $_SESSION = $old_session;
+                               }
+                       }
+               }else{
+                       phpCAS::trace("Skipping session creation");
                }
+
                
+               // are we in proxy mode ?
                $this->_proxy = $proxy;
                
                //check version
@@ -533,6 +608,8 @@ class CASClient
                                break;
                        case CAS_VERSION_2_0:
                                break;
+                       case SAML_VERSION_1_1:
+                               break;
                        default:
                                phpCAS::error('this version of CAS (`'
                                        .$server_version
@@ -541,29 +618,29 @@ class CASClient
                }
                $this->_server['version'] = $server_version;
                
-               //check hostname
+               // check hostname
                if ( empty($server_hostname) 
                                || !preg_match('/[\.\d\-abcdefghijklmnopqrstuvwxyz]*/',$server_hostname) ) {
                        phpCAS::error('bad CAS server hostname (`'.$server_hostname.'\')');
                }
                $this->_server['hostname'] = $server_hostname;
                
-               //check port
+               // check port
                if ( $server_port == 0 
                        || !is_int($server_port) ) {
                        phpCAS::error('bad CAS server port (`'.$server_hostname.'\')');
                }
                $this->_server['port'] = $server_port;
                
-               //check URI
+               // check URI
                if ( !preg_match('/[\.\d\-_abcdefghijklmnopqrstuvwxyz\/]*/',$server_uri) ) {
                        phpCAS::error('bad CAS server URI (`'.$server_uri.'\')');
                }
-               //add leading and trailing `/' and remove doubles      
+               // add leading and trailing `/' and remove doubles      
                $server_uri = preg_replace('/\/\//','/','/'.$server_uri.'/');
                $this->_server['uri'] = $server_uri;
                
-               //set to callback mode if PgtIou and PgtId CGI GET parameters are provided 
+               // set to callback mode if PgtIou and PgtId CGI GET parameters are provided 
                if ( $this->isProxy() ) {
                        $this->setCallbackMode(!empty($_GET['pgtIou'])&&!empty($_GET['pgtId']));
                }
@@ -590,8 +667,12 @@ class CASClient
                                        }
                                        break;
                                case CAS_VERSION_2_0: // check for a Service or Proxy Ticket
-                                       if( preg_match('/^[SP]T-/',$ticket) ) {
-                                               phpCAS::trace('ST or PT \''.$ticket.'\' found');
+                                       if (preg_match('/^ST-/', $ticket)) {
+                                               phpCAS::trace('ST \'' . $ticket . '\' found');
+                                               $this->setST($ticket);
+                                               unset ($_GET['ticket']);
+                                       } else if (preg_match('/^PT-/', $ticket)) {
+                                               phpCAS::trace('PT \'' . $ticket . '\' found');
                                                $this->setPT($ticket);
                                                unset($_GET['ticket']);
                                        } else if ( !empty($ticket) ) {
@@ -599,6 +680,16 @@ class CASClient
                                                phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
                                        } 
                                        break;
+                               case SAML_VERSION_1_1: // SAML just does Service Tickets
+                                       if( preg_match('/^[SP]T-/',$ticket) ) {
+                                       phpCAS::trace('SA \''.$ticket.'\' found');
+                                       $this->setSA($ticket);
+                                       unset($_GET['ticket']);
+                                       } else if ( !empty($ticket) ) {
+                                               //ill-formed ticket, halt
+                                               phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
+                                       }
+                                       break;
                        }
                }
                phpCAS::traceEnd();
@@ -652,6 +743,45 @@ class CASClient
                }
                return $this->_user;
                }
+
+
+       
+       /***********************************************************************************************************************
+        * Atrributes section
+        * 
+        * @author Matthias Crauwels <matthias.crauwels@ugent.be>, Ghent University, Belgium
+        * 
+        ***********************************************************************************************************************/
+       /**
+        * The Authenticated users attributes. Written by CASClient::setAttributes(), read by CASClient::getAttributes().
+        * @attention client applications should use phpCAS::getAttributes().
+        *
+        * @hideinitializer
+        * @private
+        */     
+       var $_attributes = array();
+
+       function setAttributes($attributes)     
+               { $this->_attributes = $attributes; }
+               
+       function getAttributes() {
+               if ( empty($this->_user) ) { // if no user is set, there shouldn't be any attributes also...
+                       phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
+               }
+               return $this->_attributes;
+       }
+               
+       function hasAttributes()
+               { return !empty($this->_attributes); }
+               
+       function hasAttribute($key)
+               { return (is_array($this->_attributes) && array_key_exists($key, $this->_attributes)); }
+               
+       function getAttribute($key)     {
+               if($this->hasAttribute($key)) {
+                       return $this->_attributes[$key];
+               }
+       }
        
        /**
         * This method is called to renew the authentication of the user
@@ -778,55 +908,72 @@ class CASClient
         * This method is called to check if the user is authenticated (previously or by
         * tickets given in the URL).
         *
-        * @return TRUE when the user is authenticated.
+        * @return TRUE when the user is authenticated. Also may redirect to the same URL without the ticket.
         *
         * @public
         */
        function isAuthenticated()
                {
-               phpCAS::traceBegin();
-               $res = FALSE;
-               $validate_url = '';
-               
-               if ( $this->wasPreviouslyAuthenticated() ) {
-                       // the user has already (previously during the session) been 
-                       // authenticated, nothing to be done.
-                       phpCAS::trace('user was already authenticated, no need to look for tickets');
-                       $res = TRUE;
-               } 
-               elseif ( $this->hasST() ) {
-                       // if a Service Ticket was given, validate it
-                       phpCAS::trace('ST `'.$this->getST().'\' is present');
-                       $this->validateST($validate_url,$text_response,$tree_response); // if it fails, it halts
-                       phpCAS::trace('ST `'.$this->getST().'\' was validated');
-                       if ( $this->isProxy() ) {
-                               $this->validatePGT($validate_url,$text_response,$tree_response); // idem
-                               phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
-                               $_SESSION['phpCAS']['pgt'] = $this->getPGT();
+                       phpCAS::traceBegin();
+                       $res = FALSE;
+                       $validate_url = '';
+
+                       if ( $this->wasPreviouslyAuthenticated() ) {
+                               // the user has already (previously during the session) been
+                               // authenticated, nothing to be done.
+                               phpCAS::trace('user was already authenticated, no need to look for tickets');
+                               $res = TRUE;
                        }
-                       $_SESSION['phpCAS']['user'] = $this->getUser();
-                       $res = TRUE;
-               }
-               elseif ( $this->hasPT() ) {
-                       // if a Proxy Ticket was given, validate it
-                       phpCAS::trace('PT `'.$this->getPT().'\' is present');
-                       $this->validatePT($validate_url,$text_response,$tree_response); // note: if it fails, it halts
-                       phpCAS::trace('PT `'.$this->getPT().'\' was validated');
-                       if ( $this->isProxy() ) {
-                               $this->validatePGT($validate_url,$text_response,$tree_response); // idem
-                               phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
-                               $_SESSION['phpCAS']['pgt'] = $this->getPGT();
+                       else {
+                               if ( $this->hasST() ) {
+                                       // if a Service Ticket was given, validate it
+                                       phpCAS::trace('ST `'.$this->getST().'\' is present');
+                                       $this->validateST($validate_url,$text_response,$tree_response); // if it fails, it halts
+                                       phpCAS::trace('ST `'.$this->getST().'\' was validated');
+                                       if ( $this->isProxy() ) {
+                                               $this->validatePGT($validate_url,$text_response,$tree_response); // idem
+                                               phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
+                                               $_SESSION['phpCAS']['pgt'] = $this->getPGT();
+                                       }
+                                       $_SESSION['phpCAS']['user'] = $this->getUser();
+                                       $res = TRUE;
+                               }
+                               elseif ( $this->hasPT() ) {
+                                       // if a Proxy Ticket was given, validate it
+                                       phpCAS::trace('PT `'.$this->getPT().'\' is present');
+                                       $this->validatePT($validate_url,$text_response,$tree_response); // note: if it fails, it halts
+                                       phpCAS::trace('PT `'.$this->getPT().'\' was validated');
+                                       if ( $this->isProxy() ) {
+                                               $this->validatePGT($validate_url,$text_response,$tree_response); // idem
+                                               phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
+                                               $_SESSION['phpCAS']['pgt'] = $this->getPGT();
+                                       }
+                                       $_SESSION['phpCAS']['user'] = $this->getUser();
+                                       $res = TRUE;
+                               }
+                               elseif ( $this->hasSA() ) {
+                                       // if we have a SAML ticket, validate it.
+                                       phpCAS::trace('SA `'.$this->getSA().'\' is present');
+                                       $this->validateSA($validate_url,$text_response,$tree_response); // if it fails, it halts
+                                       phpCAS::trace('SA `'.$this->getSA().'\' was validated');
+                                       $_SESSION['phpCAS']['user'] = $this->getUser();
+                                       $_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+                                       $res = TRUE;
+                               }
+                               else {
+                                       // no ticket given, not authenticated
+                                       phpCAS::trace('no ticket found');
+                               }
+                               if ($res) {
+                                       // if called with a ticket parameter, we need to redirect to the app without the ticket so that CAS-ification is transparent to the browser (for later POSTS)
+                                       // most of the checks and errors should have been made now, so we're safe for redirect without masking error messages.
+                                       header('Location: '.$this->getURL());
+                                       phpCAS::log( "Prepare redirect to : ".$this->getURL() );
+                               }
                        }
-                       $_SESSION['phpCAS']['user'] = $this->getUser();
-                       $res = TRUE;
-               } 
-               else {
-                       // no ticket given, not authenticated
-                       phpCAS::trace('no ticket found');
-               }
-               
-               phpCAS::traceEnd($res);
-               return $res;
+
+                       phpCAS::traceEnd($res);
+                       return $res;
                }
        
        /**
@@ -889,6 +1036,9 @@ class CASClient
                        if ( $this->isSessionAuthenticated() ) {
                                // authentication already done
                                $this->setUser($_SESSION['phpCAS']['user']);
+                               if(isset($_SESSION['phpCAS']['attributes'])){
+                                       $this->setAttributes($_SESSION['phpCAS']['attributes']);
+                               }
                                phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\''); 
                                $auth = TRUE;
                        } else {
@@ -917,6 +1067,7 @@ class CASClient
                
                printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
                $this->printHTMLFooter();
+               
                phpCAS::traceExit();
                exit();
        }
@@ -962,11 +1113,15 @@ class CASClient
                        $cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params['service']); 
                }
                header('Location: '.$cas_url);
+               phpCAS::log( "Prepare redirect to : ".$cas_url );
                session_unset();
                session_destroy();
+               
                $this->printHTMLHeader($this->getString(CAS_STR_LOGOUT));
                printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
                $this->printHTMLFooter();
+               
                phpCAS::traceExit();
                exit();
        }
@@ -1009,10 +1164,10 @@ class CASClient
                        }
                        $client_ip = $_SERVER['REMOTE_ADDR'];
                        $client = gethostbyaddr($client_ip);
-                       phpCAS::log("Client: ".$client);
+                       phpCAS::log("Client: ".$client."/".$client_ip); 
                        $allowed = false;
                        foreach ($allowed_clients as $allowed_client) {
-                               if ($client == $allowed_client) {
+                               if (($client == $allowed_client) or ($client_ip == $allowed_client)) { 
                                        phpCAS::log("Allowed client '".$allowed_client."' matches, logout request is allowed");
                                        $allowed = true;
                                        break;
@@ -1284,6 +1439,151 @@ class CASClient
                phpCAS::traceEnd(TRUE);
                return TRUE;
                }
+
+ // ########################################################################
+ //  SAML VALIDATION
+ // ########################################################################
+   /**
+    * @addtogroup internalBasic
+    * @{
+    */
+
+   /**
+    * This method is used to validate a SAML TICKET; halt on failure, and sets $validate_url,
+    * $text_reponse and $tree_response on success. These parameters are used later
+    * by CASClient::validatePGT() for CAS proxies.
+    *
+    * @param $validate_url the URL of the request to the CAS server.
+    * @param $text_response the response of the CAS server, as is (XML text).
+    * @param $tree_response the response of the CAS server, as a DOM XML tree.
+    *
+    * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
+    *
+    * @private
+    */
+   function validateSA($validate_url,&$text_response,&$tree_response)
+     {
+       phpCAS::traceBegin();
+
+       // build the URL to validate the ticket
+       $validate_url = $this->getServerSamlValidateURL();
+
+       // open and read the URL
+       if ( !$this->readURL($validate_url,''/*cookies*/,$headers,$text_response,$err_msg) ) {
+           phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+           $this->authError('SA not validated', $validate_url, TRUE/*$no_response*/);
+       }
+
+       phpCAS::trace('server version: '.$this->getServerVersion());
+
+       // analyze the result depending on the version
+       switch ($this->getServerVersion()) {
+       case SAML_VERSION_1_1:
+
+     // read the response of the CAS server into a DOM object
+       if ( !($dom = domxml_open_mem($text_response))) {
+         phpCAS::trace('domxml_open_mem() failed');
+         $this->authError('SA not validated',
+                      $validate_url,
+                      FALSE/*$no_response*/,
+                      TRUE/*$bad_response*/,
+                      $text_response);
+       }
+       // read the root node of the XML tree
+       if ( !($tree_response = $dom->document_element()) ) {
+         phpCAS::trace('document_element() failed');
+         $this->authError('SA not validated',
+                      $validate_url,
+                      FALSE/*$no_response*/,
+                      TRUE/*$bad_response*/,
+                      $text_response);
+       }
+       // insure that tag name is 'Envelope'
+       if ( $tree_response->node_name() != 'Envelope' ) {
+         phpCAS::trace('bad XML root node (should be `Envelope\' instead of `'.$tree_response->node_name().'\'');
+         $this->authError('SA not validated',
+                      $validate_url,
+                      FALSE/*$no_response*/,
+                      TRUE/*$bad_response*/,
+                      $text_response);
+       }
+     // check for the NameIdentifier tag in the SAML response
+       if ( sizeof($success_elements = $tree_response->get_elements_by_tagname("NameIdentifier")) != 0) {
+       phpCAS::trace('NameIdentifier found');
+         $user = trim($success_elements[0]->get_content());
+         phpCAS::trace('user = `'.$user.'`');
+         $this->setUser($user);
+       $this->setSessionAttributes($text_response);
+       } else {
+         phpCAS::trace('no <NameIdentifier> tag found in SAML payload');
+         $this->authError('SA not validated',
+                      $validate_url,
+                      FALSE/*$no_response*/,
+                      TRUE/*$bad_response*/,
+                      $text_response);
+       }
+       break;
+       }
+
+       // at this step, ST has been validated and $this->_user has been set,
+       phpCAS::traceEnd(TRUE);
+       return TRUE;
+     }
+
+   /**
+    * This method will parse the DOM and pull out the attributes from the SAML
+    * payload and put them into an array, then put the array into the session.
+    *
+    * @param $text_response the SAML payload.
+    * @return bool TRUE when successfull, halt otherwise by calling CASClient::authError().
+    *
+    * @private
+    */
+ function setSessionAttributes($text_response)
+ {
+           phpCAS::traceBegin();
+
+           $result = FALSE;
+
+           if (isset($_SESSION[SAML_ATTRIBUTES])) {
+             phpCAS::trace("session attrs already set.");  //testbml - do we care?
+           }
+
+           $attr_array = array();
+
+                if (($dom = domxml_open_mem($text_response))) {
+                   $xPath = $dom->xpath_new_context();
+                   $xPath->xpath_register_ns('samlp', 'urn:oasis:names:tc:SAML:1.0:protocol');
+                   $xPath->xpath_register_ns('saml', 'urn:oasis:names:tc:SAML:1.0:assertion');
+                   $nodelist = $xPath->xpath_eval("//saml:Attribute");
+                   $attrs = $nodelist->nodeset;
+                   phpCAS::trace($text_response);
+                  foreach($attrs as $attr){
+                      $xres = $xPath->xpath_eval("saml:AttributeValue", $attr);
+                      $name = $attr->get_attribute("AttributeName");
+                      $value_array = array();
+                      foreach($xres->nodeset as $node){
+                          $value_array[] = $node->get_content();
+                         
+                      }
+                      phpCAS::trace("* " . $name . "=" . $value_array);
+                      $attr_array[$name] = $value_array;
+                   }
+                   $_SESSION[SAML_ATTRIBUTES] = $attr_array;
+                  // UGent addition...
+                  foreach($attr_array as $attr_key => $attr_value) {
+                     if(count($attr_value) > 1) {
+                       $this->_attributes[$attr_key] = $attr_value;
+                     }
+                     else {
+                       $this->_attributes[$attr_key] = $attr_value[0];
+                     }
+                  }
+                   $result = TRUE;
+                }
+       phpCAS::traceEnd($result);
+       return $result;
+ }
        
        /** @} */
        
@@ -1495,6 +1795,7 @@ class CASClient
                $this->storePGT($pgt,$pgt_iou);
                $this->printHTMLFooter();
                phpCAS::traceExit();
+               exit();
                }
        
        /** @} */
@@ -1585,7 +1886,7 @@ class CASClient
                }
                
                // create the storage object
-               $this->_pgt_storage = &new PGTStorageFile($this,$format,$path);
+               $this->_pgt_storage = new PGTStorageFile($this,$format,$path);
                }
        
        /**
@@ -1622,7 +1923,7 @@ class CASClient
                trigger_error('PGT storage into database is an experimental feature, use at your own risk',E_USER_WARNING);
                
                // create the storage object
-               $this->_pgt_storage = new PGTStorageDB($this,$user,$password,$database_type,$hostname,$port,$database,$table);
+               $this->_pgt_storage = new PGTStorageDB($this,$user,$password,$database_type,$hostname,$port,$database,$table);
                }
        
        // ########################################################################
@@ -1643,7 +1944,8 @@ class CASClient
         */
        function validatePGT(&$validate_url,$text_response,$tree_response)
                {
-               phpCAS::traceBegin();
+               // here cannot use phpCAS::traceBegin(); alongside domxml-php4-to-php5.php
+               phpCAS::log('start validatePGT()');
                if ( sizeof($arr = $tree_response->get_elements_by_tagname("proxyGrantingTicket")) == 0) {
                        phpCAS::trace('<proxyGrantingTicket> not found');
                        // authentication succeded, but no PGT Iou was transmitted
@@ -1666,7 +1968,8 @@ class CASClient
                        }
                        $this->setPGT($pgt);
                }
-               phpCAS::traceEnd(TRUE);
+               // here, cannot use     phpCAS::traceEnd(TRUE); alongside domxml-php4-to-php5.php
+               phpCAS::log('end validatePGT()');
                return TRUE;
                }
        
@@ -1819,7 +2122,15 @@ class CASClient
                if ($this->_cas_server_cert == '' && $this->_cas_server_ca_cert == '' && !$this->_no_cas_server_validation) {
                        phpCAS::error('one of the methods phpCAS::setCasServerCert(), phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.');
                }
-               if ($this->_cas_server_cert != '' ) {
+               if ($this->_cas_server_cert != '' && $this->_cas_server_ca_cert != '') {
+                       // This branch added by IDMS. Seems phpCAS implementor got a bit confused about the curl options CURLOPT_SSLCERT and CURLOPT_CAINFO
+                       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+                       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+                       curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
+                       curl_setopt($ch, CURLOPT_CAINFO, $this->_cas_server_ca_cert);
+                       curl_setopt($ch, CURLOPT_VERBOSE, '1');
+                       phpCAS::trace('CURL: Set all required opts for mutual authentication ------');
+               } else if ($this->_cas_server_cert != '' ) {
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
                        curl_setopt($ch, CURLOPT_SSLCERT, $this->_cas_server_cert);
                } else if ($this->_cas_server_ca_cert != '') {
@@ -1839,11 +2150,28 @@ class CASClient
                if ( is_array($cookies) ) {
                        curl_setopt($ch,CURLOPT_COOKIE,implode(';',$cookies));
                }
+                // add extra stuff if SAML
+                if ($this->hasSA()) {
+                        $more_headers = array ("soapaction: http://www.oasis-open.org/committees/security",
+                                               "cache-control: no-cache",
+                                               "pragma: no-cache",
+                                               "accept: text/xml",
+                                               "connection: keep-alive",
+                                               "content-type: text/xml");
+
+                       curl_setopt($ch, CURLOPT_HTTPHEADER, $more_headers);
+                       curl_setopt($ch, CURLOPT_POST, 1);
+                       $data = $this->buildSAMLPayload();
+                       //phpCAS::trace('SAML Payload: '.print_r($data, TRUE));
+                       curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+                }
                // perform the query
                $buf = curl_exec ($ch);
+               //phpCAS::trace('CURL: Call completed. Response body is: \''.$buf.'\'');
                if ( $buf === FALSE ) {
                        phpCAS::trace('curl_exec() failed');
                        $err_msg = 'CURL error #'.curl_errno($ch).': '.curl_error($ch);
+                       //phpCAS::trace('curl error: '.$err_msg);
                        // close the CURL session
                        curl_close ($ch);
                        $res = FALSE;
@@ -1858,7 +2186,28 @@ class CASClient
                phpCAS::traceEnd($res);
                return $res;
        }
-       
+
+        /**
+        * This method is used to build the SAML POST body sent to /samlValidate URL.
+        *
+        * @return the SOAP-encased SAMLP artifact (the ticket).
+        *
+        * @private
+        */
+        function buildSAMLPayload()
+        {
+        phpCAS::traceBegin();
+
+        //get the ticket
+        $sa = $this->getSA();
+        //phpCAS::trace("SA: ".$sa);
+
+        $body=SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
+
+        phpCAS::traceEnd($body);
+        return ($body);
+        }
+
        /**
         * This method is the callback used by readURL method to request HTTP headers.
         */
@@ -1951,6 +2300,7 @@ class CASClient
         * 
         * @param $url a string giving the URL of the service, including the mailing box
         * for IMAP URLs, as accepted by imap_open().
+        * @param $service a string giving for CAS retrieve Proxy ticket
         * @param $flags options given to imap_open().
         * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
         * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
@@ -1964,11 +2314,11 @@ class CASClient
         *
         * @public
         */
-       function serviceMail($url,$flags,&$err_code,&$err_msg,&$pt)
+       function serviceMail($url,$service,$flags,&$err_code,&$err_msg,&$pt)
                {
                phpCAS::traceBegin();
                // at first retrieve a PT
-               $pt = $this->retrievePT($target_service,$err_code,$output);
+               $pt = $this->retrievePT($service,$err_code,$output);
                
                $stream = FALSE;
                
@@ -2049,7 +2399,30 @@ class CASClient
         */
        function hasPT()
                { return !empty($this->_pt); }
-       
+       /**
+       * This method returns the SAML Ticket provided in the URL of the request.
+       * @return The SAML ticket.
+       * @private
+       */
+       function getSA()
+       { return 'ST'.substr($this->_sa, 2); }
+
+       /**
+       * This method stores the SAML Ticket.
+       * @param $sa The SAML Ticket.
+       * @private
+       */
+       function setSA($sa)
+       { $this->_sa = $sa; }
+
+       /**
+       * This method tells if a SAML Ticket was stored.
+       * @return TRUE if a SAML Ticket has been stored.
+       * @private
+       */
+       function hasSA()
+       { return !empty($this->_sa); }
+
        /** @} */
        // ########################################################################
        //  PT VALIDATION
@@ -2213,8 +2586,13 @@ class CASClient
                                }
                        }
                        
-                       $final_uri .= strtok($_SERVER['REQUEST_URI'],"?");
-                       $cgi_params = '?'.strtok("?");
+                       $php_is_for_sissies = split("\?", $_SERVER['REQUEST_URI'], 2);
+                       $final_uri .= $php_is_for_sissies[0];
+                       if(sizeof($php_is_for_sissies) > 1){
+                               $cgi_params = '?' . $php_is_for_sissies[1];
+                       } else {
+                               $cgi_params = '?';
+                       }
                        // remove the ticket if present in the CGI parameters
                        $cgi_params = preg_replace('/&ticket=[^&]*/','',$cgi_params);
                        $cgi_params = preg_replace('/\?ticket=[^&;]*/','?',$cgi_params);
@@ -2294,4 +2672,4 @@ class CASClient
        /** @} */
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/plugins/CasAuthentication/extlib/CAS/domxml-php4-php5.php b/plugins/CasAuthentication/extlib/CAS/domxml-php4-php5.php
deleted file mode 100644 (file)
index a0dfb99..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/**
- * @file domxml-php4-php5.php
- * Require PHP5, uses built-in DOM extension.
- * To be used in PHP4 scripts using DOMXML extension.
- * Allows PHP4/DOMXML scripts to run on PHP5/DOM.
- * (Requires PHP5/XSL extension for domxml_xslt functions)
- *
- * Typical use:
- * <pre>
- * {
- *  if (version_compare(PHP_VERSION,'5','>='))
- *   require_once('domxml-php4-to-php5.php');
- * }
- * </pre>
- *
- * Version 1.5.5, 2005-01-18, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
- *
- * ------------------------------------------------------------------<br>
- * Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/
- *
- * Copyright 2004, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR),
- * http://creativecommons.org/licenses/by-sa/2.0/fr/
- * http://alexandre.alapetite.net/divers/apropos/#by-sa
- * - Attribution. You must give the original author credit
- * - Share Alike. If you alter, transform, or build upon this work,
- *   you may distribute the resulting work only under a license identical to this one
- * - The French law is authoritative
- * - Any of these conditions can be waived if you get permission from Alexandre Alapetite
- * - Please send to Alexandre Alapetite the modifications you make,
- *   in order to improve this file for the benefit of everybody
- *
- * If you want to distribute this code, please do it as a link to:
- * http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
- */
-
-function domxml_new_doc($version) {return new php4DOMDocument('');}
-function domxml_open_file($filename) {return new php4DOMDocument($filename);}
-function domxml_open_mem($str)
-{
- $dom=new php4DOMDocument('');
- $dom->myDOMNode->loadXML($str);
- return $dom;
-}
-function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->query($eval_str,$contextnode);}
-function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);}
-
-class php4DOMAttr extends php4DOMNode
-{
- function php4DOMAttr($aDOMAttr) {$this->myDOMNode=$aDOMAttr;}
- function Name() {return $this->myDOMNode->name;}
- function Specified() {return $this->myDOMNode->specified;}
- function Value() {return $this->myDOMNode->value;}
-}
-
-class php4DOMDocument extends php4DOMNode
-{
- function php4DOMDocument($filename='')
- {
-  $this->myDOMNode=new DOMDocument();
-  if ($filename!='') $this->myDOMNode->load($filename);
- }
- function create_attribute($name,$value)
- {
-  $myAttr=$this->myDOMNode->createAttribute($name);
-  $myAttr->value=$value;
-  return new php4DOMAttr($myAttr,$this);
- }
- function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);}
- function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);}
- function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);}
- function create_text_node($content) {return new php4DOMNode($this->myDOMNode->createTextNode($content),$this);}
- function document_element() {return new php4DOMElement($this->myDOMNode->documentElement,$this);}
- function dump_file($filename,$compressionmode=false,$format=false) {return $this->myDOMNode->save($filename);}
- function dump_mem($format=false,$encoding=false) {return $this->myDOMNode->saveXML();}
- function get_element_by_id($id) {return new php4DOMElement($this->myDOMNode->getElementById($id),$this);}
- function get_elements_by_tagname($name)
- {
-  $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
-  $nodeSet=array();
-  $i=0;
-  if (isset($myDOMNodeList))
-   while ($node=$myDOMNodeList->item($i))
-   {
-    $nodeSet[]=new php4DOMElement($node,$this);
-    $i++;
-   }
-  return $nodeSet;
- }
- function html_dump_mem() {return $this->myDOMNode->saveHTML();}
- function root() {return new php4DOMElement($this->myDOMNode->documentElement,$this);}
-}
-
-class php4DOMElement extends php4DOMNode
-{
- function get_attribute($name) {return $this->myDOMNode->getAttribute($name);}
- function get_elements_by_tagname($name)
- {
-  $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
-  $nodeSet=array();
-  $i=0;
-  if (isset($myDOMNodeList))
-   while ($node=$myDOMNodeList->item($i))
-   {
-    $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
-    $i++;
-   }
-  return $nodeSet;
- }
- function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);}
- function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);}
- function set_attribute($name,$value) {return $this->myDOMNode->setAttribute($name,$value);}
- function tagname() {return $this->myDOMNode->tagName;}
-}
-
-class php4DOMNode
-{
- var $myDOMNode;
- var $myOwnerDocument;
- function php4DOMNode($aDomNode,$aOwnerDocument)
- {
-  $this->myDOMNode=$aDomNode;
-  $this->myOwnerDocument=$aOwnerDocument;
- }
- function __get($name)
- {
-  if ($name=='type') return $this->myDOMNode->nodeType;
-  elseif ($name=='tagname') return $this->myDOMNode->tagName;
-  elseif ($name=='content') return $this->myDOMNode->textContent;
-  else
-  {
-   $myErrors=debug_backtrace();
-   trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE);
-   return false;
-  }
- }
- function append_child($newnode) {return new php4DOMElement($this->myDOMNode->appendChild($newnode->myDOMNode),$this->myOwnerDocument);}
- function append_sibling($newnode) {return new php4DOMElement($this->myDOMNode->parentNode->appendChild($newnode->myDOMNode),$this->myOwnerDocument);}
- function attributes()
- {
-  $myDOMNodeList=$this->myDOMNode->attributes;
-  $nodeSet=array();
-  $i=0;
-  if (isset($myDOMNodeList))
-   while ($node=$myDOMNodeList->item($i))
-   {
-    $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument);
-    $i++;
-   }
-  return $nodeSet;
- }
- function child_nodes()
- {
-  $myDOMNodeList=$this->myDOMNode->childNodes;
-  $nodeSet=array();
-  $i=0;
-  if (isset($myDOMNodeList))
-   while ($node=$myDOMNodeList->item($i))
-   {
-    $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
-    $i++;
-   }
-  return $nodeSet;
- }
- function children() {return $this->child_nodes();}
- function clone_node($deep=false) {return new php4DOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);}
- function first_child() {return new php4DOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);}
- function get_content() {return $this->myDOMNode->textContent;}
- function has_attributes() {return $this->myDOMNode->hasAttributes();}
- function has_child_nodes() {return $this->myDOMNode->hasChildNodes();}
- function insert_before($newnode,$refnode) {return new php4DOMElement($this->myDOMNode->insertBefore($newnode->myDOMNode,$refnode->myDOMNode),$this->myOwnerDocument);}
- function is_blank_node()
- {
-  $myDOMNodeList=$this->myDOMNode->childNodes;
-  $i=0;
-  if (isset($myDOMNodeList))
-   while ($node=$myDOMNodeList->item($i))
-   {
-    if (($node->nodeType==XML_ELEMENT_NODE)||
-        (($node->nodeType==XML_TEXT_NODE)&&!ereg('^([[:cntrl:]]|[[:space:]])*$',$node->nodeValue)))
-     return false;
-    $i++;
-   }
-  return true;
- }
- function last_child() {return new php4DOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);}
- function new_child($name,$content)
- {
-  $mySubNode=$this->myDOMNode->ownerDocument->createElement($name);
-  $mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode($content));
-  $this->myDOMNode->appendChild($mySubNode);
-  return new php4DOMElement($mySubNode,$this->myOwnerDocument);
- }
- function next_sibling() {return new php4DOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);}
- function node_name() {return $this->myDOMNode->localName;}
- function node_type() {return $this->myDOMNode->nodeType;}
- function node_value() {return $this->myDOMNode->nodeValue;}
- function owner_document() {return $this->myOwnerDocument;}
- function parent_node() {return new php4DOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);}
- function prefix() {return $this->myDOMNode->prefix;}
- function previous_sibling() {return new php4DOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);}
- function remove_child($oldchild) {return new php4DOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);}
- function replace_child($oldnode,$newnode) {return new php4DOMElement($this->myDOMNode->replaceChild($oldnode->myDOMNode,$newnode->myDOMNode),$this->myOwnerDocument);}
- function set_content($text)
- {
-  if (($this->myDOMNode->hasChildNodes())&&($this->myDOMNode->firstChild->nodeType==XML_TEXT_NODE))
-   $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
-  return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode($text));
- }
-}
-
-class php4DOMNodelist
-{
- var $myDOMNodelist;
- var $nodeset;
- function php4DOMNodelist($aDOMNodelist,$aOwnerDocument)
- {
-  $this->myDOMNodelist=$aDOMNodelist;
-  $this->nodeset=array();
-  $i=0;
-  if (isset($this->myDOMNodelist))
-   while ($node=$this->myDOMNodelist->item($i))
-   {
-    $this->nodeset[]=new php4DOMElement($node,$aOwnerDocument);
-    $i++;
-   }
- }
-}
-
-class php4DOMXPath
-{
- var $myDOMXPath;
- var $myOwnerDocument;
- function php4DOMXPath($dom_document)
- {
-  $this->myOwnerDocument=$dom_document;
-  $this->myDOMXPath=new DOMXPath($dom_document->myDOMNode);
- }
- function query($eval_str,$contextnode)
- {
-  if (isset($contextnode)) return new php4DOMNodelist($this->myDOMXPath->query($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument);
-  else return new php4DOMNodelist($this->myDOMXPath->query($eval_str),$this->myOwnerDocument);
- }
- function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
-}
-
-if (extension_loaded('xsl'))
-{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
- function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));}
- function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);}
- function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));}
- class php4DomXsltStylesheet
- {
-  var $myxsltProcessor;
-  function php4DomXsltStylesheet($dom_document)
-  {
-   $this->myxsltProcessor=new xsltProcessor();
-   $this->myxsltProcessor->importStyleSheet($dom_document);
-  }
-  function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false)
-  {
-   foreach ($xslt_parameters as $param=>$value)
-    $this->myxsltProcessor->setParameter('',$param,$value);
-   $myphp4DOMDocument=new php4DOMDocument();
-   $myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode);
-   return $myphp4DOMDocument;
-  }
-  function result_dump_file($dom_document,$filename)
-  {
-   $html=$dom_document->myDOMNode->saveHTML();
-   file_put_contents($filename,$html);
-   return $html;
-  }
-  function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();}
- }
-}
-?>
\ No newline at end of file
diff --git a/plugins/CasAuthentication/extlib/CAS/domxml-php4-to-php5.php b/plugins/CasAuthentication/extlib/CAS/domxml-php4-to-php5.php
new file mode 100644 (file)
index 0000000..1dc4e4b
--- /dev/null
@@ -0,0 +1,499 @@
+<?php
+/*
+       Requires PHP5, uses built-in DOM extension.
+       To be used in PHP4 scripts using DOMXML extension: allows PHP4/DOMXML scripts to run on PHP5/DOM.
+       (Optional: requires PHP5/XSL extension for domxml_xslt functions, PHP>=5.1 for XPath evaluation functions, and PHP>=5.1/libxml for DOMXML error reports)
+
+       Typical use:
+       {
+               if (PHP_VERSION>='5')
+                       require_once('domxml-php4-to-php5.php');
+       }
+
+       Version 1.21, 2008-12-05, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
+
+       ------------------------------------------------------------------
+       Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/
+
+       Copyright 2004-2008, GNU Lesser General Public License,
+       http://www.gnu.org/licenses/lgpl.html
+
+       This program is free software: you can redistribute it and/or modify
+       it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
+       You should have received a copy of the GNU Lesser General Public License
+       along with this program. If not, see <http://www.gnu.org/licenses/lgpl.html>
+
+       == Rights and obligations ==
+       - Attribution: You must give the original author credit.
+       - Share Alike: If you alter or transform this library,
+          you may distribute the resulting library only under the same license GNU/LGPL.
+       - In case of jurisdiction dispute, the French law is authoritative.
+       - Any of these conditions can be waived if you get permission from Alexandre Alapetite.
+       - Not required, but please send to Alexandre Alapetite the modifications you make,
+          in order to improve this file for the benefit of everybody.
+
+       If you want to distribute this code, please do it as a link to:
+       http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
+*/
+
+define('DOMXML_LOAD_PARSING',0);
+define('DOMXML_LOAD_VALIDATING',1);
+define('DOMXML_LOAD_RECOVERING',2);
+define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4);
+//define('DOMXML_LOAD_COMPLETE_ATTRS',8);
+define('DOMXML_LOAD_DONT_KEEP_BLANKS',16);
+
+function domxml_new_doc($version) {return new php4DOMDocument();}
+function domxml_new_xmldoc($version) {return new php4DOMDocument();}
+function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null)
+{
+       $dom=new php4DOMDocument($mode);
+       $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
+       if ($errorMode) libxml_use_internal_errors(true);
+       if (!$dom->myDOMNode->load($filename)) $dom=null;
+       if ($errorMode)
+       {
+               $error=array_map('_error_report',libxml_get_errors());
+               libxml_clear_errors();
+       }
+       return $dom;
+}
+function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null)
+{
+       $dom=new php4DOMDocument($mode);
+       $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION');
+       if ($errorMode) libxml_use_internal_errors(true);
+       if (!$dom->myDOMNode->loadXML($str)) $dom=null;
+       if ($errorMode)
+       {
+               $error=array_map('_error_report',libxml_get_errors());
+               libxml_clear_errors();
+       }
+       return $dom;
+}
+function html_doc($html_doc,$from_file=false)
+{
+       $dom=new php4DOMDocument();
+       if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc);
+       else $result=$dom->myDOMNode->loadHTML($html_doc);
+       return $result ? $dom : null;
+}
+function html_doc_file($filename) {return html_doc($filename,true);}
+function xmldoc($str) {return domxml_open_mem($str);}
+function xmldocfile($filename) {return domxml_open_file($filename);}
+function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);}
+function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);}
+function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
+function _entityDecode($text) {return html_entity_decode(strtr($text,array('&apos;'=>'\'')),ENT_QUOTES,'UTF-8');}
+function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));}
+
+class php4DOMAttr extends php4DOMNode
+{
+       function __get($name)
+       {
+               if ($name==='name') return $this->myDOMNode->name;
+               else return parent::__get($name);
+       }
+       function name() {return $this->myDOMNode->name;}
+       function set_content($text) {}
+       //function set_value($content) {return $this->myDOMNode->value=htmlspecialchars($content,ENT_QUOTES);}
+       function specified() {return $this->myDOMNode->specified;}
+       function value() {return $this->myDOMNode->value;}
+}
+
+class php4DOMDocument extends php4DOMNode
+{
+       function php4DOMDocument($mode=DOMXML_LOAD_PARSING)
+       {
+               $this->myDOMNode=new DOMDocument();
+               $this->myOwnerDocument=$this;
+               if ($mode & DOMXML_LOAD_VALIDATING) $this->myDOMNode->validateOnParse=true;
+               if ($mode & DOMXML_LOAD_RECOVERING) $this->myDOMNode->recover=true;
+               if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $this->myDOMNode->substituteEntities=true;
+               if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $this->myDOMNode->preserveWhiteSpace=false;
+       }
+       function add_root($name)
+       {
+               if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
+               return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument);
+       }
+       function create_attribute($name,$value)
+       {
+               $myAttr=$this->myDOMNode->createAttribute($name);
+               $myAttr->value=htmlspecialchars($value,ENT_QUOTES);
+               return new php4DOMAttr($myAttr,$this);
+       }
+       function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);}
+       function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);}
+       function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);}
+       function create_element_ns($uri,$name,$prefix=null)
+       {
+               if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri);
+               if (($prefix==null)&&(($this->myDOMNode->documentElement==null)||(!$this->myDOMNode->documentElement->isDefaultNamespace($uri)))) $prefix='a'.sprintf('%u',crc32($uri));
+               return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this);
+       }
+       function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22
+       function create_processing_instruction($target,$data=''){return new php4DomProcessingInstruction($this->myDOMNode->createProcessingInstruction($target,$data),$this);}
+       function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);}
+       function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
+       function dump_file($filename,$compressionmode=false,$format=false)
+       {
+               $format0=$this->myDOMNode->formatOutput;
+               $this->myDOMNode->formatOutput=$format;
+               $res=$this->myDOMNode->save($filename);
+               $this->myDOMNode->formatOutput=$format0;
+               return $res;
+       }
+       function dump_mem($format=false,$encoding=false)
+       {
+               $format0=$this->myDOMNode->formatOutput;
+               $this->myDOMNode->formatOutput=$format;
+               $encoding0=$this->myDOMNode->encoding;
+               if ($encoding) $this->myDOMNode->encoding=$encoding;
+               $dump=$this->myDOMNode->saveXML();
+               $this->myDOMNode->formatOutput=$format0;
+               if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding
+               return $dump;
+       }
+       function free()
+       {
+               if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild);
+               $this->myDOMNode=null;
+               $this->myOwnerDocument=null;
+       }
+       function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);}
+       function get_elements_by_tagname($name)
+       {
+               $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
+               $nodeSet=array();
+               $i=0;
+               if (isset($myDOMNodeList))
+                       while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this);
+               return $nodeSet;
+       }
+       function html_dump_mem() {return $this->myDOMNode->saveHTML();}
+       function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);}
+       function xinclude() {return $this->myDOMNode->xinclude();}
+       function xpath_new_context() {return new php4DOMXPath($this);}
+}
+
+class php4DOMElement extends php4DOMNode
+{
+       function add_namespace($uri,$prefix)
+       {
+               if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false;
+               else
+               {
+                       $this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); //By Daniel Walker 2006-09-08
+                       return true;
+               }
+       }
+       function get_attribute($name) {return $this->myDOMNode->getAttribute($name);}
+       function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);}
+       function get_elements_by_tagname($name)
+       {
+               $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name);
+               $nodeSet=array();
+               $i=0;
+               if (isset($myDOMNodeList))
+                       while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument);
+               return $nodeSet;
+       }
+       function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);}
+       function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);}
+       function set_attribute($name,$value)
+       {
+               //return $this->myDOMNode->setAttribute($name,$value); //Does not return a DomAttr
+               $myAttr=$this->myDOMNode->ownerDocument->createAttribute($name);
+               $myAttr->value=htmlspecialchars($value,ENT_QUOTES); //Entity problem reported by AL-DesignWorks 2007-09-07
+               $this->myDOMNode->setAttributeNode($myAttr);
+               return new php4DOMAttr($myAttr,$this->myOwnerDocument);
+       }
+       /*function set_attribute_node($attr)
+       {
+               $this->myDOMNode->setAttributeNode($this->_importNode($attr));
+               return $attr;
+       }*/
+       function set_name($name)
+       {
+               if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name);
+               else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name);
+               $myDOMNodeList=$this->myDOMNode->attributes;
+               $i=0;
+               if (isset($myDOMNodeList))
+                       while ($node=$myDOMNodeList->item($i++))
+                               if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value);
+                               else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value);
+               $myDOMNodeList=$this->myDOMNode->childNodes;
+               if (isset($myDOMNodeList))
+                       while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node);
+               $this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode);
+               $this->myDOMNode=$newNode;
+               return true;
+       }
+       function tagname() {return $this->tagname;}
+}
+
+class php4DOMNode
+{
+       public $myDOMNode;
+       public $myOwnerDocument;
+       function php4DOMNode($aDomNode,$aOwnerDocument)
+       {
+               $this->myDOMNode=$aDomNode;
+               $this->myOwnerDocument=$aOwnerDocument;
+       }
+       function __get($name)
+       {
+               switch ($name)
+               {
+                       case 'type': return $this->myDOMNode->nodeType;
+                       case 'tagname': return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->tagName; //Avoid namespace prefix for DOMElement
+                       case 'content': return $this->myDOMNode->textContent;
+                       case 'value': return $this->myDOMNode->value;
+                       default:
+                               $myErrors=debug_backtrace();
+                               trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE);
+                               return false;
+               }
+       }
+       function add_child($newnode) {return append_child($newnode);}
+       function add_namespace($uri,$prefix) {return false;}
+       function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
+       function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);}
+       function attributes()
+       {
+               $myDOMNodeList=$this->myDOMNode->attributes;
+               if (!(isset($myDOMNodeList)&&$this->myDOMNode->hasAttributes())) return null;
+               $nodeSet=array();
+               $i=0;
+               while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument);
+               return $nodeSet;
+       }
+       function child_nodes()
+       {
+               $myDOMNodeList=$this->myDOMNode->childNodes;
+               $nodeSet=array();
+               $i=0;
+               if (isset($myDOMNodeList))
+                       while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument);
+               return $nodeSet;
+       }
+       function children() {return $this->child_nodes();}
+       function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);}
+       //dump_node($node) should only be called on php4DOMDocument
+       function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);}
+       function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);}
+       function get_content() {return $this->myDOMNode->textContent;}
+       function has_attributes() {return $this->myDOMNode->hasAttributes();}
+       function has_child_nodes() {return $this->myDOMNode->hasChildNodes();}
+       function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);}
+       function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);}
+       function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);}
+       function new_child($name,$content)
+       {
+               $mySubNode=$this->myDOMNode->ownerDocument->createElement($name);
+               $mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($content)));
+               $this->myDOMNode->appendChild($mySubNode);
+               return new php4DOMElement($mySubNode,$this->myOwnerDocument);
+       }
+       function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);}
+       function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement
+       function node_type() {return $this->myDOMNode->nodeType;}
+       function node_value() {return $this->myDOMNode->nodeValue;}
+       function owner_document() {return $this->myOwnerDocument;}
+       function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);}
+       function prefix() {return $this->myDOMNode->prefix;}
+       function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);}
+       function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);}
+       function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);}
+       function replace_node($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->replaceChild($this->_importNode($newnode),$this->myDOMNode),$this->myOwnerDocument);}
+       function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($text)));} //Entity problem reported by AL-DesignWorks 2007-09-07
+       //function set_name($name) {return $this->myOwnerDocument->renameNode($this->myDOMNode,$this->myDOMNode->namespaceURI,$name);}
+       function set_namespace($uri,$prefix=null)
+       {//Contributions by Daniel Walker 2006-09-08
+               $nsprefix=$this->myDOMNode->lookupPrefix($uri);
+               if ($nsprefix==null)
+               {
+                       $nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix;
+                       if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
+                       {
+                               if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&&
+                                       ($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri))
+                               {//Remove namespace
+                                       $parent=$this->myDOMNode->ownerElement;
+                                       $parent->removeAttributeNode($this->myDOMNode);
+                                       $parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue);
+                                       $this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName);
+                                       return;
+                               }
+                               $this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri);
+                       }
+               }
+               if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE)
+               {
+                       $parent=$this->myDOMNode->ownerElement;
+                       $parent->removeAttributeNode($this->myDOMNode);
+                       $parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue);
+                       $this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName);
+               }
+               elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE)
+               {
+                       $NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName);
+                       foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true));
+                       foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true));
+                       $xpath=new DOMXPath($this->myDOMNode->ownerDocument);
+                       $myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces
+                       foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue); 
+                       $this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode);
+                       $this->myDOMNode=$NewNode;
+               }
+       }
+       function unlink_node()
+       {
+               if ($this->myDOMNode->parentNode!=null)
+               {
+                       if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode);
+                       else $this->myDOMNode->parentNode->removeChild($this->myDOMNode);
+               }
+       }
+       protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} //To import DOMNode from another DOMDocument
+       static function _newDOMElement($aDOMNode,$aOwnerDocument)
+       {//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper
+               if ($aDOMNode==null) return null;
+               switch ($aDOMNode->nodeType)
+               {
+                       case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument);
+                       case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument);
+                       case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument);
+                       case XML_PI_NODE: return new php4DomProcessingInstruction($aDOMNode,$aOwnerDocument);
+                       default: return new php4DOMNode($aDOMNode,$aOwnerDocument);
+               }
+       }
+}
+
+class php4DomProcessingInstruction extends php4DOMNode
+{
+       function data() {return $this->myDOMNode->data;}
+       function target() {return $this->myDOMNode->target;}
+}
+
+class php4DOMText extends php4DOMNode
+{
+       function __get($name)
+       {
+               if ($name==='tagname') return '#text';
+               else return parent::__get($name);
+       }
+       function tagname() {return '#text';}
+       function set_content($text) {$this->myDOMNode->nodeValue=$text; return true;}
+}
+
+if (!defined('XPATH_NODESET'))
+{
+       define('XPATH_UNDEFINED',0);
+       define('XPATH_NODESET',1);
+       define('XPATH_BOOLEAN',2);
+       define('XPATH_NUMBER',3);
+       define('XPATH_STRING',4);
+       /*define('XPATH_POINT',5);
+       define('XPATH_RANGE',6);
+       define('XPATH_LOCATIONSET',7);
+       define('XPATH_USERS',8);
+       define('XPATH_XSLT_TREE',9);*/
+}
+
+class php4DOMNodelist
+{
+       private $myDOMNodelist;
+       public $nodeset;
+       public $type=XPATH_UNDEFINED;
+       public $value;
+       function php4DOMNodelist($aDOMNodelist,$aOwnerDocument)
+       {
+               if (!isset($aDOMNodelist)) return; 
+               elseif (is_object($aDOMNodelist)||is_array($aDOMNodelist))
+               {
+                       if ($aDOMNodelist->length>0)
+                       {
+                               $this->myDOMNodelist=$aDOMNodelist;
+                               $this->nodeset=array();
+                               $this->type=XPATH_NODESET;
+                               $i=0;
+                               while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument);
+                       }
+               }
+               elseif (is_int($aDOMNodelist)||is_float($aDOMNodelist))
+               {
+                       $this->type=XPATH_NUMBER;
+                       $this->value=$aDOMNodelist;
+               }
+               elseif (is_bool($aDOMNodelist))
+               {
+                       $this->type=XPATH_BOOLEAN;
+                       $this->value=$aDOMNodelist;
+               }
+               elseif (is_string($aDOMNodelist))
+               {
+                       $this->type=XPATH_STRING;
+                       $this->value=$aDOMNodelist;
+               }
+       }
+}
+
+class php4DOMXPath
+{
+       public $myDOMXPath;
+       private $myOwnerDocument;
+       function php4DOMXPath($dom_document)
+       {
+               //TODO: If $dom_document is a DomElement, make that default $contextnode and modify XPath. Ex: '/test'
+               $this->myOwnerDocument=$dom_document->myOwnerDocument;
+               $this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode);
+       }
+       function xpath_eval($eval_str,$contextnode=null)
+       {
+               if (method_exists($this->myDOMXPath,'evaluate')) $xp=isset($contextnode) ? $this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->evaluate($eval_str);
+               else $xp=isset($contextnode) ? $this->myDOMXPath->query($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->query($eval_str);
+               $xp=new php4DOMNodelist($xp,$this->myOwnerDocument);
+               return ($xp->type===XPATH_UNDEFINED) ? false : $xp;
+       }
+       function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);}
+}
+
+if (extension_loaded('xsl'))
+{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
+       function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));}
+       function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);}
+       function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));}
+       class php4DomXsltStylesheet
+       {
+               private $myxsltProcessor;
+               function php4DomXsltStylesheet($dom_document)
+               {
+                       $this->myxsltProcessor=new xsltProcessor();
+                       $this->myxsltProcessor->importStyleSheet($dom_document);
+               }
+               function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false)
+               {
+                       foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value);
+                       $myphp4DOMDocument=new php4DOMDocument();
+                       $myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode);
+                       return $myphp4DOMDocument;
+               }
+               function result_dump_file($dom_document,$filename)
+               {
+                       $html=$dom_document->myDOMNode->saveHTML();
+                       file_put_contents($filename,$html);
+                       return $html;
+               }
+               function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();}
+       }
+}
+?>
index 0b139c7cad2c828abe0d66387017cb4eee4e0fb0..3d67473d98caf9a7097bb8346e29ad3a9a1fff21 100644 (file)
@@ -1,27 +1,27 @@
-<?php
-
-/**
- * @file languages/spanish.php
- * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'usant servidor',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'Autentificació CAS necessària!',
- CAS_STR_LOGOUT 
- => 'Sortida de CAS necessària!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click <a href="%s">aquí</a> per a continuar.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'Autentificació CAS fallida!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>No estàs autentificat.</p><p>Pots tornar a intentar-ho fent click <a href="%s">aquí</a>.</p><p>Si el problema persisteix hauría de contactar amb l\'<a href="mailto:%s">administrador d\'aquest llocc</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'El servei `<b>%s</b>\' no està disponible (<b>%s</b>).'
-);
-
-?>
+<?php\r
+\r
+/**\r
+ * @file languages/spanish.php\r
+ * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => 'usant servidor',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => 'Autentificació CAS necessària!',\r
+ CAS_STR_LOGOUT \r
+ => 'Sortida de CAS necessària!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => 'Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click <a href="%s">aquí</a> per a continuar.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => 'Autentificació CAS fallida!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>No estàs autentificat.</p><p>Pots tornar a intentar-ho fent click <a href="%s">aquí</a>.</p><p>Si el problema persisteix hauría de contactar amb l\'<a href="mailto:%s">administrador d\'aquest llocc</a>.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => 'El servei `<b>%s</b>\' no està disponible (<b>%s</b>).'\r
+);\r
+\r
+?>\r
index d38d42c1f7c510eeab3b32498aa46348970234e8..c14345031429cdb55be5135ece9fdc5ef3603c37 100644 (file)
@@ -1,27 +1,27 @@
-<?php
-
-/**
- * @file languages/english.php
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'using server',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS Authentication wanted!',
- CAS_STR_LOGOUT 
- => 'CAS logout wanted!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'You should already have been redirected to the CAS server. Click <a href="%s">here</a> to continue.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS Authentication failed!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>You were not authenticated.</p><p>You may submit your request again by clicking <a href="%s">here</a>.</p><p>If the problem persists, you may contact <a href="mailto:%s">the administrator of this site</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'The service `<b>%s</b>\' is not available (<b>%s</b>).'
-);
-
+<?php\r
+\r
+/**\r
+ * @file languages/english.php\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => 'using server',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => 'CAS Authentication wanted!',\r
+ CAS_STR_LOGOUT \r
+ => 'CAS logout wanted!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => 'You should already have been redirected to the CAS server. Click <a href="%s">here</a> to continue.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => 'CAS Authentication failed!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>You were not authenticated.</p><p>You may submit your request again by clicking <a href="%s">here</a>.</p><p>If the problem persists, you may contact <a href="mailto:%s">the administrator of this site</a>.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => 'The service `<b>%s</b>\' is not available (<b>%s</b>).'\r
+);\r
+\r
 ?>
\ No newline at end of file
index 32d14168506e5044fd9ccfdc6a7a808c68c8536a..b077ec02e94173bd326cf33e2f7cc57a05a00949 100644 (file)
@@ -1,28 +1,28 @@
-<?php
-
-/**
- * @file languages/english.php
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'utilisant le serveur',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'Authentication CAS nécessaire&nbsp;!',
- CAS_STR_LOGOUT 
- => 'Déconnexion demandée&nbsp;!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Vous auriez du etre redirigé(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'Authentification CAS infructueuse&nbsp;!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>Vous n\'avez pas été authentifié(e).</p><p>Vous pouvez soumettre votre requete à nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le problème persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'
-
-);
-
+<?php\r
+\r
+/**\r
+ * @file languages/english.php\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => 'utilisant le serveur',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => 'Authentication CAS n�cessaire&nbsp;!',\r
+ CAS_STR_LOGOUT \r
+ => 'D�connexion demand�e&nbsp;!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => 'Vous auriez du etre redirig�(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => 'Authentification CAS infructueuse&nbsp;!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>Vous n\'avez pas �t� authentifi�(e).</p><p>Vous pouvez soumettre votre requete � nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le probl�me persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'\r
+\r
+);\r
+\r
 ?>
\ No newline at end of file
index 55c3238fde3ad36bc1f313a67707defdd4a5516d..29daeb35ddebec77ae1e527c3394ece9d7d69207 100644 (file)
@@ -1,27 +1,27 @@
-<?php
-
-/**
- * @file languages/german.php
- * @author Henrik Genssen <hg at mediafactory.de>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'via Server',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS Authentifizierung erforderlich!',
- CAS_STR_LOGOUT 
- => 'CAS Abmeldung!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'eigentlich h&auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&uuml;cken Sie <a href="%s">hier</a> um fortzufahren.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS Anmeldung fehlgeschlagen!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'Der Dienst `<b>%s</b>\' ist nicht verf&uuml;gbar (<b>%s</b>).'
-);
-
+<?php\r
+\r
+/**\r
+ * @file languages/german.php\r
+ * @author Henrik Genssen <hg at mediafactory.de>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => 'via Server',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => 'CAS Authentifizierung erforderlich!',\r
+ CAS_STR_LOGOUT \r
+ => 'CAS Abmeldung!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => 'eigentlich h&auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&uuml;cken Sie <a href="%s">hier</a> um fortzufahren.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => 'CAS Anmeldung fehlgeschlagen!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => 'Der Dienst `<b>%s</b>\' ist nicht verf&uuml;gbar (<b>%s</b>).'\r
+);\r
+\r
 ?>
\ No newline at end of file
index d41bf783b4a602f1b534e55f58d81a3cbc4f4b16..fdff77e4e5572c5e04e8f4c2f748b1e8f0c60da5 100644 (file)
@@ -1,27 +1,27 @@
-<?php
-
-/**
- * @file languages/greek.php
- * @author Vangelis Haniotakis <haniotak at ucnet.uoc.gr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => '÷ñçóéìïðïéåßôáé ï åîõðçñåôçôÞò',
- CAS_STR_AUTHENTICATION_WANTED 
- => 'Áðáéôåßôáé ç ôáõôïðïßçóç CAS!',
- CAS_STR_LOGOUT 
- => 'Áðáéôåßôáé ç áðïóýíäåóç áðü CAS!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Èá Ýðñåðå íá åß÷áôå áíáêáôåõèõíèåß óôïí åîõðçñåôçôÞ CAS. ÊÜíôå êëßê <a href="%s">åäþ</a> ãéá íá óõíå÷ßóåôå.',
- CAS_STR_AUTHENTICATION_FAILED 
- => 'Ç ôáõôïðïßçóç CAS áðÝôõ÷å!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>Äåí ôáõôïðïéçèÞêáôå.</p><p>Ìðïñåßôå íá îáíáðñïóðáèÞóåôå, êÜíïíôáò êëßê <a href="%s">åäþ</a>.</p><p>Åáí ôï ðñüâëçìá åðéìåßíåé, åëÜôå óå åðáöÞ ìå ôïí <a href="mailto:%s">äéá÷åéñéóôÞ</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'Ç õðçñåóßá `<b>%s</b>\' äåí åßíáé äéáèÝóéìç (<b>%s</b>).'
-);
-
+<?php\r
+\r
+/**\r
+ * @file languages/greek.php\r
+ * @author Vangelis Haniotakis <haniotak at ucnet.uoc.gr>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => '��������������� � ������������',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => '���������� � ����������� CAS!',\r
+ CAS_STR_LOGOUT \r
+ => '���������� � ���������� ��� CAS!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => '�� ������ �� ������ �������������� ���� ����������� CAS. ����� ���� <a href="%s">���</a> ��� �� ����������.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => '� ����������� CAS �������!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>��� ���������������.</p><p>�������� �� ����������������, �������� ���� <a href="%s">���</a>.</p><p>��� �� �������� ���������, ����� �� ����� �� ��� <a href="mailto:%s">�����������</a>.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => '� �������� `<b>%s</b>\' ��� ����� ��������� (<b>%s</b>).'\r
+);\r
+\r
 ?>
\ No newline at end of file
index 333bb17b6a0ecb11334054e7dc6dd706961b09b8..76ebe77bcf5a34d4c0166f900b7acc0654237907 100644 (file)
@@ -11,17 +11,17 @@ $this->_strings = array(
  CAS_STR_USING_SERVER 
  => 'using server',
  CAS_STR_AUTHENTICATION_WANTED 
- => 'CAS¤Ë¤è¤ëǧ¾Ú¤ò¹Ô¤¤¤Þ¤¹',
+ => 'CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�',
  CAS_STR_LOGOUT 
- => 'CAS¤«¤é¥í¥°¥¢¥¦¥È¤·¤Þ¤¹!',
+ => 'CAS����?�����Ȥ��ޤ�!',
  CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'CAS¥µ¡¼¥Ð¤Ë¹Ô¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¼«Æ°Åª¤ËžÁ÷¤µ¤ì¤Ê¤¤¾ì¹ç¤Ï <a href="%s">¤³¤Á¤é</a> ¤ò¥¯¥ê¥Ã¥¯¤·¤Æ³¹Ô¤·¤Þ¤¹¡£',
+ => 'CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� <a href="%s">������</a> �򥯥�å�����³�Ԥ��ޤ���',
  CAS_STR_AUTHENTICATION_FAILED 
- => 'CAS¤Ë¤è¤ëǧ¾Ú¤Ë¼ºÇÔ¤·¤Þ¤·¤¿',
+ => 'CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���',
  CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>ǧ¾Ú¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿.</p><p>¤â¤¦°ìÅ٥ꥯ¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¾ì¹ç¤Ï<a href="%s">¤³¤Á¤é</a>¤ò¥¯¥ê¥Ã¥¯.</p><p>ÌäÂ꤬²ò·è¤·¤Ê¤¤¾ì¹ç¤Ï <a href="mailto:%s">¤³¤Î¥µ¥¤¥È¤Î´ÉÍý¼Ô</a>¤ËÌ䤤¹ç¤ï¤»¤Æ¤¯¤À¤µ¤¤.</p>',
+ => '<p>ǧ�ڤǤ��ޤ���Ǥ���.</p><p>�⤦���٥ꥯ�����Ȥ������������<a href="%s">������</a>�򥯥�å�.</p><p>���꤬��褷�ʤ����� <a href="mailto:%s">���Υ����Ȥδ����</a>���䤤��碌�Ƥ�������.</p>',
  CAS_STR_SERVICE_UNAVAILABLE
- => '¥µ¡¼¥Ó¥¹ `<b>%s</b>\' ¤ÏÍøÍѤǤ­¤Þ¤»¤ó (<b>%s</b>).'
+ => '�����ӥ� `<b>%s</b>\' �����ѤǤ��ޤ��� (<b>%s</b>).'
 );
 
 ?>
\ No newline at end of file
index 001cfe445cddfaa9afc78e5cb56431e937117400..2c6f8bb3b300ee066364725e19beea1f2e643520 100644 (file)
@@ -1,24 +1,24 @@
-<?php
-
-/**
- * @file languages/languages.php
- * Internationalization constants
- * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-//@{
-/**
- * a phpCAS string index
- */
-define("CAS_STR_USING_SERVER",                1);
-define("CAS_STR_AUTHENTICATION_WANTED",       2);
-define("CAS_STR_LOGOUT",                      3);
-define("CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED", 4);
-define("CAS_STR_AUTHENTICATION_FAILED",       5);
-define("CAS_STR_YOU_WERE_NOT_AUTHENTICATED",  6);
-define("CAS_STR_SERVICE_UNAVAILABLE",         7);
-//@}
-
+<?php\r
+\r
+/**\r
+ * @file languages/languages.php\r
+ * Internationalization constants\r
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+//@{\r
+/**\r
+ * a phpCAS string index\r
+ */\r
+define("CAS_STR_USING_SERVER",                1);\r
+define("CAS_STR_AUTHENTICATION_WANTED",       2);\r
+define("CAS_STR_LOGOUT",                      3);\r
+define("CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED", 4);\r
+define("CAS_STR_AUTHENTICATION_FAILED",       5);\r
+define("CAS_STR_YOU_WERE_NOT_AUTHENTICATED",  6);\r
+define("CAS_STR_SERVICE_UNAVAILABLE",         7);\r
+//@}\r
+\r
 ?>
\ No newline at end of file
index 04067ca03b644ae41c97ad2512632530448d3d65..3a8ffc25358bcdb0c363adb0546830bc6bbfb9a2 100644 (file)
@@ -1,27 +1,27 @@
-<?php
-
-/**
- * @file languages/spanish.php
- * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>
- * @sa @link internalLang Internationalization @endlink
- * @ingroup internalLang
- */
-
-$this->_strings = array(
- CAS_STR_USING_SERVER 
- => 'usando servidor',
- CAS_STR_AUTHENTICATION_WANTED 
- => '¡Autentificación CAS necesaria!',
- CAS_STR_LOGOUT 
- => '¡Salida CAS necesaria!',
- CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
- => 'Ya debería haber sido redireccionado al servidor CAS. Haga click <a href="%s">aquí</a> para continuar.',
- CAS_STR_AUTHENTICATION_FAILED 
- => '¡Autentificación CAS fallida!',
- CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
- => '<p>No estás autentificado.</p><p>Puedes volver a intentarlo haciendo click <a href="%s">aquí</a>.</p><p>Si el problema persiste debería contactar con el <a href="mailto:%s">administrador de este sitio</a>.</p>',
- CAS_STR_SERVICE_UNAVAILABLE
- => 'El servicio `<b>%s</b>\' no está disponible (<b>%s</b>).'
-);
-
-?>
+<?php\r
+\r
+/**\r
+ * @file languages/spanish.php\r
+ * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com>\r
+ * @sa @link internalLang Internationalization @endlink\r
+ * @ingroup internalLang\r
+ */\r
+\r
+$this->_strings = array(\r
+ CAS_STR_USING_SERVER \r
+ => 'usando servidor',\r
+ CAS_STR_AUTHENTICATION_WANTED \r
+ => '¡Autentificación CAS necesaria!',\r
+ CAS_STR_LOGOUT \r
+ => '¡Salida CAS necesaria!',\r
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED \r
+ => 'Ya debería haber sido redireccionado al servidor CAS. Haga click <a href="%s">aquí</a> para continuar.',\r
+ CAS_STR_AUTHENTICATION_FAILED \r
+ => '¡Autentificación CAS fallida!',\r
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED \r
+ => '<p>No estás autentificado.</p><p>Puedes volver a intentarlo haciendo click <a href="%s">aquí</a>.</p><p>Si el problema persiste debería contactar con el <a href="mailto:%s">administrador de este sitio</a>.</p>',\r
+ CAS_STR_SERVICE_UNAVAILABLE\r
+ => 'El servicio `<b>%s</b>\' no está disponible (<b>%s</b>).'\r
+);\r
+\r
+?>\r
index 300d1e9a2488e7430becd87e7c5f0a95cafae092..29cb3004bf95df1ecb8543002b273aaca258e4b7 100644 (file)
@@ -68,7 +68,7 @@ class CometPlugin extends RealtimePlugin
         $ours = array('jquery.comet.js', 'cometupdate.js');
 
         foreach ($ours as $script) {
-            $scripts[] = common_path('plugins/Comet/'.$script);
+            $scripts[] = 'plugins/Comet/'.$script;
         }
 
         return $scripts;
index 65d4409b5e44db258abef59163ebcbcab79e0adf..5dba73a5d8574a63f63c852229ae15a0b478b739 100644 (file)
@@ -261,7 +261,7 @@ class FacebookPlugin extends Plugin
         if ($this->reqFbScripts($action)) {
 
             $apikey      = common_config('facebook', 'apikey');
-            $plugin_path = common_path('plugins/Facebook');
+            $plugin_path = 'plugins/Facebook';
 
             $login_url  = common_local_url('FBConnectAuth');
             $logout_url = common_local_url('logout');
index 8437a705a7b7858ce5f4ecc416843ddd15182da2..f65b97c865587d10b675be04b558344b8fa3a936 100644 (file)
@@ -89,7 +89,7 @@ class FacebookAction extends Action
 
     function showScripts()
     {
-        $this->script(common_path('plugins/Facebook/facebookapp.js'));
+        $this->script('plugins/Facebook/facebookapp.js');
     }
 
     /**
index 89a775a16adbf0ff20427994ed1338e444a7a6aa..d1e920b009111d42f40f565bda2413beadc452d1 100644 (file)
@@ -86,7 +86,7 @@ class ImapPlugin extends Plugin
         }
     }
 
-    function onStartIoManagerClasses(&$classes)
+    function onStartQueueDaemonIoManagers(&$classes)
     {
         $classes[] = new ImapManager($this);
     }
index eb3a05117a4c72e2440190fce1dd8f90c7ffa87d..483209676575af0c1bb4c398b6c827124a1021a1 100644 (file)
@@ -76,6 +76,32 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
             return false;
         }
     }
+
+    function onEndShowPageNotice($action)
+    {
+        $name = $action->trimmed('action');
+        $instr = false;
+
+        switch ($name)
+        {
+         case 'register':
+            if($this->autoregistration) {
+                $instr = 'Have an LDAP account? Use your standard username and password.';
+            }
+            break;
+         case 'login':
+            $instr = 'Have an LDAP account? Use your standard username and password.';
+            break;
+         default:
+            return true;
+        }
+
+        if($instr) {
+            $output = common_markup_to_html($instr);
+            $action->raw($output);
+        }
+        return true;
+    }
     
     //---interface implementation---//
 
@@ -96,8 +122,11 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
         }
     }
 
-    function autoRegister($username)
+    function autoRegister($username, $nickname)
     {
+        if(is_null($nickname)){
+            $nickname = $username;
+        }
         $entry = $this->ldap_get_user($username,$this->attributes);
         if($entry){
             $registration_data = array();
@@ -107,6 +136,7 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
             if(isset($registration_data['email']) && !empty($registration_data['email'])){
                 $registration_data['email_confirmed']=true;
             }
+            $registration_data['nickname'] = $nickname;
             //set the database saved password to a random string.
             $registration_data['password']=common_good_rand(16);
             return User::register($registration_data);
@@ -153,6 +183,21 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
 
         return false;
     }
+
+    function suggestNicknameForUsername($username)
+    {
+        $entry = $this->ldap_get_user($username, $this->attributes);
+        if(!$entry){
+            //this really shouldn't happen
+            $nickname = $username;
+        }else{
+            $nickname = $entry->getValue($this->attributes['nickname'],'single');
+            if(!$nickname){
+                $nickname = $username;
+            }
+        }
+        return common_nicknamize($nickname);
+    }
     
     //---utility functions---//
     function ldap_get_config(){
@@ -179,8 +224,12 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
         $ldap->setErrorHandling(PEAR_ERROR_RETURN);
         $err=$ldap->bind();
         if (Net_LDAP2::isError($err)) {
-            common_log(LOG_WARNING, 'Could not connect to LDAP server: '.$err->getMessage());
-            return false;
+            // if we were called with a config, assume caller will handle
+            // incorrect username/password (LDAP_INVALID_CREDENTIALS)
+            if (isset($config) && $err->getCode() == 0x31) {
+                return null;
+            }
+            throw new Exception('Could not connect to LDAP server: '.$err->getMessage());
         }
         if($config == null) $this->default_ldap=$ldap;
 
index 0460fb6396254f698b3b9bbfb26b54c1fd9f2f15..c188f2dbc1835b0acdab886bf1f56b4d3147c0bb 100644 (file)
@@ -9,7 +9,10 @@ to the bottom of your config.php
 
 Settings
 ========
-provider_name*: a unique name for this authentication provider.
+provider_name*: This is a identifier designated to the connection.
+    It's how StatusNet will refer to the authentication source.
+    For the most part, any name can be used, so long as each authentication source has a different identifier.
+    In most cases there will be only one authentication source used.
 authoritative (false): Set to true if LDAP's responses are authoritative
     (if authorative and LDAP fails, no other password checking will be done).
 autoregistration (false): Set to true if users should be automatically created
index 7f48ce5e1b0fd8b35578200fd49adb5ae4a4c24a..042b2db8d8796905a8a1df2695d31395ae452d01 100644 (file)
@@ -131,13 +131,13 @@ class LdapAuthorizationPlugin extends AuthorizationPlugin
     {
         $ldap = $this->ldap_get_connection();
         $link = $ldap->getLink();
-        $r = ldap_compare($link, $groupDn, $this->uniqueMember_attribute, $userDn);
+        $r = @ldap_compare($link, $groupDn, $this->uniqueMember_attribute, $userDn);
         if ($r === true){
             return true;
         }else if($r === false){
             return false;
         }else{
-            common_log(LOG_ERR, ldap_error($r));
+            common_log(LOG_ERR, "LDAP error determining if userDn=$userDn is a member of groupDn=groupDn using uniqueMember_attribute=$this->uniqueMember_attribute error: ".ldap_error($link));
             return false;
         }
     }
@@ -167,7 +167,12 @@ class LdapAuthorizationPlugin extends AuthorizationPlugin
         $ldap->setErrorHandling(PEAR_ERROR_RETURN);
         $err=$ldap->bind();
         if (Net_LDAP2::isError($err)) {
-            common_log(LOG_WARNING, 'Could not connect to LDAP server: '.$err->getMessage());
+            // if we were called with a config, assume caller will handle
+            // incorrect username/password (LDAP_INVALID_CREDENTIALS)
+            if (isset($config) && $err->getCode() == 0x31) {
+                return null;
+            }
+            throw new Exception('Could not connect to LDAP server: '.$err->getMessage());
             return false;
         }
         if($config == null) $this->default_ldap=$ldap;
@@ -185,6 +190,9 @@ class LdapAuthorizationPlugin extends AuthorizationPlugin
         if($ldap==null) {
             $ldap = $this->ldap_get_connection();
         }
+        if(! $ldap) {
+            throw new Exception("Could not connect to LDAP");
+        }
         $filter = Net_LDAP2_Filter::create($this->attributes['username'], 'equals',  $username);
         $options = array(
             'attributes' => $attributes
index 44239d8e06faca03558284ddae6a9cce3edd2815..3a6d8d25e005eaefdfc94e1ddae6f1f09434d765 100644 (file)
@@ -11,7 +11,10 @@ You *cannot* use this plugin without the LDAP Authentication plugin
 
 Settings
 ========
-provider_name*: name of the LDAP authentication provider that this plugin works with.
+provider_name*: This is a identifier designated to the connection.
+    It's how StatusNet will refer to the authentication source.
+    For the most part, any name can be used, so long as each authentication source has a different identifier.
+    In most cases there will be only one authentication source used.
 authoritative (false): should this plugin be authoritative for
     authorization?
 uniqueMember_attribute ('uniqueMember')*: the attribute of a group
diff --git a/plugins/MemcachedPlugin.php b/plugins/MemcachedPlugin.php
new file mode 100644 (file)
index 0000000..707e6db
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009, StatusNet, Inc.
+ *
+ * Plugin to implement cache interface for memcached
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Cache
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>, Craig Andrews <candrews@integralblue.com>
+ * @copyright 2009 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/
+ */
+
+if (!defined('STATUSNET')) {
+    // This check helps protect against security problems;
+    // your code file can't be executed directly from the web.
+    exit(1);
+}
+
+/**
+ * A plugin to use memcached for the cache interface
+ *
+ * This used to be encoded as config-variable options in the core code;
+ * it's now broken out to a separate plugin. The same interface can be
+ * implemented by other plugins.
+ *
+ * @category  Cache
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>, Craig Andrews <candrews@integralblue.com>
+ * @copyright 2009 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 MemcachedPlugin extends Plugin
+{
+    static $cacheInitialized = false;
+
+    private $_conn  = null;
+    public $servers = array('127.0.0.1;11211');
+
+    public $defaultExpiry = 86400; // 24h
+
+    /**
+     * Initialize the plugin
+     *
+     * Note that onStartCacheGet() may have been called before this!
+     *
+     * @return boolean flag value
+     */
+
+    function onInitializePlugin()
+    {
+        $this->_ensureConn();
+        self::$cacheInitialized = true;
+        return true;
+    }
+
+    /**
+     * Get a value associated with a key
+     *
+     * The value should have been set previously.
+     *
+     * @param string &$key   in; Lookup key
+     * @param mixed  &$value out; value associated with key
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheGet(&$key, &$value)
+    {
+        $this->_ensureConn();
+        $value = $this->_conn->get($key);
+        Event::handle('EndCacheGet', array($key, &$value));
+        return false;
+    }
+
+    /**
+     * Associate a value with a key
+     *
+     * @param string  &$key     in; Key to use for lookups
+     * @param mixed   &$value   in; Value to associate
+     * @param integer &$flag    in; Flag empty or Cache::COMPRESSED
+     * @param integer &$expiry  in; Expiry (passed through to Memcache)
+     * @param boolean &$success out; Whether the set was successful
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success)
+    {
+        $this->_ensureConn();
+        if ($expiry === null) {
+            $expiry = $this->defaultExpiry;
+        }
+        $success = $this->_conn->set($key, $value, $expiry);
+        Event::handle('EndCacheSet', array($key, $value, $flag,
+                                           $expiry));
+        return false;
+    }
+
+    /**
+     * Atomically increment an existing numeric key value.
+     * Existing expiration time will not be changed.
+     *
+     * @param string &$key    in; Key to use for lookups
+     * @param int    &$step   in; Amount to increment (default 1)
+     * @param mixed  &$value  out; Incremented value, or false if key not set.
+     *
+     * @return boolean hook success
+     */
+    function onStartCacheIncrement(&$key, &$step, &$value)
+    {
+        $this->_ensureConn();
+        $value = $this->_conn->increment($key, $step);
+        Event::handle('EndCacheIncrement', array($key, $step, $value));
+        return false;
+    }
+
+    /**
+     * Delete a value associated with a key
+     *
+     * @param string  &$key     in; Key to lookup
+     * @param boolean &$success out; whether it worked
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheDelete(&$key, &$success)
+    {
+        $this->_ensureConn();
+        $success = $this->_conn->delete($key);
+        Event::handle('EndCacheDelete', array($key));
+        return false;
+    }
+
+    function onStartCacheReconnect(&$success)
+    {
+        // nothing to do
+        return true;
+    }
+
+    /**
+     * Ensure that a connection exists
+     *
+     * Checks the instance $_conn variable and connects
+     * if it is empty.
+     *
+     * @return void
+     */
+
+    private function _ensureConn()
+    {
+        if (empty($this->_conn)) {
+            $this->_conn = new Memcached(common_config('site', 'nickname'));
+
+            if (!count($this->_conn->getServerList())) {
+            if (is_array($this->servers)) {
+                $servers = $this->servers;
+            } else {
+                $servers = array($this->servers);
+            }
+            foreach ($servers as $server) {
+                if (strpos($server, ';') !== false) {
+                    list($host, $port) = explode(';', $server);
+                } else {
+                    $host = $server;
+                    $port = 11211;
+                }
+
+                $this->_conn->addServer($host, $port);
+            }
+
+            // Compress items stored in the cache.
+
+            // Allows the cache to store objects larger than 1MB (if they
+            // compress to less than 1MB), and improves cache memory efficiency.
+
+            $this->_conn->setOption(Memcached::OPT_COMPRESSION, true);
+            }
+        }
+    }
+
+    /**
+     * Translate general flags to Memcached-specific flags
+     * @param int $flag
+     * @return int
+     */
+    protected function flag($flag)
+    {
+        //no flags are presently supported
+        return $flag;
+    }
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'Memcached',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Evan Prodromou, Craig Andrews',
+                            'homepage' => 'http://status.net/wiki/Plugin:Memcached',
+                            'rawdescription' =>
+                            _m('Use <a href="http://memcached.org/">Memcached</a> to cache query results.'));
+        return true;
+    }
+}
+
index fe1883ded484082b4133de9e10b97da64b5ca92c..69def60641d778decdf5e3ba8bf7e3cbed2633f9 100644 (file)
@@ -86,7 +86,11 @@ class MinifyPlugin extends Plugin
         $url = parse_url($src);
         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
         {
-            $src = $this->minifyUrl($src);
+            if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
+                $src = $this->minifyUrl($src);
+            } else {
+                $src = $this->minifyUrl('js/'.$src);
+            }
         }
     }
 
index ef28ab22e82b17c8f88b15d85ed4d261e66e45a2..c985fb4bc1946c2bf3025976e3bbae7d9950dcd4 100644 (file)
@@ -290,7 +290,7 @@ class OStatusPlugin extends Plugin
                     $url = "$scheme://$target";
                     $this->log(LOG_INFO, "Checking profile address '$url'");
                     try {
-                        $oprofile = Ostatus_profile::ensureProfile($url);
+                        $oprofile = Ostatus_profile::ensureProfileURL($url);
                         if ($oprofile && !$oprofile->isGroup()) {
                             $profile = $oprofile->localProfile();
                             $matches[$pos] = array('mentioned' => array($profile),
@@ -392,7 +392,7 @@ class OStatusPlugin extends Plugin
 
         foreach ($urls as $url) {
             try {
-                return Ostatus_profile::ensureProfile($url);
+                return Ostatus_profile::ensureProfileURL($url);
             } catch (Exception $e) {
                 common_log(LOG_ERR, 'Profile lookup failed for ' .
                                     $arg . ': ' . $e->getMessage());
@@ -415,12 +415,12 @@ class OStatusPlugin extends Plugin
     }
 
     function onEndShowStatusNetStyles($action) {
-        $action->cssLink(common_path('plugins/OStatus/theme/base/css/ostatus.css'));
+        $action->cssLink('plugins/OStatus/theme/base/css/ostatus.css');
         return true;
     }
 
     function onEndShowStatusNetScripts($action) {
-        $action->script(common_path('plugins/OStatus/js/ostatus.js'));
+        $action->script('plugins/OStatus/js/ostatus.js');
         return true;
     }
 
@@ -947,23 +947,4 @@ class OStatusPlugin extends Plugin
         }
         return false;
     }
-
-    /**
-     * Utility function to check if the given URL is a canonical user profile
-     * page, and if so return the ID number.
-     *
-     * @param string $url
-     * @return mixed int or false
-     */
-    public static function localProfileFromUrl($url)
-    {
-        $template = common_local_url('userbyid', array('id' => '31337'));
-        $template = preg_quote($template, '/');
-        $template = str_replace('31337', '(\d+)', $template);
-        if (preg_match("/$template/", $url, $matches)) {
-            return intval($matches[1]);
-        }
-        return false;
-    }
-
 }
index 29377b5fa08f8c08f16fb30279c03950b2d156b6..d60725a71b7e4866625d96242fbca306858f207e 100644 (file)
@@ -60,7 +60,8 @@ class GroupsalmonAction extends SalmonAction
 
     function handlePost()
     {
-        switch ($this->act->object->type) {
+        // @fixme process all objects?
+        switch ($this->act->objects[0]->type) {
         case ActivityObject::ARTICLE:
         case ActivityObject::BLOGENTRY:
         case ActivityObject::NOTE:
index 65dee2392f570e72b08e512ff9ccdc240dd28721..994af6e95ccc8e0929e172a7a63e364be7ad5a3b 100644 (file)
@@ -149,7 +149,7 @@ class OStatusSubAction extends Action
         $fullname = $entity->fullname;
         $homepage = $entity->homepage;
         $location = $entity->location;
-        
+
         if (!$avatar) {
             $avatar = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
         }
@@ -242,7 +242,7 @@ class OStatusSubAction extends Action
             if (Validate::email($this->profile_uri)) {
                 $this->oprofile = Ostatus_profile::ensureWebfinger($this->profile_uri);
             } else if (Validate::uri($this->profile_uri)) {
-                $this->oprofile = Ostatus_profile::ensureProfile($this->profile_uri);
+                $this->oprofile = Ostatus_profile::ensureProfileURL($this->profile_uri);
             } else {
                 $this->error = _m("Sorry, we could not reach that address. Please make sure that the OStatus address is like nickname@example.com or http://example.net/nickname");
                 common_debug('Invalid address format.', __FILE__);
@@ -299,7 +299,7 @@ class OStatusSubAction extends Action
         if ($user->isSubscribed($local)) {
             // TRANS: OStatus remote subscription dialog error.
             $this->showForm(_m('Already subscribed!'));
-        } elseif ($this->oprofile->subscribeLocalToRemote($user)) {
+        } elseif (Subscription::start($user, $local)) {
             $this->success();
         } else {
             // TRANS: OStatus remote subscription dialog error.
@@ -339,7 +339,6 @@ class OStatusSubAction extends Action
         }
     }
 
-
     /**
      * Handle posts to this form
      *
index c8a16e06fa07392d33bc304fda20f6cdca1ad218..ecdcfa193994068cae0c9dda10cefb2c9cce6440 100644 (file)
@@ -55,9 +55,10 @@ class UsersalmonAction extends SalmonAction
      */
     function handlePost()
     {
-        common_log(LOG_INFO, "Received post of '{$this->act->object->id}' from '{$this->act->actor->id}'");
+        common_log(LOG_INFO, "Received post of '{$this->act->objects[0]->id}' from '{$this->act->actor->id}'");
 
-        switch ($this->act->object->type) {
+        // @fixme: process all activity objects?
+        switch ($this->act->objects[0]->type) {
         case ActivityObject::ARTICLE:
         case ActivityObject::BLOGENTRY:
         case ActivityObject::NOTE:
@@ -82,7 +83,8 @@ class UsersalmonAction extends SalmonAction
                 throw new ClientException("In reply to a notice not by this user");
             }
         } else if (!empty($context->attention)) {
-            if (!in_array($this->user->uri, $context->attention)) {
+            if (!in_array($this->user->uri, $context->attention) &&
+                !in_array(common_profile_url($this->user->nickname), $context->attention)) {
                 common_log(LOG_ERR, "{$this->user->uri} not in attention list (".implode(',', $context->attention).")");
                 throw new ClientException("To the attention of user(s) not including this one!");
             }
index 414de9364b705c766e7faba58f4d499f42ac020b..6a6886eb8c78c06c5126680f68be94df26ac3472 100644 (file)
@@ -32,12 +32,19 @@ class UserxrdAction extends XrdAction
         parent::prepare($args);
 
         $this->uri = $this->trimmed('uri');
-        $acct = Discovery::normalize($this->uri);
-
-        list($nick, $domain) = explode('@', substr(urldecode($acct), 5));
-        $nick = common_canonical_nickname($nick);
-
-        $this->user = User::staticGet('nickname', $nick);
+        $this->uri = Discovery::normalize($this->uri);
+        
+        if (Discovery::isWebfinger($this->uri)) {
+            $parts = explode('@', substr(urldecode($this->uri), 5));
+            if (count($parts) == 2) {
+                list($nick, $domain) = $parts;
+                // @fixme confirm the domain too
+                $nick = common_canonical_nickname($nick);
+                $this->user = User::staticGet('nickname', $nick);
+            }
+        } else {
+            $this->user = User::staticGet('uri', $this->uri);
+        }
         if (!$this->user) {
             $this->clientError(_('No such user.'), 404);
             return false;
index b848b6b1d38b06f5ccbce0521f87acb529c78745..b10509dae6c31806c7f182781a5c4bb75932161d 100644 (file)
@@ -61,7 +61,7 @@ class FeedSub extends Memcached_DataObject
     public $__table = 'feedsub';
 
     public $id;
-    public $feeduri;
+    public $uri;
 
     // PuSH subscription data
     public $huburi;
@@ -110,7 +110,7 @@ class FeedSub extends Memcached_DataObject
                                    /*size*/ null,
                                    /*nullable*/ false,
                                    /*key*/ 'PRI',
-                                   /*default*/ '0',
+                                   /*default*/ null,
                                    /*extra*/ null,
                                    /*auto_increment*/ true),
                      new ColumnDef('uri', 'varchar',
@@ -238,7 +238,7 @@ class FeedSub extends Memcached_DataObject
     public function subscribe($mode='subscribe')
     {
         if ($this->sub_state && $this->sub_state != 'inactive') {
-            throw new ServerException("Attempting to start PuSH subscription to feed in state $this->sub_state");
+            common_log(LOG_WARNING, "Attempting to (re)start PuSH subscription to $this->uri in unexpected state $this->sub_state");
         }
         if (empty($this->huburi)) {
             if (common_config('feedsub', 'nohub')) {
@@ -261,7 +261,7 @@ class FeedSub extends Memcached_DataObject
      */
     public function unsubscribe() {
         if ($this->sub_state != 'active') {
-            throw new ServerException("Attempting to end PuSH subscription to feed in state $this->sub_state");
+            common_log(LOG_WARNING, "Attempting to (re)end PuSH subscription to $this->uri in unexpected state $this->sub_state");
         }
         if (empty($this->huburi)) {
             if (common_config('feedsub', 'nohub')) {
@@ -450,3 +450,4 @@ class FeedSub extends Memcached_DataObject
     }
 
 }
+
index c420b3eef8414826101910e08ec9f8e07bb1a642..cdace3c1fc86e66b34f9dbde346c10628e2198d2 100644 (file)
@@ -77,7 +77,7 @@ class HubSub extends Memcached_DataObject
                      new ColumnDef('topic', 'varchar',
                                    /*size*/255,
                                    /*nullable*/false,
-                                   /*key*/'KEY'),
+                                   /*key*/'MUL'),
                      new ColumnDef('callback', 'varchar',
                                    255, false),
                      new ColumnDef('secret', 'text',
index 5a46aeeb6e5f79b8b6ce59fab283685b51521d42..87c684c93d87702eac562585797a0167070c4ad9 100644 (file)
@@ -27,8 +27,6 @@
  * @link      http://status.net/
  */
 
-require_once 'Crypt/RSA.php';
-
 class Magicsig extends Memcached_DataObject
 {
 
@@ -40,8 +38,9 @@ class Magicsig extends Memcached_DataObject
     public $keypair;
     public $alg;
     
-    private $_rsa;
-
+    public $publicKey;
+    public $privateKey;
+    
     public function __construct($alg = 'RSA-SHA256')
     {
         $this->alg = $alg;
@@ -70,9 +69,9 @@ class Magicsig extends Memcached_DataObject
     static function schemaDef()
     {
         return array(new ColumnDef('user_id', 'integer',
-                                   null, true, 'PRI'),
-                     new ColumnDef('keypair', 'varchar',
-                                   255, false),
+                                   null, false, 'PRI'),
+                     new ColumnDef('keypair', 'text',
+                                   false, false),
                      new ColumnDef('alg', 'varchar',
                                    64, false));
     }
@@ -99,17 +98,20 @@ class Magicsig extends Memcached_DataObject
         return parent::insert();
     }
 
-    public function generate($user_id, $key_length = 512)
+    public function generate($user_id)
     {
-        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
+        $rsa = new SafeCrypt_RSA();
+        
+        $keypair = $rsa->createKey();
 
-        $keypair = new Crypt_RSA_KeyPair($key_length);
-        $params['public_key'] = $keypair->getPublicKey();
-        $params['private_key'] = $keypair->getPrivateKey();
+        $rsa->loadKey($keypair['privatekey']);
 
-        $this->_rsa = new Crypt_RSA($params);
-        PEAR::popErrorHandling();
+        $this->privateKey = new SafeCrypt_RSA();
+        $this->privateKey->loadKey($keypair['privatekey']);
 
+        $this->publicKey = new SafeCrypt_RSA();
+        $this->publicKey->loadKey($keypair['publickey']);
+        
         $this->user_id = $user_id;
         $this->insert();
     }
@@ -117,14 +119,11 @@ class Magicsig extends Memcached_DataObject
 
     public function toString($full_pair = true)
     {
-        $public_key = $this->_rsa->_public_key;
-        $private_key = $this->_rsa->_private_key;
-
-        $mod = base64_url_encode($public_key->getModulus());
-        $exp = base64_url_encode($public_key->getExponent());
+        $mod = base64_url_encode($this->publicKey->modulus->toBytes());
+        $exp = base64_url_encode($this->publicKey->exponent->toBytes());
         $private_exp = '';
-        if ($full_pair && $private_key->getExponent()) {
-            $private_exp = '.' . base64_url_encode($private_key->getExponent());
+        if ($full_pair && $this->privateKey->exponent->toBytes()) {
+            $private_exp = '.' . base64_url_encode($this->privateKey->exponent->toBytes());
         }
 
         return 'RSA.' . $mod . '.' . $exp . $private_exp; 
@@ -132,8 +131,6 @@ class Magicsig extends Memcached_DataObject
     
     public static function fromString($text)
     {
-        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
-
         $magic_sig = new Magicsig();
         
         // remove whitespace
@@ -144,35 +141,40 @@ class Magicsig extends Memcached_DataObject
             return false;
         }
         
-        $mod = base64_url_decode($matches[1]);
-        $exp = base64_url_decode($matches[2]);
+        $mod = $matches[1];
+        $exp = $matches[2];
         if (!empty($matches[4])) {
-            $private_exp = base64_url_decode($matches[4]);
+            $private_exp = $matches[4];
         } else {
             $private_exp = false;
         }
 
-        $params['public_key'] = new Crypt_RSA_KEY($mod, $exp, 'public');
-        if ($params['public_key']->isError()) {
-            $error = $params['public_key']->getLastError();
-            common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage());
-            return false;
-        }
+        $magic_sig->loadKey($mod, $exp, 'public');
         if ($private_exp) {
-            $params['private_key'] = new Crypt_RSA_KEY($mod, $private_exp, 'private');
-            if ($params['private_key']->isError()) {
-                $error = $params['private_key']->getLastError();
-                common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage());
-                return false;
-            }
+            $magic_sig->loadKey($mod, $private_exp, 'private');
         }
 
-        $magic_sig->_rsa = new Crypt_RSA($params);
-        PEAR::popErrorHandling();
-
         return $magic_sig;
     }
 
+    public function loadKey($mod, $exp, $type = 'public')
+    {
+        common_log(LOG_DEBUG, "Adding ".$type." key: (".$mod .', '. $exp .")");
+
+        $rsa = new SafeCrypt_RSA();
+        $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
+        $rsa->setHash('sha256');
+        $rsa->modulus = new Math_BigInteger(base64_url_decode($mod), 256);
+        $rsa->k = strlen($rsa->modulus->toBytes());
+        $rsa->exponent = new Math_BigInteger(base64_url_decode($exp), 256);
+
+        if ($type == 'private') {
+            $this->privateKey = $rsa;
+        } else {
+            $this->publicKey = $rsa;
+        }
+    }
+    
     public function getName()
     {
         return $this->alg;
@@ -183,45 +185,25 @@ class Magicsig extends Memcached_DataObject
         switch ($this->alg) {
 
         case 'RSA-SHA256':
-            return 'magicsig_sha256';
+            return 'sha256';
         }
 
     }
     
     public function sign($bytes)
     {
-        $hash = $this->getHash();
-        $sig = $this->_rsa->createSign($bytes, null, $hash);
-        if ($this->_rsa->isError()) {
-            $error = $this->_rsa->getLastError();
-            common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage());
-            return false;
-        }
-
-        return $sig;
+        $sig = $this->privateKey->sign($bytes);
+        return base64_url_encode($sig);
     }
 
     public function verify($signed_bytes, $signature)
     {
-        $hash = $this->getHash();
-        $result =  $this->_rsa->validateSign($signed_bytes, $signature, null, $hash);
-        if ($this->_rsa->isError()) {
-            $error = $this->keypair->getLastError();
-            common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage());
-            return false;
-        }
-        return $result;
+        $signature = base64_url_decode($signature);
+        return $this->publicKey->verify($signed_bytes, $signature);
     }
         
 }
 
-// Define a sha256 function for hashing
-// (Crypt_RSA should really be updated to use hash() )
-function magicsig_sha256($bytes)
-{
-    return hash('sha256', $bytes);
-}
-
 function base64_url_encode($input)
 {
     return strtr(base64_encode($input), '+/', '-_');
@@ -230,4 +212,4 @@ function base64_url_encode($input)
 function base64_url_decode($input)
 {
     return base64_decode(strtr($input, '-_', '+/'));
-}
\ No newline at end of file
+}
index 6145080fc7d2cfde69aa12071fe9e316e29d46e8..c7e3b05096863b8028c540ff51945697b0ff6e5d 100644 (file)
@@ -194,52 +194,6 @@ class Ostatus_profile extends Memcached_DataObject
         }
     }
 
-    /**
-     * Subscribe a local user to this remote user.
-     * PuSH subscription will be started if necessary, and we'll
-     * send a Salmon notification to the remote server if available
-     * notifying them of the sub.
-     *
-     * @param User $user
-     * @return boolean success
-     * @throws FeedException
-     */
-    public function subscribeLocalToRemote(User $user)
-    {
-        if ($this->isGroup()) {
-            throw new ServerException("Can't subscribe to a remote group");
-        }
-
-        if ($this->subscribe()) {
-            if ($user->subscribeTo($this->localProfile())) {
-                $this->notify($user->getProfile(), ActivityVerb::FOLLOW, $this);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Mark this remote profile as subscribing to the given local user,
-     * and send appropriate notifications to the user.
-     *
-     * This will generally be in response to a subscription notification
-     * from a foreign site to our local Salmon response channel.
-     *
-     * @param User $user
-     * @return boolean success
-     */
-    public function subscribeRemoteToLocal(User $user)
-    {
-        if ($this->isGroup()) {
-            throw new ServerException("Remote groups can't subscribe to local users");
-        }
-
-        Subscription::start($this->localProfile(), $user->getProfile());
-
-        return true;
-    }
-
     /**
      * Send a subscription request to the hub for this feed.
      * The hub will later send us a confirmation POST to /main/push/callback.
@@ -250,12 +204,13 @@ class Ostatus_profile extends Memcached_DataObject
     public function subscribe()
     {
         $feedsub = FeedSub::ensureFeed($this->feeduri);
-        if ($feedsub->sub_state == 'active' || $feedsub->sub_state == 'subscribe') {
+        if ($feedsub->sub_state == 'active') {
+            // Active subscription, we don't need to do anything.
             return true;
-        } else if ($feedsub->sub_state == '' || $feedsub->sub_state == 'inactive') {
+        } else {
+            // Inactive or we got left in an inconsistent state.
+            // Run a subscription request to make sure we're current!
             return $feedsub->subscribe();
-        } else if ('unsubscribe') {
-            throw new FeedSubException("Unsub is pending, can't subscribe...");
         }
     }
 
@@ -268,15 +223,13 @@ class Ostatus_profile extends Memcached_DataObject
      */
     public function unsubscribe() {
         $feedsub = FeedSub::staticGet('uri', $this->feeduri);
-        if (!$feedsub) {
+        if (!$feedsub || $feedsub->sub_state == '' || $feedsub->sub_state == 'inactive') {
+            // No active PuSH subscription, we can just leave it be.
             return true;
-        }
-        if ($feedsub->sub_state == 'active') {
+        } else {
+            // PuSH subscription is either active or in an indeterminate state.
+            // Send an unsubscribe.
             return $feedsub->unsubscribe();
-        } else if ($feedsub->sub_state == '' || $feedsub->sub_state == 'inactive' || $feedsub->sub_state == 'unsubscribe') {
-            return true;
-        } else if ($feedsub->sub_state == 'subscribe') {
-            throw new FeedSubException("Feed is awaiting subscription, can't unsub...");
         }
     }
 
@@ -435,11 +388,17 @@ class Ostatus_profile extends Memcached_DataObject
     {
         $feed = $doc->documentElement;
 
-        if ($feed->localName != 'feed' || $feed->namespaceURI != Activity::ATOM) {
-            common_log(LOG_ERR, __METHOD__ . ": not an Atom feed, ignoring");
-            return;
+        if ($feed->localName == 'feed' && $feed->namespaceURI == Activity::ATOM) {
+            $this->processAtomFeed($feed, $source);
+        } else if ($feed->localName == 'rss') { // @fixme check namespace
+            $this->processRssFeed($feed, $source);
+        } else {
+            throw new Exception("Unknown feed format.");
         }
+    }
 
+    public function processAtomFeed(DOMElement $feed, $source)
+    {
         $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
         if ($entries->length == 0) {
             common_log(LOG_ERR, __METHOD__ . ": no entries in feed update, ignoring");
@@ -452,6 +411,26 @@ class Ostatus_profile extends Memcached_DataObject
         }
     }
 
+    public function processRssFeed(DOMElement $rss, $source)
+    {
+        $channels = $rss->getElementsByTagName('channel');
+
+        if ($channels->length == 0) {
+            throw new Exception("RSS feed without a channel.");
+        } else if ($channels->length > 1) {
+            common_log(LOG_WARNING, __METHOD__ . ": more than one channel in an RSS feed");
+        }
+
+        $channel = $channels->item(0);
+
+        $items = $channel->getElementsByTagName('item');
+
+        for ($i = 0; $i < $items->length; $i++) {
+            $item = $items->item($i);
+            $this->processEntry($item, $channel, $source);
+        }
+    }
+
     /**
      * Process a posted entry from this feed source.
      *
@@ -463,6 +442,18 @@ class Ostatus_profile extends Memcached_DataObject
     {
         $activity = new Activity($entry, $feed);
 
+        // @todo process all activity objects
+        switch ($activity->objects[0]->type) {
+        case ActivityObject::ARTICLE:
+        case ActivityObject::BLOGENTRY:
+        case ActivityObject::NOTE:
+        case ActivityObject::STATUS:
+        case ActivityObject::COMMENT:
+            break;
+        default:
+            throw new ClientException("Can't handle that kind of post.");
+        }
+
         if ($activity->verb == ActivityVerb::POST) {
             $this->processPost($activity, $source);
         } else {
@@ -489,24 +480,27 @@ class Ostatus_profile extends Memcached_DataObject
                 return false;
             }
         } else {
-            // Individual user feeds may contain only posts from themselves.
-            // Authorship is validated against the profile URI on upper layers,
-            // through PuSH setup or Salmon signature checks.
-            $actorUri = self::getActorProfileURI($activity);
-            if ($actorUri == $this->uri) {
-                // Check if profile info has changed and update it
-                $this->updateFromActivityObject($activity->actor);
+            $actor = $activity->actor;
+
+            if (empty($actor)) {
+                // OK here! assume the default
+            } else if ($actor->id == $this->uri || $actor->link == $this->uri) {
+                $this->updateFromActivityObject($actor);
             } else {
-                common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri");
-                return false;
+                throw new Exception("Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
             }
+
             $oprofile = $this;
         }
 
+        // It's not always an ActivityObject::NOTE, but... let's just say it is.
+
+        $note = $activity->objects[0];
+
         // The id URI will be used as a unique identifier for for the notice,
         // protecting against duplicate saves. It isn't required to be a URL;
         // tag: URIs for instance are found in Google Buzz feeds.
-        $sourceUri = $activity->object->id;
+        $sourceUri = $note->id;
         $dupe = Notice::staticGet('uri', $sourceUri);
         if ($dupe) {
             common_log(LOG_INFO, "OStatus: ignoring duplicate post: $sourceUri");
@@ -515,16 +509,30 @@ class Ostatus_profile extends Memcached_DataObject
 
         // We'll also want to save a web link to the original notice, if provided.
         $sourceUrl = null;
-        if ($activity->object->link) {
-            $sourceUrl = $activity->object->link;
+        if ($note->link) {
+            $sourceUrl = $note->link;
         } else if ($activity->link) {
             $sourceUrl = $activity->link;
-        } else if (preg_match('!^https?://!', $activity->object->id)) {
-            $sourceUrl = $activity->object->id;
+        } else if (preg_match('!^https?://!', $note->id)) {
+            $sourceUrl = $note->id;
+        }
+
+        // Use summary as fallback for content
+
+        if (!empty($note->content)) {
+            $sourceContent = $note->content;
+        } else if (!empty($note->summary)) {
+            $sourceContent = $note->summary;
+        } else if (!empty($note->title)) {
+            $sourceContent = $note->title;
+        } else {
+            // @fixme fetch from $sourceUrl?
+            throw new ClientException("No content for notice {$sourceUri}");
         }
 
         // Get (safe!) HTML and text versions of the content
-        $rendered = $this->purify($activity->object->content);
+
+        $rendered = $this->purify($sourceContent);
         $content = html_entity_decode(strip_tags($rendered));
 
         $shortened = common_shorten_links($content);
@@ -535,8 +543,8 @@ class Ostatus_profile extends Memcached_DataObject
         $attachment = null;
 
         if (Notice::contentTooLong($shortened)) {
-            $attachment = $this->saveHTMLFile($activity->object->title, $rendered);
-            $summary = $activity->object->summary;
+            $attachment = $this->saveHTMLFile($note->title, $rendered);
+            $summary = html_entity_decode(strip_tags($note->summary));
             if (empty($summary)) {
                 $summary = $content;
             }
@@ -704,22 +712,147 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
+     * Look up and if necessary create an Ostatus_profile for the remote entity
+     * with the given profile page URL. This should never return null -- you
+     * will either get an object or an exception will be thrown.
+     *
      * @param string $profile_url
      * @return Ostatus_profile
-     * @throws FeedSubException
+     * @throws Exception
      */
-    public static function ensureProfile($profile_uri, $hints=array())
+
+    public static function ensureProfileURL($profile_url, $hints=array())
     {
-        // Get the canonical feed URI and check it
+        $oprofile = self::getFromProfileURL($profile_url);
+
+        if (!empty($oprofile)) {
+            return $oprofile;
+        }
+
+        $hints['profileurl'] = $profile_url;
+
+        // Fetch the URL
+        // XXX: HTTP caching
+
+        $client = new HTTPClient();
+        $client->setHeader('Accept', 'text/html,application/xhtml+xml');
+        $response = $client->get($profile_url);
+
+        if (!$response->isOk()) {
+            throw new Exception("Could not reach profile page: " . $profile_url);
+        }
+
+        // Check if we have a non-canonical URL
+
+        $finalUrl = $response->getUrl();
+
+        if ($finalUrl != $profile_url) {
+
+            $hints['profileurl'] = $finalUrl;
+
+            $oprofile = self::getFromProfileURL($finalUrl);
+
+            if (!empty($oprofile)) {
+                return $oprofile;
+            }
+        }
+
+        // Try to get some hCard data
+
+        $body = $response->getBody();
+
+        $hcardHints = DiscoveryHints::hcardHints($body, $finalUrl);
+
+        if (!empty($hcardHints)) {
+            $hints = array_merge($hints, $hcardHints);
+        }
+
+        // Check if they've got an LRDD header
+
+        $lrdd = LinkHeader::getLink($response, 'lrdd', 'application/xrd+xml');
+
+        if (!empty($lrdd)) {
+
+            $xrd = Discovery::fetchXrd($lrdd);
+            $xrdHints = DiscoveryHints::fromXRD($xrd);
+
+            $hints = array_merge($hints, $xrdHints);
+        }
+
+        // If discovery found a feedurl (probably from LRDD), use it.
+
+        if (array_key_exists('feedurl', $hints)) {
+            return self::ensureFeedURL($hints['feedurl'], $hints);
+        }
+
+        // Get the feed URL from HTML
+
         $discover = new FeedDiscovery();
-        if (isset($hints['feedurl'])) {
-            $feeduri = $hints['feedurl'];
-            $feeduri = $discover->discoverFromFeedURL($feeduri);
-        } else {
-            $feeduri = $discover->discoverFromURL($profile_uri);
-            $hints['feedurl'] = $feeduri;
+
+        $feedurl = $discover->discoverFromHTML($finalUrl, $body);
+
+        if (!empty($feedurl)) {
+            $hints['feedurl'] = $feedurl;
+            return self::ensureFeedURL($feedurl, $hints);
         }
 
+        throw new Exception("Could not find a feed URL for profile page " . $finalUrl);
+    }
+
+    /**
+     * Look up the Ostatus_profile, if present, for a remote entity with the
+     * given profile page URL. Will return null for both unknown and invalid
+     * remote profiles.
+     *
+     * @return mixed Ostatus_profile or null
+     * @throws Exception for local profiles
+     */
+    static function getFromProfileURL($profile_url)
+    {
+        $profile = Profile::staticGet('profileurl', $profile_url);
+
+        if (empty($profile)) {
+            return null;
+        }
+
+        // Is it a known Ostatus profile?
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id);
+
+        if (!empty($oprofile)) {
+            return $oprofile;
+        }
+
+        // Is it a local user?
+
+        $user = User::staticGet('id', $profile->id);
+
+        if (!empty($user)) {
+            throw new Exception("'$profile_url' is the profile for local user '{$user->nickname}'.");
+        }
+
+        // Continue discovery; it's a remote profile
+        // for OMB or some other protocol, may also
+        // support OStatus
+
+        return null;
+    }
+
+    /**
+     * Look up and if necessary create an Ostatus_profile for remote entity
+     * with the given update feed. This should never return null -- you will
+     * either get an object or an exception will be thrown.
+     *
+     * @return Ostatus_profile
+     * @throws Exception
+     */
+    public static function ensureFeedURL($feed_url, $hints=array())
+    {
+        $discover = new FeedDiscovery();
+
+        $feeduri = $discover->discoverFromFeedURL($feed_url);
+        $hints['feedurl'] = $feeduri;
+
         $huburi = $discover->getAtomLink('hub');
         $hints['hub'] = $huburi;
         $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
@@ -730,9 +863,32 @@ class Ostatus_profile extends Memcached_DataObject
             throw new FeedSubNoHubException();
         }
 
-        // Try to get a profile from the feed activity:subject
+        $feedEl = $discover->root;
+
+        if ($feedEl->tagName == 'feed') {
+            return self::ensureAtomFeed($feedEl, $hints);
+        } else if ($feedEl->tagName == 'channel') {
+            return self::ensureRssChannel($feedEl, $hints);
+        } else {
+            throw new FeedSubBadXmlException($feeduri);
+        }
+    }
 
-        $feedEl = $discover->feed->documentElement;
+    /**
+     * Look up and, if necessary, create an Ostatus_profile for the remote
+     * profile with the given Atom feed - actually loaded from the feed.
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
+     *
+     * @param DOMElement $feedEl root element of a loaded Atom feed
+     * @param array $hints additional discovery information passed from higher levels
+     * @fixme should this be marked public?
+     * @return Ostatus_profile
+     * @throws Exception
+     */
+    public static function ensureAtomFeed($feedEl, $hints)
+    {
+        // Try to get a profile from the feed activity:subject
 
         $subject = ActivityUtils::child($feedEl, Activity::SUBJECT, Activity::SPEC);
 
@@ -753,7 +909,7 @@ class Ostatus_profile extends Memcached_DataObject
         // Sheesh. Not a very nice feed! Let's try fingerpoken in the
         // entries.
 
-        $entries = $discover->feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
+        $entries = $feedEl->getElementsByTagNameNS(Activity::ATOM, 'entry');
 
         if (!empty($entries) && $entries->length > 0) {
 
@@ -780,6 +936,49 @@ class Ostatus_profile extends Memcached_DataObject
         throw new FeedSubException("Can't find enough profile information to make a feed.");
     }
 
+    /**
+     * Look up and, if necessary, create an Ostatus_profile for the remote
+     * profile with the given RSS feed - actually loaded from the feed.
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
+     *
+     * @param DOMElement $feedEl root element of a loaded RSS feed
+     * @param array $hints additional discovery information passed from higher levels
+     * @fixme should this be marked public?
+     * @return Ostatus_profile
+     * @throws Exception
+     */
+    public static function ensureRssChannel($feedEl, $hints)
+    {
+        // Special-case for Posterous. They have some nice metadata in their
+        // posterous:author elements. We should use them instead of the channel.
+
+        $items = $feedEl->getElementsByTagName('item');
+
+        if ($items->length > 0) {
+            $item = $items->item(0);
+            $authorEl = ActivityUtils::child($item, ActivityObject::AUTHOR, ActivityObject::POSTEROUS);
+            if (!empty($authorEl)) {
+                $obj = ActivityObject::fromPosterousAuthor($authorEl);
+                // Posterous has multiple authors per feed, and multiple feeds
+                // per author. We check if this is the "main" feed for this author.
+                if (array_key_exists('profileurl', $hints) &&
+                    !empty($obj->poco) &&
+                    common_url_to_nickname($hints['profileurl']) == $obj->poco->preferredUsername) {
+                    return self::ensureActivityObjectProfile($obj, $hints);
+                }
+            }
+        }
+
+        // @fixme we should check whether this feed has elements
+        // with different <author> or <dc:creator> elements, and... I dunno.
+        // Do something about that.
+
+        $obj = ActivityObject::fromRssChannel($feedEl);
+
+        return self::ensureActivityObjectProfile($obj, $hints);
+    }
+
     /**
      * Download and update given avatar image
      *
@@ -912,11 +1111,14 @@ class Ostatus_profile extends Memcached_DataObject
     /**
      * Fetch, or build if necessary, an Ostatus_profile for the actor
      * in a given Activity Streams activity.
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
      *
      * @param Activity $activity
      * @param string $feeduri if we already know the canonical feed URI!
      * @param string $salmonuri if we already know the salmon return channel URI
      * @return Ostatus_profile
+     * @throws Exception
      */
 
     public static function ensureActorProfile($activity, $hints=array())
@@ -924,6 +1126,18 @@ class Ostatus_profile extends Memcached_DataObject
         return self::ensureActivityObjectProfile($activity->actor, $hints);
     }
 
+    /**
+     * Fetch, or build if necessary, an Ostatus_profile for the profile
+     * in a given Activity Streams object (can be subject, actor, or object).
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
+     *
+     * @param ActivityObject $object
+     * @param array $hints additional discovery information passed from higher levels
+     * @return Ostatus_profile
+     * @throws Exception
+     */
+
     public static function ensureActivityObjectProfile($object, $hints=array())
     {
         $profile = self::getActivityObjectProfile($object);
@@ -938,35 +1152,45 @@ class Ostatus_profile extends Memcached_DataObject
     /**
      * @param Activity $activity
      * @return mixed matching Ostatus_profile or false if none known
+     * @throws ServerException if feed info invalid
      */
     public static function getActorProfile($activity)
     {
         return self::getActivityObjectProfile($activity->actor);
     }
 
+    /**
+     * @param ActivityObject $activity
+     * @return mixed matching Ostatus_profile or false if none known
+     * @throws ServerException if feed info invalid
+     */
     protected static function getActivityObjectProfile($object)
     {
         $uri = self::getActivityObjectProfileURI($object);
         return Ostatus_profile::staticGet('uri', $uri);
     }
 
-    protected static function getActorProfileURI($activity)
-    {
-        return self::getActivityObjectProfileURI($activity->actor);
-    }
-
     /**
-     * @param Activity $activity
+     * Get the identifier URI for the remote entity described
+     * by this ActivityObject. This URI is *not* guaranteed to be
+     * a resolvable HTTP/HTTPS URL.
+     *
+     * @param ActivityObject $object
      * @return string
-     * @throws ServerException
+     * @throws ServerException if feed info invalid
      */
     protected static function getActivityObjectProfileURI($object)
     {
-        $opts = array('allowed_schemes' => array('http', 'https'));
-        if ($object->id && Validate::uri($object->id, $opts)) {
-            return $object->id;
+        if ($object->id) {
+            if (ActivityUtils::validateUri($object->id)) {
+                return $object->id;
+            }
         }
-        if ($object->link && Validate::uri($object->link, $opts)) {
+
+        // If the id is missing or invalid (we've seen feeds mistakenly listing
+        // things like local usernames in that field) then we'll use the profile
+        // page link, if valid.
+        if ($object->link && common_valid_http_url($object->link)) {
             return $object->link;
         }
         throw new ServerException("No author ID URI found");
@@ -979,6 +1203,8 @@ class Ostatus_profile extends Memcached_DataObject
     /**
      * Create local ostatus_profile and profile/user_group entries for
      * the provided remote user or group.
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
      *
      * @param ActivityObject $object
      * @param array $hints
@@ -995,7 +1221,8 @@ class Ostatus_profile extends Memcached_DataObject
             throw new Exception("No profile URI");
         }
 
-        if (OStatusPlugin::localProfileFromUrl($homeuri)) {
+        $user = User::staticGet('uri', $homeuri);
+        if ($user) {
             throw new Exception("Local user can't be referenced as remote.");
         }
 
@@ -1242,9 +1469,19 @@ class Ostatus_profile extends Memcached_DataObject
             return $hints['nickname'];
         }
 
-        // Try the definitive ID
+        // Try the profile url (like foo.example.com or example.com/user/foo)
+
+        $profileUrl = ($object->link) ? $object->link : $hints['profileurl'];
+
+        if (!empty($profileUrl)) {
+            $nickname = self::nicknameFromURI($profileUrl);
+        }
 
-        $nickname = self::nicknameFromURI($object->id);
+        // Try the URI (may be a tag:, http:, acct:, ...
+
+        if (empty($nickname)) {
+            $nickname = self::nicknameFromURI($object->id);
+        }
 
         // Try a Webfinger if one was passed (way) down
 
@@ -1285,6 +1522,11 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
+     * Look up, and if necessary create, an Ostatus_profile for the remote
+     * entity with the given webfinger address.
+     * This should never return null -- you will either get an object or
+     * an exception will be thrown.
+     *
      * @param string $addr webfinger address
      * @return Ostatus_profile
      * @throws Exception on error conditions
@@ -1306,7 +1548,7 @@ class Ostatus_profile extends Memcached_DataObject
             }
         }
 
-        // First, look it up
+        // Try looking it up
 
         $oprofile = Ostatus_profile::staticGet('uri', 'acct:'.$addr);
 
@@ -1320,7 +1562,7 @@ class Ostatus_profile extends Memcached_DataObject
         $disco = new Discovery();
 
         try {
-            $result = $disco->lookup($addr);
+            $xrd = $disco->lookup($addr);
         } catch (Exception $e) {
             // Save negative cache entry so we don't waste time looking it up again.
             // @fixme distinguish temporary failures?
@@ -1330,38 +1572,26 @@ class Ostatus_profile extends Memcached_DataObject
 
         $hints = array('webfinger' => $addr);
 
-        foreach ($result->links as $link) {
-            switch ($link['rel']) {
-            case Discovery::PROFILEPAGE:
-                $hints['profileurl'] = $profileUrl = $link['href'];
-                break;
-            case Salmon::NS_REPLIES:
-                $hints['salmon'] = $salmonEndpoint = $link['href'];
-                break;
-            case Discovery::UPDATESFROM:
-                $hints['feedurl'] = $feedUrl = $link['href'];
-                break;
-            case Discovery::HCARD:
-                $hcardUrl = $link['href'];
-                break;
-            default:
-                common_log(LOG_NOTICE, "Don't know what to do with rel = '{$link['rel']}'");
-                break;
-            }
-        }
+        $dhints = DiscoveryHints::fromXRD($xrd);
+
+        $hints = array_merge($hints, $dhints);
 
-        if (isset($hcardUrl)) {
-            $hcardHints = self::slurpHcard($hcardUrl);
-            // Note: Webfinger > hcard
-            $hints = array_merge($hcardHints, $hints);
+        // If there's an Hcard, let's grab its info
+
+        if (array_key_exists('hcard', $hints)) {
+            if (!array_key_exists('profileurl', $hints) ||
+                $hints['hcard'] != $hints['profileurl']) {
+                $hcardHints = DiscoveryHints::fromHcardUrl($hints['hcard']);
+                $hints = array_merge($hcardHints, $hints);
+            }
         }
 
         // If we got a feed URL, try that
 
-        if (isset($feedUrl)) {
+        if (array_key_exists('feedurl', $hints)) {
             try {
-                common_log(LOG_INFO, "Discovery on acct:$addr with feed URL $feedUrl");
-                $oprofile = self::ensureProfile($feedUrl, $hints);
+                common_log(LOG_INFO, "Discovery on acct:$addr with feed URL " . $hints['feedurl']);
+                $oprofile = self::ensureFeedURL($hints['feedurl'], $hints);
                 self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
                 return $oprofile;
             } catch (Exception $e) {
@@ -1372,10 +1602,10 @@ class Ostatus_profile extends Memcached_DataObject
 
         // If we got a profile page, try that!
 
-        if (isset($profileUrl)) {
+        if (array_key_exists('profileurl', $hints)) {
             try {
                 common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
-                $oprofile = self::ensureProfile($profileUrl, $hints);
+                $oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
                 self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
                 return $oprofile;
             } catch (Exception $e) {
@@ -1387,7 +1617,9 @@ class Ostatus_profile extends Memcached_DataObject
         // XXX: try hcard
         // XXX: try FOAF
 
-        if (isset($salmonEndpoint)) {
+        if (array_key_exists('salmon', $hints)) {
+
+            $salmonEndpoint = $hints['salmon'];
 
             // An account URL, a salmon endpoint, and a dream? Not much to go
             // on, but let's give it a try
@@ -1467,67 +1699,4 @@ class Ostatus_profile extends Memcached_DataObject
 
         return $file;
     }
-
-    protected static function slurpHcard($url)
-    {
-        set_include_path(get_include_path() . PATH_SEPARATOR . INSTALLDIR . '/plugins/OStatus/extlib/hkit/');
-        require_once('hkit.class.php');
-
-        $h     = new hKit;
-
-        // Google Buzz hcards need to be tidied. Probably others too.
-
-        $h->tidy_mode = 'proxy'; // 'proxy', 'exec', 'php' or 'none'
-
-        // Get by URL
-        $hcards = $h->getByURL('hcard', $url);
-
-        if (empty($hcards)) {
-            return array();
-        }
-
-        // @fixme more intelligent guess on multi-hcard pages
-        $hcard = $hcards[0];
-
-        $hints = array();
-
-        $hints['profileurl'] = $url;
-
-        if (array_key_exists('nickname', $hcard)) {
-            $hints['nickname'] = $hcard['nickname'];
-        }
-
-        if (array_key_exists('fn', $hcard)) {
-            $hints['fullname'] = $hcard['fn'];
-        } else if (array_key_exists('n', $hcard)) {
-            $hints['fullname'] = implode(' ', $hcard['n']);
-        }
-
-        if (array_key_exists('photo', $hcard)) {
-            $hints['avatar'] = $hcard['photo'];
-        }
-
-        if (array_key_exists('note', $hcard)) {
-            $hints['bio'] = $hcard['note'];
-        }
-
-        if (array_key_exists('adr', $hcard)) {
-            if (is_string($hcard['adr'])) {
-                $hints['location'] = $hcard['adr'];
-            } else if (is_array($hcard['adr'])) {
-                $hints['location'] = implode(' ', $hcard['adr']);
-            }
-        }
-
-        if (array_key_exists('url', $hcard)) {
-            if (is_string($hcard['url'])) {
-                $hints['homepage'] = $hcard['url'];
-            } else if (is_array($hcard['url'])) {
-                // HACK get the last one; that's how our hcards look
-                $hints['homepage'] = $hcard['url'][count($hcard['url'])-1];
-            }
-        }
-
-        return $hints;
-    }
 }
diff --git a/plugins/OStatus/extlib/Crypt/AES.php b/plugins/OStatus/extlib/Crypt/AES.php
new file mode 100644 (file)
index 0000000..68ab4db
--- /dev/null
@@ -0,0 +1,479 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementation of AES.
+ *
+ * Uses mcrypt, if available, and an internal implementation, otherwise.
+ *
+ * PHP versions 4 and 5
+ *
+ * If {@link Crypt_AES::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
+ * {@link Crypt_AES::setKey() setKey()}.  ie. if the key is 128-bits, the key length will be 128-bits.  If it's 136-bits
+ * it'll be null-padded to 160-bits and 160 bits will be the key length until {@link Crypt_Rijndael::setKey() setKey()}
+ * is called, again, at which point, it'll be recalculated.
+ *
+ * Since Crypt_AES extends Crypt_Rijndael, some functions are available to be called that, in the context of AES, don't
+ * make a whole lot of sense.  {@link Crypt_AES::setBlockLength() setBlockLength()}, for instance.  Calling that function,
+ * however possible, won't do anything (AES has a fixed block length whereas Rijndael has a variable one).
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/AES.php');
+ *
+ *    $aes = new Crypt_AES();
+ *
+ *    $aes->setKey('abcdefghijklmnop');
+ *
+ *    $size = 10 * 1024;
+ *    $plaintext = '';
+ *    for ($i = 0; $i < $size; $i++) {
+ *        $plaintext.= 'a';
+ *    }
+ *
+ *    echo $aes->decrypt($aes->encrypt($plaintext));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_AES
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVIII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: AES.php,v 1.7 2010/02/09 06:10:25 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Rijndael
+ */
+require_once 'Rijndael.php';
+
+/**#@+
+ * @access public
+ * @see Crypt_AES::encrypt()
+ * @see Crypt_AES::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_AES_MODE_CTR', -1);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_AES_MODE_ECB', 1);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_AES_MODE_CBC', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_AES::Crypt_AES()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_AES_MODE_INTERNAL', 1);
+/**
+ * Toggles the mcrypt implementation
+ */
+define('CRYPT_AES_MODE_MCRYPT', 2);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of AES.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_AES
+ */
+class Crypt_AES extends Crypt_Rijndael {
+    /**
+     * mcrypt resource for encryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::encrypt()
+     * @var String
+     * @access private
+     */
+    var $enmcrypt;
+
+    /**
+     * mcrypt resource for decryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::decrypt()
+     * @var String
+     * @access private
+     */
+    var $demcrypt;
+
+    /**
+     * Default Constructor.
+     *
+     * Determines whether or not the mcrypt extension should be used.  $mode should only, at present, be
+     * CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC.  If not explictly set, CRYPT_AES_MODE_CBC will be used.
+     *
+     * @param optional Integer $mode
+     * @return Crypt_AES
+     * @access public
+     */
+    function Crypt_AES($mode = CRYPT_AES_MODE_CBC)
+    {
+        if ( !defined('CRYPT_AES_MODE') ) {
+            switch (true) {
+                case extension_loaded('mcrypt'):
+                    // i'd check to see if aes was supported, by doing in_array('des', mcrypt_list_algorithms('')),
+                    // but since that can be changed after the object has been created, there doesn't seem to be
+                    // a lot of point...
+                    define('CRYPT_AES_MODE', CRYPT_AES_MODE_MCRYPT);
+                    break;
+                default:
+                    define('CRYPT_AES_MODE', CRYPT_AES_MODE_INTERNAL);
+            }
+        }
+
+        switch ( CRYPT_AES_MODE ) {
+            case CRYPT_AES_MODE_MCRYPT:
+                switch ($mode) {
+                    case CRYPT_AES_MODE_ECB:
+                        $this->mode = MCRYPT_MODE_ECB;
+                        break;
+                    case CRYPT_AES_MODE_CTR:
+                        // ctr doesn't have a constant associated with it even though it appears to be fairly widely
+                        // supported.  in lieu of knowing just how widely supported it is, i've, for now, opted not to
+                        // include a compatibility layer.  the layer has been implemented but, for now, is commented out.
+                        $this->mode = 'ctr';
+                        //$this->mode = in_array('ctr', mcrypt_list_modes()) ? 'ctr' : CRYPT_AES_MODE_CTR;
+                        break;
+                    case CRYPT_AES_MODE_CBC:
+                    default:
+                        $this->mode = MCRYPT_MODE_CBC;
+                }
+
+                break;
+            default:
+                switch ($mode) {
+                    case CRYPT_AES_MODE_ECB:
+                        $this->mode = CRYPT_RIJNDAEL_MODE_ECB;
+                        break;
+                    case CRYPT_AES_MODE_CTR:
+                        $this->mode = CRYPT_RIJNDAEL_MODE_CTR;
+                        break;
+                    case CRYPT_AES_MODE_CBC:
+                    default:
+                        $this->mode = CRYPT_RIJNDAEL_MODE_CBC;
+                }
+        }
+
+        if (CRYPT_AES_MODE == CRYPT_AES_MODE_INTERNAL) {
+            parent::Crypt_Rijndael($this->mode);
+        }
+    }
+
+    /**
+     * Dummy function
+     *
+     * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything.
+     *
+     * @access public
+     * @param Integer $length
+     */
+    function setBlockLength($length)
+    {
+        return;
+    }
+
+    /**
+     * Encrypts a message.
+     *
+     * $plaintext will be padded with up to 16 additional bytes.  Other AES implementations may or may not pad in the
+     * same manner.  Other common approaches to padding and the reasons why it's necessary are discussed in the following
+     * URL:
+     *
+     * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
+     *
+     * An alternative to padding is to, separately, send the length of the file.  This is what SSH, in fact, does.
+     * strlen($plaintext) will still need to be a multiple of 16, however, arbitrary values can be added to make it that
+     * length.
+     *
+     * @see Crypt_AES::decrypt()
+     * @access public
+     * @param String $plaintext
+     */
+    function encrypt($plaintext)
+    {
+        if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
+            $this->_mcryptSetup();
+            /*
+            if ($this->mode == CRYPT_AES_MODE_CTR) {
+                $iv = $this->encryptIV;
+                $xor = mcrypt_generic($this->enmcrypt, $this->_generate_xor(strlen($plaintext), $iv));
+                $ciphertext = $plaintext ^ $xor;
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $iv;
+                }
+                return $ciphertext;
+            }
+            */
+
+            if ($this->mode != 'ctr') {
+                $plaintext = $this->_pad($plaintext);
+            }
+
+            $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv);
+            }
+
+            return $ciphertext;
+        }
+
+        return parent::encrypt($plaintext);
+    }
+
+    /**
+     * Decrypts a message.
+     *
+     * If strlen($ciphertext) is not a multiple of 16, null bytes will be added to the end of the string until it is.
+     *
+     * @see Crypt_AES::encrypt()
+     * @access public
+     * @param String $ciphertext
+     */
+    function decrypt($ciphertext)
+    {
+        if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
+            $this->_mcryptSetup();
+            /*
+            if ($this->mode == CRYPT_AES_MODE_CTR) {
+                $iv = $this->decryptIV;
+                $xor = mcrypt_generic($this->enmcrypt, $this->_generate_xor(strlen($ciphertext), $iv));
+                $plaintext = $ciphertext ^ $xor;
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $iv;
+                }
+                return $plaintext;
+            }
+            */
+
+            if ($this->mode != 'ctr') {
+                // we pad with chr(0) since that's what mcrypt_generic does.  to quote from http://php.net/function.mcrypt-generic :
+                // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+                $ciphertext = str_pad($ciphertext, (strlen($ciphertext) + 15) & 0xFFFFFFF0, chr(0));
+            }
+
+            $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->demcrypt, $this->key, $this->iv);
+            }
+
+            return $this->mode != 'ctr' ? $this->_unpad($plaintext) : $plaintext;
+        }
+
+        return parent::decrypt($ciphertext);
+    }
+
+    /**
+     * Setup mcrypt
+     *
+     * Validates all the variables.
+     *
+     * @access private
+     */
+    function _mcryptSetup()
+    {
+        if (!$this->changed) {
+            return;
+        }
+
+        if (!$this->explicit_key_length) {
+            // this just copied from Crypt_Rijndael::_setup()
+            $length = strlen($this->key) >> 2;
+            if ($length > 8) {
+                $length = 8;
+            } else if ($length < 4) {
+                $length = 4;
+            }
+            $this->Nk = $length;
+            $this->key_size = $length << 2;
+        }
+
+        switch ($this->Nk) {
+            case 4: // 128
+                $this->key_size = 16;
+                break;
+            case 5: // 160
+            case 6: // 192
+                $this->key_size = 24;
+                break;
+            case 7: // 224
+            case 8: // 256
+                $this->key_size = 32;
+        }
+
+        $this->key = substr($this->key, 0, $this->key_size);
+        $this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($this->iv, 0, 16), 16, chr(0));
+
+        if (!isset($this->enmcrypt)) {
+            $mode = $this->mode;
+            //$mode = $this->mode == CRYPT_AES_MODE_CTR ? MCRYPT_MODE_ECB : $this->mode;
+
+            $this->demcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, '');
+            $this->enmcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, '');
+        } // else should mcrypt_generic_deinit be called?
+
+        mcrypt_generic_init($this->demcrypt, $this->key, $this->iv);
+        mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv);
+
+        $this->changed = false;
+    }
+
+    /**
+     * Encrypts a block
+     *
+     * Optimized over Crypt_Rijndael's implementation by means of loop unrolling.
+     *
+     * @see Crypt_Rijndael::_encryptBlock()
+     * @access private
+     * @param String $in
+     * @return String
+     */
+    function _encryptBlock($in)
+    {
+        $state = unpack('N*word', $in);
+
+        $Nr = $this->Nr;
+        $w = $this->w;
+        $t0 = $this->t0;
+        $t1 = $this->t1;
+        $t2 = $this->t2;
+        $t3 = $this->t3;
+
+        // addRoundKey and reindex $state
+        $state = array(
+            $state['word1'] ^ $w[0][0],
+            $state['word2'] ^ $w[0][1],
+            $state['word3'] ^ $w[0][2],
+            $state['word4'] ^ $w[0][3]
+        );
+
+        // shiftRows + subWord + mixColumns + addRoundKey
+        // we could loop unroll this and use if statements to do more rounds as necessary, but, in my tests, that yields
+        // only a marginal improvement.  since that also, imho, hinders the readability of the code, i've opted not to do it.
+        for ($round = 1; $round < $this->Nr; $round++) {
+            $state = array(
+                $t0[$state[0] & 0xFF000000] ^ $t1[$state[1] & 0x00FF0000] ^ $t2[$state[2] & 0x0000FF00] ^ $t3[$state[3] & 0x000000FF] ^ $w[$round][0],
+                $t0[$state[1] & 0xFF000000] ^ $t1[$state[2] & 0x00FF0000] ^ $t2[$state[3] & 0x0000FF00] ^ $t3[$state[0] & 0x000000FF] ^ $w[$round][1],
+                $t0[$state[2] & 0xFF000000] ^ $t1[$state[3] & 0x00FF0000] ^ $t2[$state[0] & 0x0000FF00] ^ $t3[$state[1] & 0x000000FF] ^ $w[$round][2],
+                $t0[$state[3] & 0xFF000000] ^ $t1[$state[0] & 0x00FF0000] ^ $t2[$state[1] & 0x0000FF00] ^ $t3[$state[2] & 0x000000FF] ^ $w[$round][3]
+            );
+
+        }
+
+        // subWord
+        $state = array(
+            $this->_subWord($state[0]),
+            $this->_subWord($state[1]),
+            $this->_subWord($state[2]),
+            $this->_subWord($state[3])
+        );
+
+        // shiftRows + addRoundKey
+        $state = array(
+            ($state[0] & 0xFF000000) ^ ($state[1] & 0x00FF0000) ^ ($state[2] & 0x0000FF00) ^ ($state[3] & 0x000000FF) ^ $this->w[$this->Nr][0],
+            ($state[1] & 0xFF000000) ^ ($state[2] & 0x00FF0000) ^ ($state[3] & 0x0000FF00) ^ ($state[0] & 0x000000FF) ^ $this->w[$this->Nr][1],
+            ($state[2] & 0xFF000000) ^ ($state[3] & 0x00FF0000) ^ ($state[0] & 0x0000FF00) ^ ($state[1] & 0x000000FF) ^ $this->w[$this->Nr][2],
+            ($state[3] & 0xFF000000) ^ ($state[0] & 0x00FF0000) ^ ($state[1] & 0x0000FF00) ^ ($state[2] & 0x000000FF) ^ $this->w[$this->Nr][3]
+        );
+
+        return pack('N*', $state[0], $state[1], $state[2], $state[3]);
+    }
+
+    /**
+     * Decrypts a block
+     *
+     * Optimized over Crypt_Rijndael's implementation by means of loop unrolling.
+     *
+     * @see Crypt_Rijndael::_decryptBlock()
+     * @access private
+     * @param String $in
+     * @return String
+     */
+    function _decryptBlock($in)
+    {
+        $state = unpack('N*word', $in);
+
+        $Nr = $this->Nr;
+        $dw = $this->dw;
+        $dt0 = $this->dt0;
+        $dt1 = $this->dt1;
+        $dt2 = $this->dt2;
+        $dt3 = $this->dt3;
+
+        // addRoundKey and reindex $state
+        $state = array(
+            $state['word1'] ^ $dw[$this->Nr][0],
+            $state['word2'] ^ $dw[$this->Nr][1],
+            $state['word3'] ^ $dw[$this->Nr][2],
+            $state['word4'] ^ $dw[$this->Nr][3]
+        );
+
+
+        // invShiftRows + invSubBytes + invMixColumns + addRoundKey
+        for ($round = $this->Nr - 1; $round > 0; $round--) {
+            $state = array(
+                $dt0[$state[0] & 0xFF000000] ^ $dt1[$state[3] & 0x00FF0000] ^ $dt2[$state[2] & 0x0000FF00] ^ $dt3[$state[1] & 0x000000FF] ^ $dw[$round][0],
+                $dt0[$state[1] & 0xFF000000] ^ $dt1[$state[0] & 0x00FF0000] ^ $dt2[$state[3] & 0x0000FF00] ^ $dt3[$state[2] & 0x000000FF] ^ $dw[$round][1],
+                $dt0[$state[2] & 0xFF000000] ^ $dt1[$state[1] & 0x00FF0000] ^ $dt2[$state[0] & 0x0000FF00] ^ $dt3[$state[3] & 0x000000FF] ^ $dw[$round][2],
+                $dt0[$state[3] & 0xFF000000] ^ $dt1[$state[2] & 0x00FF0000] ^ $dt2[$state[1] & 0x0000FF00] ^ $dt3[$state[0] & 0x000000FF] ^ $dw[$round][3]
+            );
+        }
+
+        // invShiftRows + invSubWord + addRoundKey
+        $state = array(
+            $this->_invSubWord(($state[0] & 0xFF000000) ^ ($state[3] & 0x00FF0000) ^ ($state[2] & 0x0000FF00) ^ ($state[1] & 0x000000FF)) ^ $dw[0][0],
+            $this->_invSubWord(($state[1] & 0xFF000000) ^ ($state[0] & 0x00FF0000) ^ ($state[3] & 0x0000FF00) ^ ($state[2] & 0x000000FF)) ^ $dw[0][1],
+            $this->_invSubWord(($state[2] & 0xFF000000) ^ ($state[1] & 0x00FF0000) ^ ($state[0] & 0x0000FF00) ^ ($state[3] & 0x000000FF)) ^ $dw[0][2],
+            $this->_invSubWord(($state[3] & 0xFF000000) ^ ($state[2] & 0x00FF0000) ^ ($state[1] & 0x0000FF00) ^ ($state[0] & 0x000000FF)) ^ $dw[0][3]
+        );
+
+        return pack('N*', $state[0], $state[1], $state[2], $state[3]);
+    }
+}
+
+// vim: ts=4:sw=4:et:
+// vim6: fdl=1:
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/DES.php b/plugins/OStatus/extlib/Crypt/DES.php
new file mode 100644 (file)
index 0000000..985ed25
--- /dev/null
@@ -0,0 +1,945 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementation of DES.
+ *
+ * Uses mcrypt, if available, and an internal implementation, otherwise.
+ *
+ * PHP versions 4 and 5
+ *
+ * Useful resources are as follows:
+ *
+ *  - {@link http://en.wikipedia.org/wiki/DES_supplementary_material Wikipedia: DES supplementary material}
+ *  - {@link http://www.itl.nist.gov/fipspubs/fip46-2.htm FIPS 46-2 - (DES), Data Encryption Standard}
+ *  - {@link http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-DES.html JavaScript DES Example}
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/DES.php');
+ *
+ *    $des = new Crypt_DES();
+ *
+ *    $des->setKey('abcdefgh');
+ *
+ *    $size = 10 * 1024;
+ *    $plaintext = '';
+ *    for ($i = 0; $i < $size; $i++) {
+ *        $plaintext.= 'a';
+ *    }
+ *
+ *    echo $des->decrypt($des->encrypt($plaintext));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_DES
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: DES.php,v 1.12 2010/02/09 06:10:26 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access private
+ * @see Crypt_DES::_prepareKey()
+ * @see Crypt_DES::_processBlock()
+ */
+/**
+ * Contains array_reverse($keys[CRYPT_DES_DECRYPT])
+ */
+define('CRYPT_DES_ENCRYPT', 0);
+/**
+ * Contains array_reverse($keys[CRYPT_DES_ENCRYPT])
+ */
+define('CRYPT_DES_DECRYPT', 1);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see Crypt_DES::encrypt()
+ * @see Crypt_DES::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_DES_MODE_CTR', -1);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_DES_MODE_ECB', 1);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_DES_MODE_CBC', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_DES::Crypt_DES()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_DES_MODE_INTERNAL', 1);
+/**
+ * Toggles the mcrypt implementation
+ */
+define('CRYPT_DES_MODE_MCRYPT', 2);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of DES.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_DES
+ */
+class Crypt_DES {
+    /**
+     * The Key Schedule
+     *
+     * @see Crypt_DES::setKey()
+     * @var Array
+     * @access private
+     */
+    var $keys = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * The Encryption Mode
+     *
+     * @see Crypt_DES::Crypt_DES()
+     * @var Integer
+     * @access private
+     */
+    var $mode;
+
+    /**
+     * Continuous Buffer status
+     *
+     * @see Crypt_DES::enableContinuousBuffer()
+     * @var Boolean
+     * @access private
+     */
+    var $continuousBuffer = false;
+
+    /**
+     * Padding status
+     *
+     * @see Crypt_DES::enablePadding()
+     * @var Boolean
+     * @access private
+     */
+    var $padding = true;
+
+    /**
+     * The Initialization Vector
+     *
+     * @see Crypt_DES::setIV()
+     * @var String
+     * @access private
+     */
+    var $iv = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_DES::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $encryptIV = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_DES::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $decryptIV = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * mcrypt resource for encryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::encrypt()
+     * @var String
+     * @access private
+     */
+    var $enmcrypt;
+
+    /**
+     * mcrypt resource for decryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::decrypt()
+     * @var String
+     * @access private
+     */
+    var $demcrypt;
+
+    /**
+     * Does the (en|de)mcrypt resource need to be (re)initialized?
+     *
+     * @see setKey()
+     * @see setIV()
+     * @var Boolean
+     * @access private
+     */
+    var $changed = true;
+
+    /**
+     * Default Constructor.
+     *
+     * Determines whether or not the mcrypt extension should be used.  $mode should only, at present, be
+     * CRYPT_DES_MODE_ECB or CRYPT_DES_MODE_CBC.  If not explictly set, CRYPT_DES_MODE_CBC will be used.
+     *
+     * @param optional Integer $mode
+     * @return Crypt_DES
+     * @access public
+     */
+    function Crypt_DES($mode = CRYPT_MODE_DES_CBC)
+    {
+        if ( !defined('CRYPT_DES_MODE') ) {
+            switch (true) {
+                case extension_loaded('mcrypt'):
+                    // i'd check to see if des was supported, by doing in_array('des', mcrypt_list_algorithms('')),
+                    // but since that can be changed after the object has been created, there doesn't seem to be
+                    // a lot of point...
+                    define('CRYPT_DES_MODE', CRYPT_DES_MODE_MCRYPT);
+                    break;
+                default:
+                    define('CRYPT_DES_MODE', CRYPT_DES_MODE_INTERNAL);
+            }
+        }
+
+        switch ( CRYPT_DES_MODE ) {
+            case CRYPT_DES_MODE_MCRYPT:
+                switch ($mode) {
+                    case CRYPT_DES_MODE_ECB:
+                        $this->mode = MCRYPT_MODE_ECB;
+                        break;
+                    case CRYPT_DES_MODE_CTR:
+                        $this->mode = 'ctr';
+                        //$this->mode = in_array('ctr', mcrypt_list_modes()) ? 'ctr' : CRYPT_DES_MODE_CTR;
+                        break;
+                    case CRYPT_DES_MODE_CBC:
+                    default:
+                        $this->mode = MCRYPT_MODE_CBC;
+                }
+
+                break;
+            default:
+                switch ($mode) {
+                    case CRYPT_DES_MODE_ECB:
+                    case CRYPT_DES_MODE_CTR:
+                    case CRYPT_DES_MODE_CBC:
+                        $this->mode = $mode;
+                        break;
+                    default:
+                        $this->mode = CRYPT_DES_MODE_CBC;
+                }
+        }
+    }
+
+    /**
+     * Sets the key.
+     *
+     * Keys can be of any length.  DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we
+     * only use the first eight, if $key has more then eight characters in it, and pad $key with the
+     * null byte if it is less then eight characters long.
+     *
+     * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
+     *
+     * If the key is not explicitly set, it'll be assumed to be all zero's.
+     *
+     * @access public
+     * @param String $key
+     */
+    function setKey($key)
+    {
+        $this->keys = ( CRYPT_DES_MODE == CRYPT_DES_MODE_MCRYPT ) ? substr($key, 0, 8) : $this->_prepareKey($key);
+        $this->changed = true;
+    }
+
+    /**
+     * Sets the initialization vector. (optional)
+     *
+     * SetIV is not required when CRYPT_DES_MODE_ECB is being used.  If not explictly set, it'll be assumed
+     * to be all zero's.
+     *
+     * @access public
+     * @param String $iv
+     */
+    function setIV($iv)
+    {
+        $this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($iv, 0, 8), 8, chr(0));
+        $this->changed = true;
+    }
+
+    /**
+     * Generate CTR XOR encryption key
+     *
+     * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the
+     * plaintext / ciphertext in CTR mode.
+     *
+     * @see Crypt_DES::decrypt()
+     * @see Crypt_DES::encrypt()
+     * @access public
+     * @param Integer $length
+     * @param String $iv
+     */
+    function _generate_xor($length, &$iv)
+    {
+        $xor = '';
+        $num_blocks = ($length + 7) >> 3;
+        for ($i = 0; $i < $num_blocks; $i++) {
+            $xor.= $iv;
+            for ($j = 4; $j <= 8; $j+=4) {
+                $temp = substr($iv, -$j, 4);
+                switch ($temp) {
+                    case "\xFF\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4);
+                        break;
+                    case "\x7F\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4);
+                        break 2;
+                    default:
+                        extract(unpack('Ncount', $temp));
+                        $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4);
+                        break 2;
+                }
+            }
+        }
+
+        return $xor;
+    }
+
+    /**
+     * Encrypts a message.
+     *
+     * $plaintext will be padded with up to 8 additional bytes.  Other DES implementations may or may not pad in the
+     * same manner.  Other common approaches to padding and the reasons why it's necessary are discussed in the following
+     * URL:
+     *
+     * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
+     *
+     * An alternative to padding is to, separately, send the length of the file.  This is what SSH, in fact, does.
+     * strlen($plaintext) will still need to be a multiple of 8, however, arbitrary values can be added to make it that
+     * length.
+     *
+     * @see Crypt_DES::decrypt()
+     * @access public
+     * @param String $plaintext
+     */
+    function encrypt($plaintext)
+    {
+        if ($this->mode != CRYPT_DES_MODE_CTR && $this->mode != 'ctr') {
+            $plaintext = $this->_pad($plaintext);
+        }
+
+        if ( CRYPT_DES_MODE == CRYPT_DES_MODE_MCRYPT ) {
+            if ($this->changed) {
+                if (!isset($this->enmcrypt)) {
+                    $this->enmcrypt = mcrypt_module_open(MCRYPT_DES, '', $this->mode, '');
+                }
+                mcrypt_generic_init($this->enmcrypt, $this->keys, $this->encryptIV);
+                $this->changed = false;
+            }
+
+            $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->enmcrypt, $this->keys, $this->encryptIV);
+            }
+
+            return $ciphertext;
+        }
+
+        if (!is_array($this->keys)) {
+            $this->keys = $this->_prepareKey("\0\0\0\0\0\0\0\0");
+        }
+
+        $ciphertext = '';
+        switch ($this->mode) {
+            case CRYPT_DES_MODE_ECB:
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $ciphertext.= $this->_processBlock(substr($plaintext, $i, 8), CRYPT_DES_ENCRYPT);
+                }
+                break;
+            case CRYPT_DES_MODE_CBC:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $block = substr($plaintext, $i, 8);
+                    $block = $this->_processBlock($block ^ $xor, CRYPT_DES_ENCRYPT);
+                    $xor = $block;
+                    $ciphertext.= $block;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+                break;
+            case CRYPT_DES_MODE_CTR:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $block = substr($plaintext, $i, 8);
+                    $key = $this->_processBlock($this->_generate_xor(8, $xor), CRYPT_DES_ENCRYPT);
+                    $ciphertext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+        }
+
+        return $ciphertext;
+    }
+
+    /**
+     * Decrypts a message.
+     *
+     * If strlen($ciphertext) is not a multiple of 8, null bytes will be added to the end of the string until it is.
+     *
+     * @see Crypt_DES::encrypt()
+     * @access public
+     * @param String $ciphertext
+     */
+    function decrypt($ciphertext)
+    {
+        if ($this->mode != CRYPT_DES_MODE_CTR && $this->mode != 'ctr') {
+            // we pad with chr(0) since that's what mcrypt_generic does.  to quote from http://php.net/function.mcrypt-generic :
+            // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+            $ciphertext = str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, chr(0));
+        }
+
+        if ( CRYPT_DES_MODE == CRYPT_DES_MODE_MCRYPT ) {
+            if ($this->changed) {
+                if (!isset($this->demcrypt)) {
+                    $this->demcrypt = mcrypt_module_open(MCRYPT_DES, '', $this->mode, '');
+                }
+                mcrypt_generic_init($this->demcrypt, $this->keys, $this->decryptIV);
+                $this->changed = false;
+            }
+
+            $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->demcrypt, $this->keys, $this->decryptIV);
+            }
+
+            return $this->mode != 'ctr' ? $this->_unpad($plaintext) : $plaintext;
+        }
+
+        if (!is_array($this->keys)) {
+            $this->keys = $this->_prepareKey("\0\0\0\0\0\0\0\0");
+        }
+
+        $plaintext = '';
+        switch ($this->mode) {
+            case CRYPT_DES_MODE_ECB:
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $plaintext.= $this->_processBlock(substr($ciphertext, $i, 8), CRYPT_DES_DECRYPT);
+                }
+                break;
+            case CRYPT_DES_MODE_CBC:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $block = substr($ciphertext, $i, 8);
+                    $plaintext.= $this->_processBlock($block, CRYPT_DES_DECRYPT) ^ $xor;
+                    $xor = $block;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+                break;
+            case CRYPT_DES_MODE_CTR:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $block = substr($ciphertext, $i, 8);
+                    $key = $this->_processBlock($this->_generate_xor(8, $xor), CRYPT_DES_ENCRYPT);
+                    $plaintext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+        }
+
+        return $this->mode != CRYPT_DES_MODE_CTR ? $this->_unpad($plaintext) : $plaintext;
+    }
+
+    /**
+     * Treat consecutive "packets" as if they are a continuous buffer.
+     *
+     * Say you have a 16-byte plaintext $plaintext.  Using the default behavior, the two following code snippets
+     * will yield different outputs:
+     *
+     * <code>
+     *    echo $des->encrypt(substr($plaintext, 0, 8));
+     *    echo $des->encrypt(substr($plaintext, 8, 8));
+     * </code>
+     * <code>
+     *    echo $des->encrypt($plaintext);
+     * </code>
+     *
+     * The solution is to enable the continuous buffer.  Although this will resolve the above discrepancy, it creates
+     * another, as demonstrated with the following:
+     *
+     * <code>
+     *    $des->encrypt(substr($plaintext, 0, 8));
+     *    echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     * <code>
+     *    echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     *
+     * With the continuous buffer disabled, these would yield the same output.  With it enabled, they yield different
+     * outputs.  The reason is due to the fact that the initialization vector's change after every encryption /
+     * decryption round when the continuous buffer is enabled.  When it's disabled, they remain constant.
+     *
+     * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
+     * encryption / decryption round, whereas otherwise, it'd remain constant.  For this reason, it's recommended that
+     * continuous buffers not be used.  They do offer better security and are, in fact, sometimes required (SSH uses them),
+     * however, they are also less intuitive and more likely to cause you problems.
+     *
+     * @see Crypt_DES::disableContinuousBuffer()
+     * @access public
+     */
+    function enableContinuousBuffer()
+    {
+        $this->continuousBuffer = true;
+    }
+
+    /**
+     * Treat consecutive packets as if they are a discontinuous buffer.
+     *
+     * The default behavior.
+     *
+     * @see Crypt_DES::enableContinuousBuffer()
+     * @access public
+     */
+    function disableContinuousBuffer()
+    {
+        $this->continuousBuffer = false;
+        $this->encryptIV = $this->iv;
+        $this->decryptIV = $this->iv;
+    }
+
+    /**
+     * Pad "packets".
+     *
+     * DES works by encrypting eight bytes at a time.  If you ever need to encrypt or decrypt something that's not
+     * a multiple of eight, it becomes necessary to pad the input so that it's length is a multiple of eight.
+     *
+     * Padding is enabled by default.  Sometimes, however, it is undesirable to pad strings.  Such is the case in SSH1,
+     * where "packets" are padded with random bytes before being encrypted.  Unpad these packets and you risk stripping
+     * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
+     * transmitted separately)
+     *
+     * @see Crypt_DES::disablePadding()
+     * @access public
+     */
+    function enablePadding()
+    {
+        $this->padding = true;
+    }
+
+    /**
+     * Do not pad packets.
+     *
+     * @see Crypt_DES::enablePadding()
+     * @access public
+     */
+    function disablePadding()
+    {
+        $this->padding = false;
+    }
+
+    /**
+     * Pads a string
+     *
+     * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize (8).
+     * 8 - (strlen($text) & 7) bytes are added, each of which is equal to chr(8 - (strlen($text) & 7)
+     *
+     * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
+     * and padding will, hence forth, be enabled.
+     *
+     * @see Crypt_DES::_unpad()
+     * @access private
+     */
+    function _pad($text)
+    {
+        $length = strlen($text);
+
+        if (!$this->padding) {
+            if (($length & 7) == 0) {
+                return $text;
+            } else {
+                user_error("The plaintext's length ($length) is not a multiple of the block size (8)", E_USER_NOTICE);
+                $this->padding = true;
+            }
+        }
+
+        $pad = 8 - ($length & 7);
+        return str_pad($text, $length + $pad, chr($pad));
+    }
+
+    /**
+     * Unpads a string
+     *
+     * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
+     * and false will be returned.
+     *
+     * @see Crypt_DES::_pad()
+     * @access private
+     */
+    function _unpad($text)
+    {
+        if (!$this->padding) {
+            return $text;
+        }
+
+        $length = ord($text[strlen($text) - 1]);
+
+        if (!$length || $length > 8) {
+            return false;
+        }
+
+        return substr($text, 0, -$length);
+    }
+
+    /**
+     * Encrypts or decrypts a 64-bit block
+     *
+     * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT.  See
+     * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general
+     * idea of what this function does.
+     *
+     * @access private
+     * @param String $block
+     * @param Integer $mode
+     * @return String
+     */
+    function _processBlock($block, $mode)
+    {
+        // s-boxes.  in the official DES docs, they're described as being matrices that
+        // one accesses by using the first and last bits to determine the row and the
+        // middle four bits to determine the column.  in this implementation, they've
+        // been converted to vectors
+        static $sbox = array(
+            array(
+                14,  0,  4, 15, 13,  7,  1,  4,  2, 14, 15,  2, 11, 13,  8,  1,
+                 3, 10 ,10,  6,  6, 12, 12, 11,  5,  9,  9,  5,  0,  3,  7,  8,
+                 4, 15,  1, 12, 14,  8,  8,  2, 13,  4,  6,  9,  2,  1, 11,  7,
+                15,  5, 12, 11,  9,  3,  7, 14,  3, 10, 10,  0,  5,  6,  0, 13
+            ),
+            array(
+                15,  3,  1, 13,  8,  4, 14,  7,  6, 15, 11,  2,  3,  8,  4, 14,
+                 9, 12,  7,  0,  2,  1, 13, 10, 12,  6,  0,  9,  5, 11, 10,  5,
+                 0, 13, 14,  8,  7, 10, 11,  1, 10,  3,  4, 15, 13,  4,  1,  2,
+                 5, 11,  8,  6, 12,  7,  6, 12,  9,  0,  3,  5,  2, 14, 15,  9
+            ),
+            array(
+                10, 13,  0,  7,  9,  0, 14,  9,  6,  3,  3,  4, 15,  6,  5, 10,
+                 1,  2, 13,  8, 12,  5,  7, 14, 11, 12,  4, 11,  2, 15,  8,  1,
+                13,  1,  6, 10,  4, 13,  9,  0,  8,  6, 15,  9,  3,  8,  0,  7,
+                11,  4,  1, 15,  2, 14, 12,  3,  5, 11, 10,  5, 14,  2,  7, 12
+            ),
+            array(
+                 7, 13, 13,  8, 14, 11,  3,  5,  0,  6,  6, 15,  9,  0, 10,  3,
+                 1,  4,  2,  7,  8,  2,  5, 12, 11,  1, 12, 10,  4, 14, 15,  9,
+                10,  3,  6, 15,  9,  0,  0,  6, 12, 10, 11,  1,  7, 13, 13,  8,
+                15,  9,  1,  4,  3,  5, 14, 11,  5, 12,  2,  7,  8,  2,  4, 14
+            ),
+            array(
+                 2, 14, 12, 11,  4,  2,  1, 12,  7,  4, 10,  7, 11, 13,  6,  1,
+                 8,  5,  5,  0,  3, 15, 15, 10, 13,  3,  0,  9, 14,  8,  9,  6,
+                 4, 11,  2,  8,  1, 12, 11,  7, 10,  1, 13, 14,  7,  2,  8, 13,
+                15,  6,  9, 15, 12,  0,  5,  9,  6, 10,  3,  4,  0,  5, 14,  3
+            ),
+            array(
+                12, 10,  1, 15, 10,  4, 15,  2,  9,  7,  2, 12,  6,  9,  8,  5,
+                 0,  6, 13,  1,  3, 13,  4, 14, 14,  0,  7, 11,  5,  3, 11,  8,
+                 9,  4, 14,  3, 15,  2,  5, 12,  2,  9,  8,  5, 12, 15,  3, 10,
+                 7, 11,  0, 14,  4,  1, 10,  7,  1,  6, 13,  0, 11,  8,  6, 13
+            ),
+            array(
+                 4, 13, 11,  0,  2, 11, 14,  7, 15,  4,  0,  9,  8,  1, 13, 10,
+                 3, 14, 12,  3,  9,  5,  7, 12,  5,  2, 10, 15,  6,  8,  1,  6,
+                 1,  6,  4, 11, 11, 13, 13,  8, 12,  1,  3,  4,  7, 10, 14,  7,
+                10,  9, 15,  5,  6,  0,  8, 15,  0, 14,  5,  2,  9,  3,  2, 12
+            ),
+            array(
+                13,  1,  2, 15,  8, 13,  4,  8,  6, 10, 15,  3, 11,  7,  1,  4,
+                10, 12,  9,  5,  3,  6, 14, 11,  5,  0,  0, 14, 12,  9,  7,  2,
+                 7,  2, 11,  1,  4, 14,  1,  7,  9,  4, 12, 10, 14,  8,  2, 13,
+                 0, 15,  6, 12, 10,  9, 13,  0, 15,  3,  3,  5,  5,  6,  8, 11
+            )
+        );
+
+        $keys = $this->keys;
+
+        $temp = unpack('Na/Nb', $block);
+        $block = array($temp['a'], $temp['b']);
+
+        // because php does arithmetic right shifts, if the most significant bits are set, right
+        // shifting those into the correct position will add 1's - not 0's.  this will intefere
+        // with the | operation unless a second & is done.  so we isolate these bits and left shift
+        // them into place.  we then & each block with 0x7FFFFFFF to prevennt 1's from being added
+        // for any other shifts.
+        $msb = array(
+            ($block[0] >> 31) & 1,
+            ($block[1] >> 31) & 1
+        );
+        $block[0] &= 0x7FFFFFFF;
+        $block[1] &= 0x7FFFFFFF;
+
+        // we isolate the appropriate bit in the appropriate integer and shift as appropriate.  in
+        // some cases, there are going to be multiple bits in the same integer that need to be shifted
+        // in the same way.  we combine those into one shift operation.
+        $block = array(
+            (($block[1] & 0x00000040) << 25) | (($block[1] & 0x00004000) << 16) |
+            (($block[1] & 0x00400001) <<  7) | (($block[1] & 0x40000100) >>  2) |
+            (($block[0] & 0x00000040) << 21) | (($block[0] & 0x00004000) << 12) |
+            (($block[0] & 0x00400001) <<  3) | (($block[0] & 0x40000100) >>  6) |
+            (($block[1] & 0x00000010) << 19) | (($block[1] & 0x00001000) << 10) |
+            (($block[1] & 0x00100000) <<  1) | (($block[1] & 0x10000000) >>  8) |
+            (($block[0] & 0x00000010) << 15) | (($block[0] & 0x00001000) <<  6) |
+            (($block[0] & 0x00100000) >>  3) | (($block[0] & 0x10000000) >> 12) |
+            (($block[1] & 0x00000004) << 13) | (($block[1] & 0x00000400) <<  4) |
+            (($block[1] & 0x00040000) >>  5) | (($block[1] & 0x04000000) >> 14) |
+            (($block[0] & 0x00000004) <<  9) | ( $block[0] & 0x00000400       ) |
+            (($block[0] & 0x00040000) >>  9) | (($block[0] & 0x04000000) >> 18) |
+            (($block[1] & 0x00010000) >> 11) | (($block[1] & 0x01000000) >> 20) |
+            (($block[0] & 0x00010000) >> 15) | (($block[0] & 0x01000000) >> 24)
+        ,
+            (($block[1] & 0x00000080) << 24) | (($block[1] & 0x00008000) << 15) |
+            (($block[1] & 0x00800002) <<  6) | (($block[0] & 0x00000080) << 20) |
+            (($block[0] & 0x00008000) << 11) | (($block[0] & 0x00800002) <<  2) |
+            (($block[1] & 0x00000020) << 18) | (($block[1] & 0x00002000) <<  9) |
+            ( $block[1] & 0x00200000       ) | (($block[1] & 0x20000000) >>  9) |
+            (($block[0] & 0x00000020) << 14) | (($block[0] & 0x00002000) <<  5) |
+            (($block[0] & 0x00200000) >>  4) | (($block[0] & 0x20000000) >> 13) |
+            (($block[1] & 0x00000008) << 12) | (($block[1] & 0x00000800) <<  3) |
+            (($block[1] & 0x00080000) >>  6) | (($block[1] & 0x08000000) >> 15) |
+            (($block[0] & 0x00000008) <<  8) | (($block[0] & 0x00000800) >>  1) |
+            (($block[0] & 0x00080000) >> 10) | (($block[0] & 0x08000000) >> 19) |
+            (($block[1] & 0x00000200) >>  3) | (($block[0] & 0x00000200) >>  7) |
+            (($block[1] & 0x00020000) >> 12) | (($block[1] & 0x02000000) >> 21) |
+            (($block[0] & 0x00020000) >> 16) | (($block[0] & 0x02000000) >> 25) |
+            ($msb[1] << 28) | ($msb[0] << 24)
+        );
+
+        for ($i = 0; $i < 16; $i++) {
+            // start of "the Feistel (F) function" - see the following URL:
+            // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
+            $temp = (($sbox[0][((($block[1] >> 27) & 0x1F) | (($block[1] & 1) << 5)) ^ $keys[$mode][$i][0]]) << 28)
+                  | (($sbox[1][(($block[1] & 0x1F800000) >> 23) ^ $keys[$mode][$i][1]]) << 24)
+                  | (($sbox[2][(($block[1] & 0x01F80000) >> 19) ^ $keys[$mode][$i][2]]) << 20)
+                  | (($sbox[3][(($block[1] & 0x001F8000) >> 15) ^ $keys[$mode][$i][3]]) << 16)
+                  | (($sbox[4][(($block[1] & 0x0001F800) >> 11) ^ $keys[$mode][$i][4]]) << 12)
+                  | (($sbox[5][(($block[1] & 0x00001F80) >>  7) ^ $keys[$mode][$i][5]]) <<  8)
+                  | (($sbox[6][(($block[1] & 0x000001F8) >>  3) ^ $keys[$mode][$i][6]]) <<  4)
+                  | ( $sbox[7][((($block[1] & 0x1F) << 1) | (($block[1] >> 31) & 1)) ^ $keys[$mode][$i][7]]);
+
+            $msb = ($temp >> 31) & 1;
+            $temp &= 0x7FFFFFFF;
+            $newBlock = (($temp & 0x00010000) << 15) | (($temp & 0x02020120) <<  5)
+                      | (($temp & 0x00001800) << 17) | (($temp & 0x01000000) >> 10)
+                      | (($temp & 0x00000008) << 24) | (($temp & 0x00100000) <<  6)
+                      | (($temp & 0x00000010) << 21) | (($temp & 0x00008000) <<  9)
+                      | (($temp & 0x00000200) << 12) | (($temp & 0x10000000) >> 27)
+                      | (($temp & 0x00000040) << 14) | (($temp & 0x08000000) >>  8)
+                      | (($temp & 0x00004000) <<  4) | (($temp & 0x00000002) << 16)
+                      | (($temp & 0x00442000) >>  6) | (($temp & 0x40800000) >> 15)
+                      | (($temp & 0x00000001) << 11) | (($temp & 0x20000000) >> 20)
+                      | (($temp & 0x00080000) >> 13) | (($temp & 0x00000004) <<  3)
+                      | (($temp & 0x04000000) >> 22) | (($temp & 0x00000480) >>  7)
+                      | (($temp & 0x00200000) >> 19) | ($msb << 23);
+            // end of "the Feistel (F) function" - $newBlock is F's output
+
+            $temp = $block[1];
+            $block[1] = $block[0] ^ $newBlock;
+            $block[0] = $temp;
+        }
+
+        $msb = array(
+            ($block[0] >> 31) & 1,
+            ($block[1] >> 31) & 1
+        );
+        $block[0] &= 0x7FFFFFFF;
+        $block[1] &= 0x7FFFFFFF;
+
+        $block = array(
+            (($block[0] & 0x01000004) <<  7) | (($block[1] & 0x01000004) <<  6) |
+            (($block[0] & 0x00010000) << 13) | (($block[1] & 0x00010000) << 12) |
+            (($block[0] & 0x00000100) << 19) | (($block[1] & 0x00000100) << 18) |
+            (($block[0] & 0x00000001) << 25) | (($block[1] & 0x00000001) << 24) |
+            (($block[0] & 0x02000008) >>  2) | (($block[1] & 0x02000008) >>  3) |
+            (($block[0] & 0x00020000) <<  4) | (($block[1] & 0x00020000) <<  3) |
+            (($block[0] & 0x00000200) << 10) | (($block[1] & 0x00000200) <<  9) |
+            (($block[0] & 0x00000002) << 16) | (($block[1] & 0x00000002) << 15) |
+            (($block[0] & 0x04000000) >> 11) | (($block[1] & 0x04000000) >> 12) |
+            (($block[0] & 0x00040000) >>  5) | (($block[1] & 0x00040000) >>  6) |
+            (($block[0] & 0x00000400) <<  1) | ( $block[1] & 0x00000400       ) |
+            (($block[0] & 0x08000000) >> 20) | (($block[1] & 0x08000000) >> 21) |
+            (($block[0] & 0x00080000) >> 14) | (($block[1] & 0x00080000) >> 15) |
+            (($block[0] & 0x00000800) >>  8) | (($block[1] & 0x00000800) >>  9)
+        ,
+            (($block[0] & 0x10000040) <<  3) | (($block[1] & 0x10000040) <<  2) |
+            (($block[0] & 0x00100000) <<  9) | (($block[1] & 0x00100000) <<  8) |
+            (($block[0] & 0x00001000) << 15) | (($block[1] & 0x00001000) << 14) |
+            (($block[0] & 0x00000010) << 21) | (($block[1] & 0x00000010) << 20) |
+            (($block[0] & 0x20000080) >>  6) | (($block[1] & 0x20000080) >>  7) |
+            ( $block[0] & 0x00200000       ) | (($block[1] & 0x00200000) >>  1) |
+            (($block[0] & 0x00002000) <<  6) | (($block[1] & 0x00002000) <<  5) |
+            (($block[0] & 0x00000020) << 12) | (($block[1] & 0x00000020) << 11) |
+            (($block[0] & 0x40000000) >> 15) | (($block[1] & 0x40000000) >> 16) |
+            (($block[0] & 0x00400000) >>  9) | (($block[1] & 0x00400000) >> 10) |
+            (($block[0] & 0x00004000) >>  3) | (($block[1] & 0x00004000) >>  4) |
+            (($block[0] & 0x00800000) >> 18) | (($block[1] & 0x00800000) >> 19) |
+            (($block[0] & 0x00008000) >> 12) | (($block[1] & 0x00008000) >> 13) |
+            ($msb[0] <<  7) | ($msb[1] <<  6)
+        );
+
+        return pack('NN', $block[0], $block[1]);
+    }
+
+    /**
+     * Creates the key schedule.
+     *
+     * @access private
+     * @param String $key
+     * @return Array
+     */
+    function _prepareKey($key)
+    {
+        static $shifts = array( // number of key bits shifted per round
+            1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+        );
+
+        // pad the key and remove extra characters as appropriate.
+        $key = str_pad(substr($key, 0, 8), 8, chr(0));
+
+        $temp = unpack('Na/Nb', $key);
+        $key = array($temp['a'], $temp['b']);
+        $msb = array(
+            ($key[0] >> 31) & 1,
+            ($key[1] >> 31) & 1
+        );
+        $key[0] &= 0x7FFFFFFF;
+        $key[1] &= 0x7FFFFFFF;
+
+        $key = array(
+            (($key[1] & 0x00000002) << 26) | (($key[1] & 0x00000204) << 17) |
+            (($key[1] & 0x00020408) <<  8) | (($key[1] & 0x02040800) >>  1) |
+            (($key[0] & 0x00000002) << 22) | (($key[0] & 0x00000204) << 13) |
+            (($key[0] & 0x00020408) <<  4) | (($key[0] & 0x02040800) >>  5) |
+            (($key[1] & 0x04080000) >> 10) | (($key[0] & 0x04080000) >> 14) |
+            (($key[1] & 0x08000000) >> 19) | (($key[0] & 0x08000000) >> 23) |
+            (($key[0] & 0x00000010) >>  1) | (($key[0] & 0x00001000) >> 10) |
+            (($key[0] & 0x00100000) >> 19) | (($key[0] & 0x10000000) >> 28)
+        ,
+            (($key[1] & 0x00000080) << 20) | (($key[1] & 0x00008000) << 11) |
+            (($key[1] & 0x00800000) <<  2) | (($key[0] & 0x00000080) << 16) |
+            (($key[0] & 0x00008000) <<  7) | (($key[0] & 0x00800000) >>  2) |
+            (($key[1] & 0x00000040) << 13) | (($key[1] & 0x00004000) <<  4) |
+            (($key[1] & 0x00400000) >>  5) | (($key[1] & 0x40000000) >> 14) |
+            (($key[0] & 0x00000040) <<  9) | ( $key[0] & 0x00004000       ) |
+            (($key[0] & 0x00400000) >>  9) | (($key[0] & 0x40000000) >> 18) |
+            (($key[1] & 0x00000020) <<  6) | (($key[1] & 0x00002000) >>  3) |
+            (($key[1] & 0x00200000) >> 12) | (($key[1] & 0x20000000) >> 21) |
+            (($key[0] & 0x00000020) <<  2) | (($key[0] & 0x00002000) >>  7) |
+            (($key[0] & 0x00200000) >> 16) | (($key[0] & 0x20000000) >> 25) |
+            (($key[1] & 0x00000010) >>  1) | (($key[1] & 0x00001000) >> 10) |
+            (($key[1] & 0x00100000) >> 19) | (($key[1] & 0x10000000) >> 28) |
+            ($msb[1] << 24) | ($msb[0] << 20)
+        ); 
+
+        $keys = array();
+        for ($i = 0; $i < 16; $i++) {
+            $key[0] <<= $shifts[$i];
+            $temp = ($key[0] & 0xF0000000) >> 28;
+            $key[0] = ($key[0] | $temp) & 0x0FFFFFFF;
+
+            $key[1] <<= $shifts[$i];
+            $temp = ($key[1] & 0xF0000000) >> 28;
+            $key[1] = ($key[1] | $temp) & 0x0FFFFFFF;
+
+            $temp = array(
+                (($key[1] & 0x00004000) >>  9) | (($key[1] & 0x00000800) >>  7) |
+                (($key[1] & 0x00020000) >> 14) | (($key[1] & 0x00000010) >>  2) |
+                (($key[1] & 0x08000000) >> 26) | (($key[1] & 0x00800000) >> 23)
+            ,
+                (($key[1] & 0x02400000) >> 20) | (($key[1] & 0x00000001) <<  4) |
+                (($key[1] & 0x00002000) >> 10) | (($key[1] & 0x00040000) >> 18) |
+                (($key[1] & 0x00000080) >>  6)
+            ,
+                ( $key[1] & 0x00000020       ) | (($key[1] & 0x00000200) >>  5) |
+                (($key[1] & 0x00010000) >> 13) | (($key[1] & 0x01000000) >> 22) |
+                (($key[1] & 0x00000004) >>  1) | (($key[1] & 0x00100000) >> 20)
+            ,
+                (($key[1] & 0x00001000) >>  7) | (($key[1] & 0x00200000) >> 17) |
+                (($key[1] & 0x00000002) <<  2) | (($key[1] & 0x00000100) >>  6) |
+                (($key[1] & 0x00008000) >> 14) | (($key[1] & 0x04000000) >> 26)
+            ,
+                (($key[0] & 0x00008000) >> 10) | ( $key[0] & 0x00000010       ) |
+                (($key[0] & 0x02000000) >> 22) | (($key[0] & 0x00080000) >> 17) |
+                (($key[0] & 0x00000200) >>  8) | (($key[0] & 0x00000002) >>  1)
+            ,
+                (($key[0] & 0x04000000) >> 21) | (($key[0] & 0x00010000) >> 12) |
+                (($key[0] & 0x00000020) >>  2) | (($key[0] & 0x00000800) >>  9) |
+                (($key[0] & 0x00800000) >> 22) | (($key[0] & 0x00000100) >>  8)
+            ,
+                (($key[0] & 0x00001000) >>  7) | (($key[0] & 0x00000088) >>  3) |
+                (($key[0] & 0x00020000) >> 14) | (($key[0] & 0x00000001) <<  2) |
+                (($key[0] & 0x00400000) >> 21)
+            ,
+                (($key[0] & 0x00000400) >>  5) | (($key[0] & 0x00004000) >> 10) |
+                (($key[0] & 0x00000040) >>  3) | (($key[0] & 0x00100000) >> 18) |
+                (($key[0] & 0x08000000) >> 26) | (($key[0] & 0x01000000) >> 24)
+            );
+
+            $keys[] = $temp;
+        }
+
+        $temp = array(
+            CRYPT_DES_ENCRYPT => $keys,
+            CRYPT_DES_DECRYPT => array_reverse($keys)
+        );
+
+        return $temp;
+    }
+}
+
+// vim: ts=4:sw=4:et:
+// vim6: fdl=1:
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/Hash.php b/plugins/OStatus/extlib/Crypt/Hash.php
new file mode 100644 (file)
index 0000000..e4dfde3
--- /dev/null
@@ -0,0 +1,816 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
+ *
+ * Uses hash() or mhash() if available and an internal implementation, otherwise.  Currently supports the following:
+ *
+ * md2, md5, md5-96, sha1, sha1-96, sha256, sha384, and sha512
+ *
+ * If {@link Crypt_Hash::setKey() setKey()} is called, {@link Crypt_Hash::hash() hash()} will return the HMAC as opposed to
+ * the hash.  If no valid algorithm is provided, sha1 will be used.
+ *
+ * PHP versions 4 and 5
+ *
+ * {@internal The variable names are the same as those in 
+ * {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/Hash.php');
+ *
+ *    $hash = new Crypt_Hash('sha1');
+ *
+ *    $hash->setKey('abcdefg');
+ *
+ *    echo base64_encode($hash->hash('abcdefg'));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_Hash
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: Hash.php,v 1.6 2009/11/23 23:37:07 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access private
+ * @see Crypt_Hash::Crypt_Hash()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_HASH_MODE_INTERNAL', 1);
+/**
+ * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+.
+ */
+define('CRYPT_HASH_MODE_MHASH',    2);
+/**
+ * Toggles the hash() implementation, which works on PHP 5.1.2+.
+ */
+define('CRYPT_HASH_MODE_HASH',     3);
+/**#@-*/
+
+/**
+ * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_Hash
+ */
+class Crypt_Hash {
+    /**
+     * Byte-length of compression blocks / key (Internal HMAC)
+     *
+     * @see Crypt_Hash::setAlgorithm()
+     * @var Integer
+     * @access private
+     */
+    var $b;
+
+    /**
+     * Byte-length of hash output (Internal HMAC)
+     *
+     * @see Crypt_Hash::setHash()
+     * @var Integer
+     * @access private
+     */
+    var $l = false;
+
+    /**
+     * Hash Algorithm
+     *
+     * @see Crypt_Hash::setHash()
+     * @var String
+     * @access private
+     */
+    var $hash;
+
+    /**
+     * Key
+     *
+     * @see Crypt_Hash::setKey()
+     * @var String
+     * @access private
+     */
+    var $key = '';
+
+    /**
+     * Outer XOR (Internal HMAC)
+     *
+     * @see Crypt_Hash::setKey()
+     * @var String
+     * @access private
+     */
+    var $opad;
+
+    /**
+     * Inner XOR (Internal HMAC)
+     *
+     * @see Crypt_Hash::setKey()
+     * @var String
+     * @access private
+     */
+    var $ipad;
+
+    /**
+     * Default Constructor.
+     *
+     * @param optional String $hash
+     * @return Crypt_Hash
+     * @access public
+     */
+    function Crypt_Hash($hash = 'sha1')
+    {
+        if ( !defined('CRYPT_HASH_MODE') ) {
+            switch (true) {
+                case extension_loaded('hash'):
+                    define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH);
+                    break;
+                case extension_loaded('mhash'):
+                    define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH);
+                    break;
+                default:
+                    define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL);
+            }
+        }
+
+        $this->setHash($hash);
+    }
+
+    /**
+     * Sets the key for HMACs
+     *
+     * Keys can be of any length.
+     *
+     * @access public
+     * @param String $key
+     */
+    function setKey($key)
+    {
+        $this->key = $key;
+    }
+
+    /**
+     * Sets the hash function.
+     *
+     * @access public
+     * @param String $hash
+     */
+    function setHash($hash)
+    {
+        switch ($hash) {
+            case 'md5-96':
+            case 'sha1-96':
+                $this->l = 12; // 96 / 8 = 12
+                break;
+            case 'md2':
+            case 'md5':
+                $this->l = 16;
+                break;
+            case 'sha1':
+                $this->l = 20;
+                break;
+            case 'sha256':
+                $this->l = 32;
+                break;
+            case 'sha384':
+                $this->l = 48;
+                break;
+            case 'sha512':
+                $this->l = 64;
+        }
+
+        switch ($hash) {
+            case 'md2':
+                $mode = CRYPT_HASH_MODE_INTERNAL;
+                break;
+            case 'sha384':
+            case 'sha512':
+                $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
+                break;
+            default:
+                $mode = CRYPT_HASH_MODE;
+        }
+
+        switch ( $mode ) {
+            case CRYPT_HASH_MODE_MHASH:
+                switch ($hash) {
+                    case 'md5':
+                    case 'md5-96':
+                        $this->hash = MHASH_MD5;
+                        break;
+                    case 'sha256':
+                        $this->hash = MHASH_SHA256;
+                        break;
+                    case 'sha1':
+                    case 'sha1-96':
+                    default:
+                        $this->hash = MHASH_SHA1;
+                }
+                return;
+            case CRYPT_HASH_MODE_HASH:
+                switch ($hash) {
+                    case 'md5':
+                    case 'md5-96':
+                        $this->hash = 'md5';
+                        return;
+                    case 'sha256':
+                    case 'sha384':
+                    case 'sha512':
+                        $this->hash = $hash;
+                        return;
+                    case 'sha1':
+                    case 'sha1-96':
+                    default:
+                        $this->hash = 'sha1';
+                }
+                return;
+        }
+
+        switch ($hash) {
+            case 'md2':
+                 $this->b = 16;
+                 $this->hash = array($this, '_md2');
+                 break;
+            case 'md5':
+            case 'md5-96':
+                 $this->b = 64;
+                 $this->hash = array($this, '_md5');
+                 break;
+            case 'sha256':
+                 $this->b = 64;
+                 $this->hash = array($this, '_sha256');
+                 break;
+            case 'sha384':
+            case 'sha512':
+                 $this->b = 128;
+                 $this->hash = array($this, '_sha512');
+                 break;
+            case 'sha1':
+            case 'sha1-96':
+            default:
+                 $this->b = 64;
+                 $this->hash = array($this, '_sha1');
+        }
+
+        $this->ipad = str_repeat(chr(0x36), $this->b);
+        $this->opad = str_repeat(chr(0x5C), $this->b);
+    }
+
+    /**
+     * Compute the HMAC.
+     *
+     * @access public
+     * @param String $text
+     * @return String
+     */
+    function hash($text)
+    {
+        $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
+
+        if (!empty($this->key)) {
+            switch ( $mode ) {
+                case CRYPT_HASH_MODE_MHASH:
+                    $output = mhash($this->hash, $text, $this->key);
+                    break;
+                case CRYPT_HASH_MODE_HASH:
+                    $output = hash_hmac($this->hash, $text, $this->key, true);
+                    break;
+                case CRYPT_HASH_MODE_INTERNAL:
+                    /* "Applications that use keys longer than B bytes will first hash the key using H and then use the
+                        resultant L byte string as the actual key to HMAC."
+
+                        -- http://tools.ietf.org/html/rfc2104#section-2 */
+                    $key = strlen($this->key) > $this->b ? call_user_func($this->$hash, $this->key) : $this->key;
+
+                    $key    = str_pad($key, $this->b, chr(0));      // step 1
+                    $temp   = $this->ipad ^ $key;                   // step 2
+                    $temp  .= $text;                                // step 3
+                    $temp   = call_user_func($this->hash, $temp);   // step 4
+                    $output = $this->opad ^ $key;                   // step 5
+                    $output.= $temp;                                // step 6
+                    $output = call_user_func($this->hash, $output); // step 7
+            }
+        } else {
+            switch ( $mode ) {
+                case CRYPT_HASH_MODE_MHASH:
+                    $output = mhash($this->hash, $text);
+                    break;
+                case CRYPT_HASH_MODE_HASH:
+                    $output = hash($this->hash, $text, true);
+                    break;
+                case CRYPT_HASH_MODE_INTERNAL:
+                    $output = call_user_func($this->hash, $text);
+            }
+        }
+
+        return substr($output, 0, $this->l);
+    }
+
+    /**
+     * Returns the hash length (in bytes)
+     *
+     * @access private
+     * @return Integer
+     */
+    function getLength()
+    {
+        return $this->l;
+    }
+
+    /**
+     * Wrapper for MD5
+     *
+     * @access private
+     * @param String $text
+     */
+    function _md5($m)
+    {
+        return pack('H*', md5($m));
+    }
+
+    /**
+     * Wrapper for SHA1
+     *
+     * @access private
+     * @param String $text
+     */
+    function _sha1($m)
+    {
+        return pack('H*', sha1($m));
+    }
+
+    /**
+     * Pure-PHP implementation of MD2
+     *
+     * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}.
+     *
+     * @access private
+     * @param String $text
+     */
+    function _md2($m)
+    {
+        static $s = array(
+             41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240, 6,
+             19,  98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,
+             76, 130, 202,  30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111, 24,
+            138,  23, 229,  18, 190,  78, 196, 214, 218, 158, 222,  73, 160, 251,
+            245, 142, 187,  47, 238, 122, 169, 104, 121, 145,  21, 178,   7,  63,
+            148, 194,  16, 137,  11,  34,  95,  33, 128, 127,  93, 154,  90, 144, 50,
+             39,  53,  62, 204, 231, 191, 247, 151,   3, 255,  25,  48, 179,  72, 165,
+            181, 209, 215,  94, 146,  42, 172,  86, 170, 198,  79, 184,  56, 210,
+            150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,  69, 157,
+            112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2, 27,
+             96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126, 15,
+             85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197,
+            234,  38,  44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244, 65,
+            129,  77,  82, 106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,
+              8,  12, 189, 177,  74, 120, 136, 149, 139, 227,  99, 232, 109, 233,
+            203, 213, 254,  59,   0,  29,  57, 242, 239, 183,  14, 102,  88, 208, 228,
+            166, 119, 114, 248, 235, 117,  75,  10,  49,  68,  80, 180, 143, 237,
+             31,  26, 219, 153, 141,  51, 159,  17, 131, 20
+        );
+
+        // Step 1. Append Padding Bytes
+        $pad = 16 - (strlen($m) & 0xF);
+        $m.= str_repeat(chr($pad), $pad);
+
+        $length = strlen($m);
+
+        // Step 2. Append Checksum
+        $c = str_repeat(chr(0), 16);
+        $l = chr(0);
+        for ($i = 0; $i < $length; $i+= 16) {
+            for ($j = 0; $j < 16; $j++) {
+                $c[$j] = chr($s[ord($m[$i + $j] ^ $l)]);
+                $l = $c[$j];
+            }
+        }
+        $m.= $c;
+
+        $length+= 16;
+
+        // Step 3. Initialize MD Buffer
+        $x = str_repeat(chr(0), 48);
+
+        // Step 4. Process Message in 16-Byte Blocks
+        for ($i = 0; $i < $length; $i+= 16) {
+            for ($j = 0; $j < 16; $j++) {
+                $x[$j + 16] = $m[$i + $j];
+                $x[$j + 32] = $x[$j + 16] ^ $x[$j];
+            }
+            $t = chr(0);
+            for ($j = 0; $j < 18; $j++) {
+                for ($k = 0; $k < 48; $k++) {
+                    $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]);
+                    //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]);
+                }
+                $t = chr(ord($t) + $j);
+            }
+        }
+
+        // Step 5. Output
+        return substr($x, 0, 16);
+    }
+
+    /**
+     * Pure-PHP implementation of SHA256
+     *
+     * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}.
+     *
+     * @access private
+     * @param String $text
+     */
+    function _sha256($m)
+    {
+        if (extension_loaded('suhosin')) {
+            return pack('H*', sha256($m));
+        }
+
+        // Initialize variables
+        $hash = array(
+            0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
+        );
+        // Initialize table of round constants
+        // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)
+        static $k = array(
+            0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+            0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+            0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+            0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+            0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+            0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+            0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+            0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+        );
+
+        // Pre-processing
+        $length = strlen($m);
+        // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64
+        $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F));
+        $m[$length] = chr(0x80);
+        // we don't support hashing strings 512MB long
+        $m.= pack('N2', 0, $length << 3);
+
+        // Process the message in successive 512-bit chunks
+        $chunks = str_split($m, 64);
+        foreach ($chunks as $chunk) {
+            $w = array();
+            for ($i = 0; $i < 16; $i++) {
+                extract(unpack('Ntemp', $this->_string_shift($chunk, 4)));
+                $w[] = $temp;
+            }
+
+            // Extend the sixteen 32-bit words into sixty-four 32-bit words
+            for ($i = 16; $i < 64; $i++) {
+                $s0 = $this->_rightRotate($w[$i - 15],  7) ^
+                      $this->_rightRotate($w[$i - 15], 18) ^
+                      $this->_rightShift( $w[$i - 15],  3);
+                $s1 = $this->_rightRotate($w[$i - 2], 17) ^
+                      $this->_rightRotate($w[$i - 2], 19) ^
+                      $this->_rightShift( $w[$i - 2], 10);
+                $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
+
+            }
+
+            // Initialize hash value for this chunk
+            list($a, $b, $c, $d, $e, $f, $g, $h) = $hash;
+
+            // Main loop
+            for ($i = 0; $i < 64; $i++) {
+                $s0 = $this->_rightRotate($a,  2) ^
+                      $this->_rightRotate($a, 13) ^
+                      $this->_rightRotate($a, 22);
+                $maj = ($a & $b) ^
+                       ($a & $c) ^
+                       ($b & $c);
+                $t2 = $this->_add($s0, $maj);
+
+                $s1 = $this->_rightRotate($e,  6) ^
+                      $this->_rightRotate($e, 11) ^
+                      $this->_rightRotate($e, 25);
+                $ch = ($e & $f) ^
+                      ($this->_not($e) & $g);
+                $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]);
+
+                $h = $g;
+                $g = $f;
+                $f = $e;
+                $e = $this->_add($d, $t1);
+                $d = $c;
+                $c = $b;
+                $b = $a;
+                $a = $this->_add($t1, $t2);
+            }
+
+            // Add this chunk's hash to result so far
+            $hash = array(
+                $this->_add($hash[0], $a),
+                $this->_add($hash[1], $b),
+                $this->_add($hash[2], $c),
+                $this->_add($hash[3], $d),
+                $this->_add($hash[4], $e),
+                $this->_add($hash[5], $f),
+                $this->_add($hash[6], $g),
+                $this->_add($hash[7], $h)
+            );
+        }
+
+        // Produce the final hash value (big-endian)
+        return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]);
+    }
+
+    /**
+     * Pure-PHP implementation of SHA384 and SHA512
+     *
+     * @access private
+     * @param String $text
+     */
+    function _sha512($m)
+    {
+        if (!class_exists('Math_BigInteger')) {
+            require_once('Math/BigInteger.php');
+        }
+
+        static $init384, $init512, $k;
+
+        if (!isset($k)) {
+            // Initialize variables
+            $init384 = array( // initial values for SHA384
+                'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', 
+                '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4'
+            );
+            $init512 = array( // initial values for SHA512
+                '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', 
+                '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179'
+            );
+
+            for ($i = 0; $i < 8; $i++) {
+                $init384[$i] = new Math_BigInteger($init384[$i], 16);
+                $init384[$i]->setPrecision(64);
+                $init512[$i] = new Math_BigInteger($init512[$i], 16);
+                $init512[$i]->setPrecision(64);
+            }
+
+            // Initialize table of round constants
+            // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409)
+            $k = array(
+                '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc',
+                '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118',
+                'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2',
+                '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694',
+                'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65',
+                '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5',
+                '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4',
+                'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70',
+                '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df',
+                '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b',
+                'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30',
+                'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8',
+                '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8',
+                '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3',
+                '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec',
+                '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b',
+                'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178',
+                '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b',
+                '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c',
+                '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817'
+            );
+
+            for ($i = 0; $i < 80; $i++) {
+                $k[$i] = new Math_BigInteger($k[$i], 16);
+            }
+        }
+
+        $hash = $this->l == 48 ? $init384 : $init512;
+
+        // Pre-processing
+        $length = strlen($m);
+        // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128
+        $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F));
+        $m[$length] = chr(0x80);
+        // we don't support hashing strings 512MB long
+        $m.= pack('N4', 0, 0, 0, $length << 3);
+
+        // Process the message in successive 1024-bit chunks
+        $chunks = str_split($m, 128);
+        foreach ($chunks as $chunk) {
+            $w = array();
+            for ($i = 0; $i < 16; $i++) {
+                $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256);
+                $temp->setPrecision(64);
+                $w[] = $temp;
+            }
+
+            // Extend the sixteen 32-bit words into eighty 32-bit words
+            for ($i = 16; $i < 80; $i++) {
+                $temp = array(
+                          $w[$i - 15]->bitwise_rightRotate(1),
+                          $w[$i - 15]->bitwise_rightRotate(8),
+                          $w[$i - 15]->bitwise_rightShift(7)
+                );
+                $s0 = $temp[0]->bitwise_xor($temp[1]);
+                $s0 = $s0->bitwise_xor($temp[2]);
+                $temp = array(
+                          $w[$i - 2]->bitwise_rightRotate(19),
+                          $w[$i - 2]->bitwise_rightRotate(61),
+                          $w[$i - 2]->bitwise_rightShift(6)
+                );
+                $s1 = $temp[0]->bitwise_xor($temp[1]);
+                $s1 = $s1->bitwise_xor($temp[2]);
+                $w[$i] = $w[$i - 16]->copy();
+                $w[$i] = $w[$i]->add($s0);
+                $w[$i] = $w[$i]->add($w[$i - 7]);
+                $w[$i] = $w[$i]->add($s1);
+            }
+
+            // Initialize hash value for this chunk
+            $a = $hash[0]->copy();
+            $b = $hash[1]->copy();
+            $c = $hash[2]->copy();
+            $d = $hash[3]->copy();
+            $e = $hash[4]->copy();
+            $f = $hash[5]->copy();
+            $g = $hash[6]->copy();
+            $h = $hash[7]->copy();
+
+            // Main loop
+            for ($i = 0; $i < 80; $i++) {
+                $temp = array(
+                    $a->bitwise_rightRotate(28),
+                    $a->bitwise_rightRotate(34),
+                    $a->bitwise_rightRotate(39)
+                );
+                $s0 = $temp[0]->bitwise_xor($temp[1]);
+                $s0 = $s0->bitwise_xor($temp[2]);
+                $temp = array(
+                    $a->bitwise_and($b),
+                    $a->bitwise_and($c),
+                    $b->bitwise_and($c)
+                );
+                $maj = $temp[0]->bitwise_xor($temp[1]);
+                $maj = $maj->bitwise_xor($temp[2]);
+                $t2 = $s0->add($maj);
+
+                $temp = array(
+                    $e->bitwise_rightRotate(14),
+                    $e->bitwise_rightRotate(18),
+                    $e->bitwise_rightRotate(41)
+                );
+                $s1 = $temp[0]->bitwise_xor($temp[1]);
+                $s1 = $s1->bitwise_xor($temp[2]);
+                $temp = array(
+                    $e->bitwise_and($f),
+                    $g->bitwise_and($e->bitwise_not())
+                );
+                $ch = $temp[0]->bitwise_xor($temp[1]);
+                $t1 = $h->add($s1);
+                $t1 = $t1->add($ch);
+                $t1 = $t1->add($k[$i]);
+                $t1 = $t1->add($w[$i]);
+
+                $h = $g->copy();
+                $g = $f->copy();
+                $f = $e->copy();
+                $e = $d->add($t1);
+                $d = $c->copy();
+                $c = $b->copy();
+                $b = $a->copy();
+                $a = $t1->add($t2);
+            }
+
+            // Add this chunk's hash to result so far
+            $hash = array(
+                $hash[0]->add($a),
+                $hash[1]->add($b),
+                $hash[2]->add($c),
+                $hash[3]->add($d),
+                $hash[4]->add($e),
+                $hash[5]->add($f),
+                $hash[6]->add($g),
+                $hash[7]->add($h)
+            );
+        }
+
+        // Produce the final hash value (big-endian)
+        // (Crypt_Hash::hash() trims the output for hashes but not for HMACs.  as such, we trim the output here)
+        $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() .
+                $hash[4]->toBytes() . $hash[5]->toBytes();
+        if ($this->l != 48) {
+            $temp.= $hash[6]->toBytes() . $hash[7]->toBytes();
+        }
+
+        return $temp;
+    }
+
+    /**
+     * Right Rotate
+     *
+     * @access private
+     * @param Integer $int
+     * @param Integer $amt
+     * @see _sha256()
+     * @return Integer
+     */
+    function _rightRotate($int, $amt)
+    {
+        $invamt = 32 - $amt;
+        $mask = (1 << $invamt) - 1;
+        return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask);
+    }
+
+    /**
+     * Right Shift
+     *
+     * @access private
+     * @param Integer $int
+     * @param Integer $amt
+     * @see _sha256()
+     * @return Integer
+     */
+    function _rightShift($int, $amt)
+    {
+        $mask = (1 << (32 - $amt)) - 1;
+        return ($int >> $amt) & $mask;
+    }
+
+    /**
+     * Not
+     *
+     * @access private
+     * @param Integer $int
+     * @see _sha256()
+     * @return Integer
+     */
+    function _not($int)
+    {
+        return ~$int & 0xFFFFFFFF;
+    }
+
+    /**
+     * Add
+     *
+     * _sha256() adds multiple unsigned 32-bit integers.  Since PHP doesn't support unsigned integers and since the
+     * possibility of overflow exists, care has to be taken.  Math_BigInteger() could be used but this should be faster.
+     *
+     * @param String $string
+     * @param optional Integer $index
+     * @return String
+     * @see _sha256()
+     * @access private
+     */
+    function _add()
+    {
+        static $mod;
+        if (!isset($mod)) {
+            $mod = pow(2, 32);
+        }
+
+        $result = 0;
+        $arguments = func_get_args();
+        foreach ($arguments as $argument) {
+            $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument;
+        }
+
+        return fmod($result, $mod);
+    }
+
+    /**
+     * String Shift
+     *
+     * Inspired by array_shift
+     *
+     * @param String $string
+     * @param optional Integer $index
+     * @return String
+     * @access private
+     */
+    function _string_shift(&$string, $index = 1)
+    {
+        $substr = substr($string, 0, $index);
+        $string = substr($string, $index);
+        return $substr;
+    }
+}
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RC4.php b/plugins/OStatus/extlib/Crypt/RC4.php
new file mode 100644 (file)
index 0000000..1e4d8b4
--- /dev/null
@@ -0,0 +1,493 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementation of RC4.
+ *
+ * Uses mcrypt, if available, and an internal implementation, otherwise.
+ *
+ * PHP versions 4 and 5
+ *
+ * Useful resources are as follows:
+ *
+ *  - {@link http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt ARCFOUR Algorithm}
+ *  - {@link http://en.wikipedia.org/wiki/RC4 - Wikipedia: RC4}
+ *
+ * RC4 is also known as ARCFOUR or ARC4.  The reason is elaborated upon at Wikipedia.  This class is named RC4 and not
+ * ARCFOUR or ARC4 because RC4 is how it is refered to in the SSH1 specification.
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/RC4.php');
+ *
+ *    $rc4 = new Crypt_RC4();
+ *
+ *    $rc4->setKey('abcdefgh');
+ *
+ *    $size = 10 * 1024;
+ *    $plaintext = '';
+ *    for ($i = 0; $i < $size; $i++) {
+ *        $plaintext.= 'a';
+ *    }
+ *
+ *    echo $rc4->decrypt($rc4->encrypt($plaintext));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_RC4
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: RC4.php,v 1.8 2009/06/09 04:00:38 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access private
+ * @see Crypt_RC4::Crypt_RC4()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_RC4_MODE_INTERNAL', 1);
+/**
+ * Toggles the mcrypt implementation
+ */
+define('CRYPT_RC4_MODE_MCRYPT', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_RC4::_crypt()
+ */
+define('CRYPT_RC4_ENCRYPT', 0);
+define('CRYPT_RC4_DECRYPT', 1);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of RC4.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_RC4
+ */
+class Crypt_RC4 {
+    /**
+     * The Key
+     *
+     * @see Crypt_RC4::setKey()
+     * @var String
+     * @access private
+     */
+    var $key = "\0";
+
+    /**
+     * The Key Stream for encryption
+     *
+     * If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object
+     *
+     * @see Crypt_RC4::setKey()
+     * @var Array
+     * @access private
+     */
+    var $encryptStream = false;
+
+    /**
+     * The Key Stream for decryption
+     *
+     * If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object
+     *
+     * @see Crypt_RC4::setKey()
+     * @var Array
+     * @access private
+     */
+    var $decryptStream = false;
+
+    /**
+     * The $i and $j indexes for encryption
+     *
+     * @see Crypt_RC4::_crypt()
+     * @var Integer
+     * @access private
+     */
+    var $encryptIndex = 0;
+
+    /**
+     * The $i and $j indexes for decryption
+     *
+     * @see Crypt_RC4::_crypt()
+     * @var Integer
+     * @access private
+     */
+    var $decryptIndex = 0;
+
+    /**
+     * MCrypt parameters
+     *
+     * @see Crypt_RC4::setMCrypt()
+     * @var Array
+     * @access private
+     */
+    var $mcrypt = array('', '');
+
+    /**
+     * The Encryption Algorithm
+     *
+     * Only used if CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT.  Only possible values are MCRYPT_RC4 or MCRYPT_ARCFOUR.
+     *
+     * @see Crypt_RC4::Crypt_RC4()
+     * @var Integer
+     * @access private
+     */
+    var $mode;
+
+    /**
+     * Default Constructor.
+     *
+     * Determines whether or not the mcrypt extension should be used.
+     *
+     * @param optional Integer $mode
+     * @return Crypt_RC4
+     * @access public
+     */
+    function Crypt_RC4()
+    {
+        if ( !defined('CRYPT_RC4_MODE') ) {
+            switch (true) {
+                case extension_loaded('mcrypt') && (defined('MCRYPT_ARCFOUR') || defined('MCRYPT_RC4')):
+                    // i'd check to see if rc4 was supported, by doing in_array('arcfour', mcrypt_list_algorithms('')),
+                    // but since that can be changed after the object has been created, there doesn't seem to be
+                    // a lot of point...
+                    define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_MCRYPT);
+                    break;
+                default:
+                    define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_INTERNAL);
+            }
+        }
+
+        switch ( CRYPT_RC4_MODE ) {
+            case CRYPT_RC4_MODE_MCRYPT:
+                switch (true) {
+                    case defined('MCRYPT_ARCFOUR'):
+                        $this->mode = MCRYPT_ARCFOUR;
+                        break;
+                    case defined('MCRYPT_RC4');
+                        $this->mode = MCRYPT_RC4;
+                }
+        }
+    }
+
+    /**
+     * Sets the key.
+     *
+     * Keys can be between 1 and 256 bytes long.  If they are longer then 256 bytes, the first 256 bytes will
+     * be used.  If no key is explicitly set, it'll be assumed to be a single null byte.
+     *
+     * @access public
+     * @param String $key
+     */
+    function setKey($key)
+    {
+        $this->key = $key;
+
+        if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
+            return;
+        }
+
+        $keyLength = strlen($key);
+        $keyStream = array();
+        for ($i = 0; $i < 256; $i++) {
+            $keyStream[$i] = $i;
+        }
+        $j = 0;
+        for ($i = 0; $i < 256; $i++) {
+            $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255;
+            $temp = $keyStream[$i];
+            $keyStream[$i] = $keyStream[$j];
+            $keyStream[$j] = $temp;
+        }
+
+        $this->encryptIndex = $this->decryptIndex = array(0, 0);
+        $this->encryptStream = $this->decryptStream = $keyStream;
+    }
+
+    /**
+     * Dummy function.
+     *
+     * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1].
+     * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before
+     * calling setKey().
+     *
+     * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way.  Since, in that protocol,
+     * the IV's are relatively easy to predict, an attack described by
+     * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir}
+     * can be used to quickly guess at the rest of the key.  The following links elaborate:
+     *
+     * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009}
+     * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack}
+     *
+     * @param String $iv
+     * @see Crypt_RC4::setKey()
+     * @access public
+     */
+    function setIV($iv)
+    {
+    }
+
+    /**
+     * Sets MCrypt parameters. (optional)
+     *
+     * If MCrypt is being used, empty strings will be used, unless otherwise specified.
+     *
+     * @link http://php.net/function.mcrypt-module-open#function.mcrypt-module-open
+     * @access public
+     * @param optional Integer $algorithm_directory
+     * @param optional Integer $mode_directory
+     */
+    function setMCrypt($algorithm_directory = '', $mode_directory = '')
+    {
+        if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
+            $this->mcrypt = array($algorithm_directory, $mode_directory);
+            $this->_closeMCrypt();
+        }
+    }
+
+    /**
+     * Encrypts a message.
+     *
+     * @see Crypt_RC4::_crypt()
+     * @access public
+     * @param String $plaintext
+     */
+    function encrypt($plaintext)
+    {
+        return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT);
+    }
+
+    /**
+     * Decrypts a message.
+     *
+     * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)).
+     * Atleast if the continuous buffer is disabled.
+     *
+     * @see Crypt_RC4::_crypt()
+     * @access public
+     * @param String $ciphertext
+     */
+    function decrypt($ciphertext)
+    {
+        return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT);
+    }
+
+    /**
+     * Encrypts or decrypts a message.
+     *
+     * @see Crypt_RC4::encrypt()
+     * @see Crypt_RC4::decrypt()
+     * @access private
+     * @param String $text
+     * @param Integer $mode
+     */
+    function _crypt($text, $mode)
+    {
+        if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
+            $keyStream = $mode == CRYPT_RC4_ENCRYPT ? 'encryptStream' : 'decryptStream';
+
+            if ($this->$keyStream === false) {
+                $this->$keyStream = mcrypt_module_open($this->mode, $this->mcrypt[0], MCRYPT_MODE_STREAM, $this->mcrypt[1]);
+                mcrypt_generic_init($this->$keyStream, $this->key, '');
+            } else if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->$keyStream, $this->key, '');
+            }
+            $newText = mcrypt_generic($this->$keyStream, $text);
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_deinit($this->$keyStream);
+            }
+
+            return $newText;
+        }
+
+        if ($this->encryptStream === false) {
+            $this->setKey($this->key);
+        }
+
+        switch ($mode) {
+            case CRYPT_RC4_ENCRYPT:
+                $keyStream = $this->encryptStream;
+                list($i, $j) = $this->encryptIndex;
+                break;
+            case CRYPT_RC4_DECRYPT:
+                $keyStream = $this->decryptStream;
+                list($i, $j) = $this->decryptIndex;
+        }
+
+        $newText = '';
+        for ($k = 0; $k < strlen($text); $k++) {
+            $i = ($i + 1) & 255;
+            $j = ($j + $keyStream[$i]) & 255;
+            $temp = $keyStream[$i];
+            $keyStream[$i] = $keyStream[$j];
+            $keyStream[$j] = $temp;
+            $temp = $keyStream[($keyStream[$i] + $keyStream[$j]) & 255];
+            $newText.= chr(ord($text[$k]) ^ $temp);
+        }
+
+        if ($this->continuousBuffer) {
+            switch ($mode) {
+                case CRYPT_RC4_ENCRYPT:
+                    $this->encryptStream = $keyStream;
+                    $this->encryptIndex = array($i, $j);
+                    break;
+                case CRYPT_RC4_DECRYPT:
+                    $this->decryptStream = $keyStream;
+                    $this->decryptIndex = array($i, $j);
+            }
+        }
+
+        return $newText;
+    }
+
+    /**
+     * Treat consecutive "packets" as if they are a continuous buffer.
+     *
+     * Say you have a 16-byte plaintext $plaintext.  Using the default behavior, the two following code snippets
+     * will yield different outputs:
+     *
+     * <code>
+     *    echo $rc4->encrypt(substr($plaintext, 0, 8));
+     *    echo $rc4->encrypt(substr($plaintext, 8, 8));
+     * </code>
+     * <code>
+     *    echo $rc4->encrypt($plaintext);
+     * </code>
+     *
+     * The solution is to enable the continuous buffer.  Although this will resolve the above discrepancy, it creates
+     * another, as demonstrated with the following:
+     *
+     * <code>
+     *    $rc4->encrypt(substr($plaintext, 0, 8));
+     *    echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     * <code>
+     *    echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     *
+     * With the continuous buffer disabled, these would yield the same output.  With it enabled, they yield different
+     * outputs.  The reason is due to the fact that the initialization vector's change after every encryption /
+     * decryption round when the continuous buffer is enabled.  When it's disabled, they remain constant.
+     *
+     * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
+     * encryption / decryption round, whereas otherwise, it'd remain constant.  For this reason, it's recommended that
+     * continuous buffers not be used.  They do offer better security and are, in fact, sometimes required (SSH uses them),
+     * however, they are also less intuitive and more likely to cause you problems.
+     *
+     * @see Crypt_RC4::disableContinuousBuffer()
+     * @access public
+     */
+    function enableContinuousBuffer()
+    {
+        $this->continuousBuffer = true;
+    }
+
+    /**
+     * Treat consecutive packets as if they are a discontinuous buffer.
+     *
+     * The default behavior.
+     *
+     * @see Crypt_RC4::enableContinuousBuffer()
+     * @access public
+     */
+    function disableContinuousBuffer()
+    {
+        if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_INTERNAL ) {
+            $this->encryptIndex = $this->decryptIndex = array(0, 0);
+            $this->setKey($this->key);
+        }
+
+        $this->continuousBuffer = false;
+    }
+
+    /**
+     * Dummy function.
+     *
+     * Since RC4 is a stream cipher and not a block cipher, no padding is necessary.  The only reason this function is
+     * included is so that you can switch between a block cipher and a stream cipher transparently.
+     *
+     * @see Crypt_RC4::disablePadding()
+     * @access public
+     */
+    function enablePadding()
+    {
+    }
+
+    /**
+     * Dummy function.
+     *
+     * @see Crypt_RC4::enablePadding()
+     * @access public
+     */
+    function disablePadding()
+    {
+    }
+
+    /**
+     * Class destructor.
+     *
+     * Will be called, automatically, if you're using PHP5.  If you're using PHP4, call it yourself.  Only really
+     * needs to be called if mcrypt is being used.
+     *
+     * @access public
+     */
+    function __destruct()
+    {
+        if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
+            $this->_closeMCrypt();
+        }
+    }
+
+    /**
+     * Properly close the MCrypt objects.
+     *
+     * @access prviate
+     */
+    function _closeMCrypt()
+    {
+        if ( $this->encryptStream !== false ) {
+            if ( $this->continuousBuffer ) {
+                mcrypt_generic_deinit($this->encryptStream);
+            }
+
+            mcrypt_module_close($this->encryptStream);
+
+            $this->encryptStream = false;
+        }
+
+        if ( $this->decryptStream !== false ) {
+            if ( $this->continuousBuffer ) {
+                mcrypt_generic_deinit($this->decryptStream);
+            }
+
+            mcrypt_module_close($this->decryptStream);
+
+            $this->decryptStream = false;
+        }
+    }
+}
\ No newline at end of file
index 16dfa54d480bab46041aa197e3c6cca972d5899c..f0a75962c810f74e7b86d499146e1b14c2759d33 100644 (file)
 <?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
 /**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
+ * Pure-PHP PKCS#1 (v2.1) compliant implementation of RSA.
  *
  * PHP versions 4 and 5
  *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
+ * Here's an example of how to encrypt and decrypt text with this library:
+ * <code>
+ * <?php
+ *    include('Crypt/RSA.php');
+ *
+ *    $rsa = new Crypt_RSA();
+ *    extract($rsa->createKey());
+ *
+ *    $plaintext = 'terrafrost';
+ *
+ *    $rsa->loadKey($privatekey);
+ *    $ciphertext = $rsa->encrypt($plaintext);
+ *
+ *    $rsa->loadKey($publickey);
+ *    echo $rsa->decrypt($ciphertext);
+ * ?>
+ * </code>
+ *
+ * Here's an example of how to create signatures and verify signatures with this library:
+ * <code>
+ * <?php
+ *    include('Crypt/RSA.php');
+ *
+ *    $rsa = new Crypt_RSA();
+ *    extract($rsa->createKey());
+ *
+ *    $plaintext = 'terrafrost';
  *
- * @category   Encryption
+ *    $rsa->loadKey($privatekey);
+ *    $signature = $rsa->sign($plaintext);
+ *
+ *    $rsa->loadKey($publickey);
+ *    echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified';
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
  * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    1.2.0b
- * @link       http://pear.php.net/package/Crypt_RSA
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMIX Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: RSA.php,v 1.14 2010/03/01 17:28:19 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
  */
 
 /**
- * RSA error handling facilities
+ * Include Math_BigInteger
  */
-require_once 'Crypt/RSA/ErrorHandler.php';
+require_once('Math/BigInteger.php');
 
 /**
- * loader for math wrappers
+ * Include Crypt_Random
  */
-require_once 'Crypt/RSA/MathLoader.php';
+require_once('Crypt/Random.php');
 
 /**
- * helper class for mange single key
+ * Include Crypt_Hash
  */
-require_once 'Crypt/RSA/Key.php';
+require_once('Crypt/Hash.php');
 
-/**
- * helper class for manage key pair
+/**#@+
+ * @access public
+ * @see Crypt_RSA::encrypt()
+ * @see Crypt_RSA::decrypt()
  */
-require_once 'Crypt/RSA/KeyPair.php';
-
 /**
- * Crypt_RSA class, derived from Crypt_RSA_ErrorHandler
+ * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding}
+ * (OAEP) for encryption / decryption.
  *
- * Provides the following functions:
- *  - setParams($params) - sets parameters of current object
- *  - encrypt($plain_data, $key = null) - encrypts data
- *  - decrypt($enc_data, $key = null) - decrypts data
- *  - createSign($doc, $private_key = null) - signs document by private key
- *  - validateSign($doc, $signature, $public_key = null) - validates signature of document
+ * Uses sha1 by default.
  *
- * Example usage:
- *     // creating an error handler
- *     $error_handler = create_function('$obj', 'echo "error: ", $obj->getMessage(), "\n"');
+ * @see Crypt_RSA::setHash()
+ * @see Crypt_RSA::setMGFHash()
+ */
+define('CRYPT_RSA_ENCRYPTION_OAEP',  1);
+/**
+ * Use PKCS#1 padding.
  *
- *     // 1024-bit key pair generation
- *     $key_pair = new Crypt_RSA_KeyPair(1024);
+ * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards
+ * compatability with protocols (like SSH-1) written before OAEP's introduction.
+ */
+define('CRYPT_RSA_ENCRYPTION_PKCS1', 2);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see Crypt_RSA::sign()
+ * @see Crypt_RSA::verify()
+ * @see Crypt_RSA::setHash()
+ */
+/**
+ * Use the Probabilistic Signature Scheme for signing
  *
- *     // check consistence of Crypt_RSA_KeyPair object
- *     $error_handler($key_pair);
+ * Uses sha1 by default.
  *
- *     // creating Crypt_RSA object
- *     $rsa_obj = new Crypt_RSA;
+ * @see Crypt_RSA::setSaltLength()
+ * @see Crypt_RSA::setMGFHash()
+ */
+define('CRYPT_RSA_SIGNATURE_PSS',  1);
+/**
+ * Use the PKCS#1 scheme by default.
  *
- *     // check consistence of Crypt_RSA object
- *     $error_handler($rsa_obj);
+ * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards
+ * compatability with protocols (like SSH-2) written before PSS's introduction.
+ */
+define('CRYPT_RSA_SIGNATURE_PKCS1', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_RSA::createKey()
+ */
+/**
+ * ASN1 Integer
+ */
+define('CRYPT_RSA_ASN1_INTEGER',   2);
+/**
+ * ASN1 Sequence (with the constucted bit set)
+ */
+define('CRYPT_RSA_ASN1_SEQUENCE', 48);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_RSA::Crypt_RSA()
+ */
+/**
+ * To use the pure-PHP implementation
+ */
+define('CRYPT_RSA_MODE_INTERNAL', 1);
+/**
+ * To use the OpenSSL library
  *
- *     // set error handler on Crypt_RSA object ( see Crypt/RSA/ErrorHandler.php for details )
- *     $rsa_obj->setErrorHandler($error_handler);
+ * (if enabled; otherwise, the internal implementation will be used)
+ */
+define('CRYPT_RSA_MODE_OPENSSL', 2);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see Crypt_RSA::createKey()
+ * @see Crypt_RSA::setPrivateKeyFormat()
+ */
+/**
+ * PKCS#1 formatted private key
  *
- *     // encryption (usually using public key)
- *     $enc_data = $rsa_obj->encrypt($plain_data, $key_pair->getPublicKey());
+ * Used by OpenSSH
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see Crypt_RSA::createKey()
+ * @see Crypt_RSA::setPublicKeyFormat()
+ */
+/**
+ * Raw public key
  *
- *     // decryption (usually using private key)
- *     $plain_data = $rsa_obj->decrypt($enc_data, $key_pair->getPrivateKey());
+ * An array containing two Math_BigInteger objects.
  *
- *     // signing
- *     $signature = $rsa_obj->createSign($document, $key_pair->getPrivateKey());
+ * The exponent can be indexed with any of the following:
  *
- *     // signature checking
- *     $is_valid = $rsa_obj->validateSign($document, $signature, $key_pair->getPublicKey());
+ * 0, e, exponent, publicExponent
  *
- *     // signing many documents by one private key
- *     $rsa_obj = new Crypt_RSA(array('private_key' => $key_pair->getPrivateKey()));
- *     // check consistence of Crypt_RSA object
- *     $error_handler($rsa_obj);
- *     // set error handler ( see Crypt/RSA/ErrorHandler.php for details )
- *     $rsa_obj->setErrorHandler($error_handler);
- *     // sign many documents
- *     $sign_1 = $rsa_obj->sign($doc_1);
- *     $sign_2 = $rsa_obj->sign($doc_2);
- *     //...
- *     $sign_n = $rsa_obj->sign($doc_n);
+ * The modulus can be indexed with any of the following:
  *
- *     // changing default hash function, which is used for sign
- *     // creating/validation
- *     $rsa_obj->setParams(array('hash_func' => 'md5'));
+ * 1, n, modulo, modulus
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 1);
+/**
+ * PKCS#1 formatted public key
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 2);
+/**
+ * OpenSSH formatted public key
  *
- *     // using factory() method instead of constructor (it returns PEAR_Error object on failure)
- *     $rsa_obj = &Crypt_RSA::factory();
- *     if (PEAR::isError($rsa_obj)) {
- *         echo "error: ", $rsa_obj->getMessage(), "\n";
- *     }
+ * Place in $HOME/.ssh/authorized_keys
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 3);
+/**#@-*/
+
+/**
+ * Pure-PHP PKCS#1 compliant implementation of RSA.
  *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @link       http://pear.php.net/package/Crypt_RSA
- * @version    @package_version@
- * @access     public
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_RSA
  */
-class Crypt_RSA extends Crypt_RSA_ErrorHandler
-{
+class Crypt_RSA {
     /**
-     * Reference to math wrapper, which is used to
-     * manipulate large integers in RSA algorithm.
+     * Precomputed Zero
      *
-     * @var object of Crypt_RSA_Math_* class
+     * @var Array
      * @access private
      */
-    var $_math_obj;
+    var $zero;
 
     /**
-     * key for encryption, which is used by encrypt() method
+     * Precomputed One
      *
-     * @var object of Crypt_RSA_KEY class
+     * @var Array
      * @access private
      */
-    var $_enc_key;
+    var $one;
 
     /**
-     * key for decryption, which is used by decrypt() method
+     * Private Key Format
      *
-     * @var object of Crypt_RSA_KEY class
+     * @var Integer
      * @access private
      */
-    var $_dec_key;
+    var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1;
+
+    /**
+     * Public Key Format
+     *
+     * @var Integer
+     * @access public
+     */
+    var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS1;
 
     /**
-     * public key, which is used by validateSign() method
+     * Modulus (ie. n)
      *
-     * @var object of Crypt_RSA_KEY class
+     * @var Math_BigInteger
      * @access private
      */
-    var $_public_key;
+    var $modulus;
 
     /**
-     * private key, which is used by createSign() method
+     * Modulus length
      *
-     * @var object of Crypt_RSA_KEY class
+     * @var Math_BigInteger
      * @access private
      */
-    var $_private_key;
+    var $k;
 
     /**
-     * name of hash function, which is used by validateSign()
-     * and createSign() methods. Default hash function is SHA-1
+     * Exponent (ie. e or d)
      *
-     * @var string
+     * @var Math_BigInteger
      * @access private
      */
-    var $_hash_func = 'sha1';
+    var $exponent;
 
     /**
-     * Crypt_RSA constructor.
+     * Primes for Chinese Remainder Theorem (ie. p and q)
      *
-     * @param array $params
-     *        Optional associative array of parameters, such as:
-     *        enc_key, dec_key, private_key, public_key, hash_func.
-     *        See setParams() method for more detailed description of
-     *        these parameters.
-     * @param string $wrapper_name
-     *        Name of math wrapper, which will be used to
-     *        perform different operations with big integers.
-     *        See contents of Crypt/RSA/Math folder for examples of wrappers.
-     *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     * @param string $error_handler   name of error handler function
+     * @var Array
+     * @access private
+     */
+    var $primes;
+
+    /**
+     * Exponents for Chinese Remainder Theorem (ie. dP and dQ)
      *
-     * @access public
+     * @var Array
+     * @access private
      */
-    function Crypt_RSA($params = null, $wrapper_name = 'default', $error_handler = '')
-    {
-        // set error handler
-        $this->setErrorHandler($error_handler);
-        // try to load math wrapper
-        $obj = &Crypt_RSA_MathLoader::loadWrapper($wrapper_name);
-        if ($this->isError($obj)) {
-            // error during loading of math wrapper
-            // Crypt_RSA object is partially constructed.
-            $this->pushError($obj);
-            return;
-        }
-        $this->_math_obj = &$obj;
+    var $exponents;
 
-        if (!is_null($params)) {
-            if (!$this->setParams($params)) {
-                // error in Crypt_RSA::setParams() function
-                return;
-            }
-        }
-    }
+    /**
+     * Coefficients for Chinese Remainder Theorem (ie. qInv)
+     *
+     * @var Array
+     * @access private
+     */
+    var $coefficients;
+
+    /**
+     * Hash name
+     *
+     * @var String
+     * @access private
+     */
+    var $hashName;
+
+    /**
+     * Hash function
+     *
+     * @var Crypt_Hash
+     * @access private
+     */
+    var $hash;
+
+    /**
+     * Length of hash function output
+     *
+     * @var Integer
+     * @access private
+     */
+    var $hLen;
+
+    /**
+     * Length of salt
+     *
+     * @var Integer
+     * @access private
+     */
+    var $sLen;
+
+    /**
+     * Hash function for the Mask Generation Function
+     *
+     * @var Crypt_Hash
+     * @access private
+     */
+    var $mgfHash;
 
     /**
-     * Crypt_RSA factory.
+     * Length of MGF hash function output
      *
-     * @param array $params
-     *        Optional associative array of parameters, such as:
-     *        enc_key, dec_key, private_key, public_key, hash_func.
-     *        See setParams() method for more detailed description of
-     *        these parameters.
-     * @param string $wrapper_name
-     *        Name of math wrapper, which will be used to
-     *        perform different operations with big integers.
-     *        See contents of Crypt/RSA/Math folder for examples of wrappers.
-     *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     * @param string $error_handler   name of error handler function
+     * @var Integer
+     * @access private
+     */
+    var $mgfHLen;
+
+    /**
+     * Encryption mode
+     *
+     * @var Integer
+     * @access private
+     */
+    var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP;
+
+    /**
+     * Signature mode
+     *
+     * @var Integer
+     * @access private
+     */
+    var $signatureMode = CRYPT_RSA_SIGNATURE_PSS;
+
+    /**
+     * Public Exponent
+     *
+     * @var Mixed
+     * @access private
+     */
+    var $publicExponent = false;
+
+    /**
+     * Password
+     *
+     * @var String
+     * @access private
+     */
+    var $password = '';
+
+    /**
+     * The constructor
      *
-     * @return object  new Crypt_RSA object on success or PEAR_Error object on failure
+     * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself.  The reason
+     * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully.  openssl_pkey_new(), in particular, requires
+     * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late.
+     *
+     * @return Crypt_RSA
      * @access public
      */
-    function &factory($params = null, $wrapper_name = 'default', $error_handler = '')
+    function Crypt_RSA()
     {
-        $obj = &new Crypt_RSA($params, $wrapper_name, $error_handler);
-        if ($obj->isError()) {
-            // error during creating a new object. Retrurn PEAR_Error object
-            return $obj->getLastError();
+        if ( !defined('CRYPT_RSA_MODE') ) {
+            switch (true) {
+                //case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>='):
+                //    define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL);
+                //    break;
+                default:
+                    define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
+            }
         }
-        // object created successfully. Return it
-        return $obj;
+
+        $this->zero = new Math_BigInteger();
+        $this->one = new Math_BigInteger(1);
+
+        $this->hash = new Crypt_Hash('sha1');
+        $this->hLen = $this->hash->getLength();
+        $this->hashName = 'sha1';
+        $this->mgfHash = new Crypt_Hash('sha1');
+        $this->mgfHLen = $this->mgfHash->getLength();
     }
 
     /**
-     * Accepts any combination of available parameters as associative array:
-     *     enc_key - encryption key for encrypt() method
-     *     dec_key - decryption key for decrypt() method
-     *     public_key - key for validateSign() method
-     *     private_key - key for createSign() method
-     *     hash_func - name of hash function, which will be used to create and validate sign
+     * Create public / private key pair
      *
-     * @param array $params
-     *        associative array of permitted parameters (see above)
+     * Returns an array with the following three elements:
+     *  - 'privatekey': The private key.
+     *  - 'publickey':  The public key.
+     *  - 'partialkey': A partially computed key (if the execution time exceeded $timeout).
+     *                  Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing.
      *
-     * @return bool   true on success or false on error
      * @access public
+     * @param optional Integer $bits
+     * @param optional Integer $timeout
+     * @param optional Math_BigInteger $p
      */
-    function setParams($params)
+    function createKey($bits = 1024, $timeout = false, $partial = array())
     {
-        if (!is_array($params)) {
-            $this->pushError('parameters must be passed to function as associative array', CRYPT_RSA_ERROR_WRONG_PARAMS);
-            return false;
-        }
+        if ( CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL ) {
+            $rsa = openssl_pkey_new(array('private_key_bits' => $bits));
+            openssl_pkey_export($rsa, $privatekey);
+            $publickey = openssl_pkey_get_details($rsa);
+            $publickey = $publickey['key'];
 
-        if (isset($params['enc_key'])) {
-            if (Crypt_RSA_Key::isValid($params['enc_key'])) {
-                $this->_enc_key = $params['enc_key'];
-            }
-            else {
-                $this->pushError('wrong encryption key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-                return false;
+            if ($this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_PKCS1) {
+                $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1)));
+                $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1)));
             }
+
+            return array(
+                'privatekey' => $privatekey,
+                'publickey' => $publickey,
+                'partialkey' => false
+            );
         }
-        if (isset($params['dec_key'])) {
-            if (Crypt_RSA_Key::isValid($params['dec_key'])) {
-                $this->_dec_key = $params['dec_key'];
-            }
-            else {
-                $this->pushError('wrong decryption key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-                return false;
+
+        static $e;
+        if (!isset($e)) {
+            if (!defined('CRYPT_RSA_EXPONENT')) {
+                // http://en.wikipedia.org/wiki/65537_%28number%29
+                define('CRYPT_RSA_EXPONENT', '65537');
             }
-        }
-        if (isset($params['private_key'])) {
-            if (Crypt_RSA_Key::isValid($params['private_key'])) {
-                if ($params['private_key']->getKeyType() != 'private') {
-                    $this->pushError('private key must have "private" attribute', CRYPT_RSA_ERROR_WRONG_KEY_TYPE);
-                    return false;
-                }
-                $this->_private_key = $params['private_key'];
+            if (!defined('CRYPT_RSA_COMMENT')) {
+                define('CRYPT_RSA_COMMENT', 'phpseclib-generated-key');
             }
-            else {
-                $this->pushError('wrong private key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-                return false;
+            // per <http://cseweb.ucsd.edu/~hovav/dist/survey.pdf#page=5>, this number ought not result in primes smaller
+            // than 256 bits.
+            if (!defined('CRYPT_RSA_SMALLEST_PRIME')) {
+                define('CRYPT_RSA_SMALLEST_PRIME', 4096);
             }
+
+            $e = new Math_BigInteger(CRYPT_RSA_EXPONENT);
         }
-        if (isset($params['public_key'])) {
-            if (Crypt_RSA_Key::isValid($params['public_key'])) {
-                if ($params['public_key']->getKeyType() != 'public') {
-                    $this->pushError('public key must have "public" attribute', CRYPT_RSA_ERROR_WRONG_KEY_TYPE);
-                    return false;
-                }
-                $this->_public_key = $params['public_key'];
-            }
-            else {
-                $this->pushError('wrong public key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-                return false;
-            }
+
+        extract($this->_generateMinMax($bits));
+        $absoluteMin = $min;
+        $temp = $bits >> 1;
+        if ($temp > CRYPT_RSA_SMALLEST_PRIME) {
+            $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME);
+            $temp = CRYPT_RSA_SMALLEST_PRIME;
+        } else {
+            $num_primes = 2;
         }
-        if (isset($params['hash_func'])) {
-            if (!function_exists($params['hash_func'])) {
-                $this->pushError('cannot find hash function with name [' . $params['hash_func'] . ']', CRYPT_RSA_ERROR_WRONG_HASH_FUNC);
-                return false;
-            }
-            $this->_hash_func = $params['hash_func'];
+        extract($this->_generateMinMax($temp + $bits % $temp));
+        $finalMax = $max;
+        extract($this->_generateMinMax($temp));
+
+        $generator = new Math_BigInteger();
+        $generator->setRandomGenerator('crypt_random');
+
+        $n = $this->one->copy();
+        if (!empty($partial)) {
+            extract(unserialize($partial));
+        } else {
+            $exponents = $coefficients = $primes = array();
+            $lcm = array(
+                'top' => $this->one->copy(),
+                'bottom' => false
+            );
         }
-        return true; // all ok
+
+        $start = time();
+        $i0 = count($primes) + 1;
+
+        do {
+            for ($i = $i0; $i <= $num_primes; $i++) {
+                if ($timeout !== false) {
+                    $timeout-= time() - $start;
+                    $start = time();
+                    if ($timeout <= 0) {
+                        return serialize(array(
+                            'privatekey' => '',
+                            'publickey'  => '',
+                            'partialkey' => array(
+                                'primes' => $primes,
+                                'coefficients' => $coefficients,
+                                'lcm' => $lcm,
+                                'exponents' => $exponents
+                            )
+                        ));
+                    }
+                }
+
+                if ($i == $num_primes) {
+                    list($min, $temp) = $absoluteMin->divide($n);
+                    if (!$temp->equals($this->zero)) {
+                        $min = $min->add($this->one); // ie. ceil()
+                    }
+                    $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout);
+                } else {
+                    $primes[$i] = $generator->randomPrime($min, $max, $timeout);
+                }
+
+                if ($primes[$i] === false) { // if we've reached the timeout
+                    return array(
+                        'privatekey' => '',
+                        'publickey'  => '',
+                        'partialkey' => empty($primes) ? '' : serialize(array(
+                            'primes' => array_slice($primes, 0, $i - 1),
+                            'coefficients' => $coefficients,
+                            'lcm' => $lcm,
+                            'exponents' => $exponents
+                        ))
+                    );
+                }
+
+                // the first coefficient is calculated differently from the rest
+                // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1])
+                if ($i > 2) {
+                    $coefficients[$i] = $n->modInverse($primes[$i]);
+                }
+
+                $n = $n->multiply($primes[$i]);
+
+                $temp = $primes[$i]->subtract($this->one);
+
+                // textbook RSA implementations use Euler's totient function instead of the least common multiple.
+                // see http://en.wikipedia.org/wiki/Euler%27s_totient_function
+                $lcm['top'] = $lcm['top']->multiply($temp);
+                $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp);
+
+                $exponents[$i] = $e->modInverse($temp);
+            }
+
+            list($lcm) = $lcm['top']->divide($lcm['bottom']);
+            $gcd = $lcm->gcd($e);
+            $i0 = 1;
+        } while (!$gcd->equals($this->one));
+
+        $d = $e->modInverse($lcm);
+
+        $coefficients[2] = $primes[2]->modInverse($primes[1]);
+
+        // from <http://tools.ietf.org/html/rfc3447#appendix-A.1.2>:
+        // RSAPrivateKey ::= SEQUENCE {
+        //     version           Version,
+        //     modulus           INTEGER,  -- n
+        //     publicExponent    INTEGER,  -- e
+        //     privateExponent   INTEGER,  -- d
+        //     prime1            INTEGER,  -- p
+        //     prime2            INTEGER,  -- q
+        //     exponent1         INTEGER,  -- d mod (p-1)
+        //     exponent2         INTEGER,  -- d mod (q-1)
+        //     coefficient       INTEGER,  -- (inverse of q) mod p
+        //     otherPrimeInfos   OtherPrimeInfos OPTIONAL
+        // }
+
+        return array(
+            'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients),
+            'publickey'  => $this->_convertPublicKey($n, $e),
+            'partialkey' => false
+        );
     }
 
     /**
-     * Ecnrypts $plain_data by the key $this->_enc_key or $key.
+     * Convert a private key to the appropriate format.
      *
-     * @param string $plain_data  data, which must be encrypted
-     * @param object $key         encryption key (object of Crypt_RSA_Key class)
-     * @return mixed
-     *         encrypted data as string on success or false on error
-     *
-     * @access public
+     * @access private
+     * @see setPrivateKeyFormat()
+     * @param String $RSAPrivateKey
+     * @return String
      */
-    function encrypt($plain_data, $key = null)
+    function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients)
     {
-        $enc_data = $this->encryptBinary($plain_data, $key);
-        if ($enc_data !== false) {
-            return base64_encode($enc_data);
+        $num_primes = count($primes);
+        $raw = array(
+            'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi
+            'modulus' => $n->toBytes(true),
+            'publicExponent' => $e->toBytes(true),
+            'privateExponent' => $d->toBytes(true),
+            'prime1' => $primes[1]->toBytes(true),
+            'prime2' => $primes[2]->toBytes(true),
+            'exponent1' => $exponents[1]->toBytes(true),
+            'exponent2' => $exponents[2]->toBytes(true),
+            'coefficient' => $coefficients[2]->toBytes(true)
+        );
+
+        // if the format in question does not support multi-prime rsa and multi-prime rsa was used,
+        // call _convertPublicKey() instead.
+        switch ($this->privateKeyFormat) {
+            default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1
+                $components = array();
+                foreach ($raw as $name => $value) {
+                    $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value);
+                }
+
+                $RSAPrivateKey = implode('', $components);
+
+                if ($num_primes > 2) {
+                    $OtherPrimeInfos = '';
+                    for ($i = 3; $i <= $num_primes; $i++) {
+                        // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
+                        //
+                        // OtherPrimeInfo ::= SEQUENCE {
+                        //     prime             INTEGER,  -- ri
+                        //     exponent          INTEGER,  -- di
+                        //     coefficient       INTEGER   -- ti
+                        // }
+                        $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true));
+                        $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true));
+                        $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true));
+                        $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo);
+                    }
+                    $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos);
+                }
+
+                $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
+
+                if (!empty($this->password)) {
+                    $iv = $this->_random(8);
+                    $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key
+                    $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8);
+                    if (!class_exists('Crypt_TripleDES')) {
+                        require_once('Crypt/TripleDES.php');
+                    }
+                    $des = new Crypt_TripleDES();
+                    $des->setKey($symkey);
+                    $des->setIV($iv);
+                    $iv = strtoupper(bin2hex($iv));
+                    $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
+                                     "Proc-Type: 4,ENCRYPTED\r\n" .
+                                     "DEK-Info: DES-EDE3-CBC,$iv\r\n" .
+                                     "\r\n" .
+                                     chunk_split(base64_encode($des->encrypt($RSAPrivateKey))) .
+                                     '-----END RSA PRIVATE KEY-----';
+                } else {
+                    $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
+                                     chunk_split(base64_encode($RSAPrivateKey)) .
+                                     '-----END RSA PRIVATE KEY-----';
+                }
+
+                return $RSAPrivateKey;
         }
-        // error during encripting data
-        return false;
     }
 
     /**
-     * Ecnrypts $plain_data by the key $this->_enc_key or $key.
+     * Convert a public key to the appropriate format
      *
-     * @param string $plain_data  data, which must be encrypted
-     * @param object $key         encryption key (object of Crypt_RSA_Key class)
-     * @return mixed
-     *         encrypted data as binary string on success or false on error
-     *
-     * @access public
+     * @access private
+     * @see setPublicKeyFormat()
+     * @param String $RSAPrivateKey
+     * @return String
      */
-    function encryptBinary($plain_data, $key = null)
+    function _convertPublicKey($n, $e)
     {
-        if (is_null($key)) {
-            // use current encryption key
-            $key = $this->_enc_key;
-        }
-        else if (!Crypt_RSA_Key::isValid($key)) {
-            $this->pushError('invalid encryption key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-            return false;
-        }
+        $modulus = $n->toBytes(true);
+        $publicExponent = $e->toBytes(true);
 
-        // append tail \x01 to plain data. It needs for correctly decrypting of data
-        $plain_data .= "\x01";
+        switch ($this->publicKeyFormat) {
+            case CRYPT_RSA_PUBLIC_FORMAT_RAW:
+                return array('e' => $e->copy(), 'n' => $n->copy());
+            case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
+                // from <http://tools.ietf.org/html/rfc4253#page-15>:
+                // string    "ssh-rsa"
+                // mpint     e
+                // mpint     n
+                $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
+                $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . CRYPT_RSA_COMMENT;
 
-        $plain_data = $this->_math_obj->bin2int($plain_data);
-        $exp = $this->_math_obj->bin2int($key->getExponent());
-        $modulus = $this->_math_obj->bin2int($key->getModulus());
+                return $RSAPublicKey;
+            default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1
+                // from <http://tools.ietf.org/html/rfc3447#appendix-A.1.1>:
+                // RSAPublicKey ::= SEQUENCE {
+                //     modulus           INTEGER,  -- n
+                //     publicExponent    INTEGER   -- e
+                // }
+                $components = array(
+                    'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus),
+                    'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent)
+                );
 
-        // divide plain data into chunks
-        $data_len = $this->_math_obj->bitLen($plain_data);
-        $chunk_len = $key->getKeyLength() - 1;
-        $block_len = (int) ceil($chunk_len / 8);
-        $curr_pos = 0;
-        $enc_data = '';
-        while ($curr_pos < $data_len) {
-            $tmp = $this->_math_obj->subint($plain_data, $curr_pos, $chunk_len);
-            $enc_data .= str_pad(
-                $this->_math_obj->int2bin($this->_math_obj->powmod($tmp, $exp, $modulus)),
-                $block_len,
-                "\0"
-            );
-            $curr_pos += $chunk_len;
+                $RSAPublicKey = pack('Ca*a*a*',
+                    CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
+                    $components['modulus'], $components['publicExponent']
+                );
+
+                $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
+                                 chunk_split(base64_encode($RSAPublicKey)) .
+                                 '-----END PUBLIC KEY-----';
+
+                return $RSAPublicKey;
         }
-        return $enc_data;
     }
 
     /**
-     * Decrypts $enc_data by the key $this->_dec_key or $key.
-     *
-     * @param string $enc_data  encrypted data as string
-     * @param object $key       decryption key (object of RSA_Crypt_Key class)
-     * @return mixed
-     *         decrypted data as string on success or false on error
+     * Break a public or private key down into its constituant components
      *
-     * @access public
+     * @access private
+     * @see _convertPublicKey()
+     * @see _convertPrivateKey()
+     * @param String $key
+     * @param Integer $type
+     * @return Array
      */
-    function decrypt($enc_data, $key = null)
+    function _parseKey($key, $type)
     {
-        $enc_data = base64_decode($enc_data);
-        return $this->decryptBinary($enc_data, $key);
+        switch ($type) {
+            case CRYPT_RSA_PUBLIC_FORMAT_RAW:
+                if (!is_array($key)) {
+                    return false;
+                }
+                $components = array();
+                switch (true) {
+                    case isset($key['e']):
+                        $components['publicExponent'] = $key['e']->copy();
+                        break;
+                    case isset($key['exponent']):
+                        $components['publicExponent'] = $key['exponent']->copy();
+                        break;
+                    case isset($key['publicExponent']):
+                        $components['publicExponent'] = $key['publicExponent']->copy();
+                        break;
+                    case isset($key[0]):
+                        $components['publicExponent'] = $key[0]->copy();
+                }
+                switch (true) {
+                    case isset($key['n']):
+                        $components['modulus'] = $key['n']->copy();
+                        break;
+                    case isset($key['modulo']):
+                        $components['modulus'] = $key['modulo']->copy();
+                        break;
+                    case isset($key['modulus']):
+                        $components['modulus'] = $key['modulus']->copy();
+                        break;
+                    case isset($key[1]):
+                        $components['modulus'] = $key[1]->copy();
+                }
+                return $components;
+            case CRYPT_RSA_PRIVATE_FORMAT_PKCS1:
+            case CRYPT_RSA_PUBLIC_FORMAT_PKCS1:
+                /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is
+                   "outside the scope" of PKCS#1.  PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to
+                   protect private keys, however, that's not what OpenSSL* does.  OpenSSL protects private keys by adding
+                   two new "fields" to the key - DEK-Info and Proc-Type.  These fields are discussed here:
+
+                   http://tools.ietf.org/html/rfc1421#section-4.6.1.1
+                   http://tools.ietf.org/html/rfc1421#section-4.6.1.3
+
+                   DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell.
+                   DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation
+                   function.  As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's
+                   own implementation.  ie. the implementation *is* the standard and any bugs that may exist in that 
+                   implementation are part of the standard, as well.
+
+                   * OpenSSL is the de facto standard.  It's utilized by OpenSSH and other projects */
+                if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) {
+                    $iv = pack('H*', trim($matches[2]));
+                    $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key
+                    $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8);
+                    $ciphertext = preg_replace('#.+(\r|\n|\r\n)\1|[\r\n]|-.+-#s', '', $key);
+                    $ciphertext = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $ciphertext) ? base64_decode($ciphertext) : false;
+                    if ($ciphertext === false) {
+                        $ciphertext = $key;
+                    }
+                    switch ($matches[1]) {
+                        case 'DES-EDE3-CBC':
+                            if (!class_exists('Crypt_TripleDES')) {
+                                require_once('Crypt/TripleDES.php');
+                            }
+                            $crypto = new Crypt_TripleDES();
+                            break;
+                        case 'DES-CBC':
+                            if (!class_exists('Crypt_DES')) {
+                                require_once('Crypt/DES.php');
+                            }
+                            $crypto = new Crypt_DES();
+                            break;
+                        default:
+                            return false;
+                    }
+                    $crypto->setKey($symkey);
+                    $crypto->setIV($iv);
+                    $decoded = $crypto->decrypt($ciphertext);
+                } else {
+                    $decoded = preg_replace('#-.+-|[\r\n]#', '', $key);
+                    $decoded = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $decoded) ? base64_decode($decoded) : false;
+                }
+
+                if ($decoded !== false) {
+                    $key = $decoded;
+                }
+
+                $components = array();
+
+                if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+                    return false;
+                }
+                if ($this->_decodeLength($key) != strlen($key)) {
+                    return false;
+                }
+
+                $tag = ord($this->_string_shift($key));
+                if ($tag == CRYPT_RSA_ASN1_SEQUENCE) {
+                    /* intended for keys for which OpenSSL's asn1parse returns the following:
+
+                        0:d=0  hl=4 l= 290 cons: SEQUENCE
+                        4:d=1  hl=2 l=  13 cons:  SEQUENCE
+                        6:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
+                       17:d=2  hl=2 l=   0 prim:   NULL
+                       19:d=1  hl=4 l= 271 prim:  BIT STRING */
+                    $this->_string_shift($key, $this->_decodeLength($key));
+                    $this->_string_shift($key); // skip over the BIT STRING tag
+                    $this->_decodeLength($key); // skip over the BIT STRING length
+                    // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of
+                    //  unused bits in teh final subsequent octet. The number shall be in the range zero to seven."
+                    //  -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2)
+                    $this->_string_shift($key);
+                    if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+                        return false;
+                    }
+                    if ($this->_decodeLength($key) != strlen($key)) {
+                        return false;
+                    }
+                    $tag = ord($this->_string_shift($key));
+                }
+                if ($tag != CRYPT_RSA_ASN1_INTEGER) {
+                    return false;
+                }
+
+                $length = $this->_decodeLength($key);
+                $temp = $this->_string_shift($key, $length);
+                if (strlen($temp) != 1 || ord($temp) > 2) {
+                    $components['modulus'] = new Math_BigInteger($temp, -256);
+                    $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER
+                    $length = $this->_decodeLength($key);
+                    $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+
+                    return $components;
+                }
+                if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) {
+                    return false;
+                }
+                $length = $this->_decodeLength($key);
+                $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), -256));
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), -256));
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                $this->_string_shift($key);
+                $length = $this->_decodeLength($key);
+                $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), -256));
+
+                if (!empty($key)) {
+                    if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+                        return false;
+                    }
+                    $this->_decodeLength($key);
+                    while (!empty($key)) {
+                        if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+                            return false;
+                        }
+                        $this->_decodeLength($key);
+                        $key = substr($key, 1);
+                        $length = $this->_decodeLength($key);
+                        $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                        $this->_string_shift($key);
+                        $length = $this->_decodeLength($key);
+                        $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                        $this->_string_shift($key);
+                        $length = $this->_decodeLength($key);
+                        $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                    }
+                }
+
+                return $components;
+            case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
+                $key = base64_decode(preg_replace('#^ssh-rsa | .+$#', '', $key));
+                if ($key === false) {
+                    return false;
+                }
+
+                $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa";
+
+                extract(unpack('Nlength', $this->_string_shift($key, 4)));
+                $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256);
+                extract(unpack('Nlength', $this->_string_shift($key, 4)));
+                $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256);
+
+                if ($cleanup && strlen($key)) {
+                    extract(unpack('Nlength', $this->_string_shift($key, 4)));
+                    return array(
+                        'modulus' => new Math_BigInteger($this->_string_shift($key, $length), -256),
+                        'publicExponent' => $modulus
+                    );
+                } else {
+                    return array(
+                        'modulus' => $modulus,
+                        'publicExponent' => $publicExponent
+                    );
+                }
+        }
     }
 
     /**
-     * Decrypts $enc_data by the key $this->_dec_key or $key.
+     * Loads a public or private key
      *
-     * @param string $enc_data  encrypted data as binary string
-     * @param object $key       decryption key (object of RSA_Crypt_Key class)
-     * @return mixed
-     *         decrypted data as string on success or false on error
+     * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
      *
      * @access public
+     * @param String $key
+     * @param Integer $type optional
      */
-    function decryptBinary($enc_data, $key = null)
+    function loadKey($key, $type = CRYPT_RSA_PRIVATE_FORMAT_PKCS1)
     {
-        if (is_null($key)) {
-            // use current decryption key
-            $key = $this->_dec_key;
-        }
-        else if (!Crypt_RSA_Key::isValid($key)) {
-            $this->pushError('invalid decryption key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
+        $components = $this->_parseKey($key, $type);
+        if ($components === false) {
             return false;
         }
 
-        $exp = $this->_math_obj->bin2int($key->getExponent());
-        $modulus = $this->_math_obj->bin2int($key->getModulus());
-
-        $data_len = strlen($enc_data);
-        $chunk_len = $key->getKeyLength() - 1;
-        $block_len = (int) ceil($chunk_len / 8);
-        $curr_pos = 0;
-        $bit_pos = 0;
-        $plain_data = $this->_math_obj->bin2int("\0");
-        while ($curr_pos < $data_len) {
-            $tmp = $this->_math_obj->bin2int(substr($enc_data, $curr_pos, $block_len));
-            $tmp = $this->_math_obj->powmod($tmp, $exp, $modulus);
-            $plain_data = $this->_math_obj->bitOr($plain_data, $tmp, $bit_pos);
-            $bit_pos += $chunk_len;
-            $curr_pos += $block_len;
+        $this->modulus = $components['modulus'];
+        $this->k = strlen($this->modulus->toBytes());
+        $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent'];
+        if (isset($components['primes'])) {
+            $this->primes = $components['primes'];
+            $this->exponents = $components['exponents'];
+            $this->coefficients = $components['coefficients'];
+            $this->publicExponent = $components['publicExponent'];
+        } else {
+            $this->primes = array();
+            $this->exponents = array();
+            $this->coefficients = array();
+            $this->publicExponent = false;
         }
-        $result = $this->_math_obj->int2bin($plain_data);
 
-        // delete tail, containing of \x01
-        $tail = ord($result{strlen($result) - 1});
-        if ($tail != 1) {
-            $this->pushError("Error tail of decrypted text = {$tail}. Expected 1", CRYPT_RSA_ERROR_WRONG_TAIL);
-            return false;
-        }
-        return substr($result, 0, -1);
+        return true;
     }
 
     /**
-     * Creates sign for document $document, using $this->_private_key or $private_key
-     * as private key and $this->_hash_func or $hash_func as hash function.
+     * Sets the password
      *
-     * @param string $document     document, which must be signed
-     * @param object $private_key  private key (object of Crypt_RSA_Key type)
-     * @param string $hash_func    name of hash function, which will be used during signing
-     * @return mixed
-     *         signature of $document as string on success or false on error
+     * Private keys can be encrypted with a password.  To unset the password, pass in the empty string or false.
+     * Or rather, pass in $password such that empty($password) is true.
      *
+     * @see createKey()
+     * @see loadKey()
      * @access public
+     * @param String $password
      */
-    function createSign($document, $private_key = null, $hash_func = null)
+    function setPassword($password)
     {
-        // check private key
-        if (is_null($private_key)) {
-            $private_key = $this->_private_key;
-        }
-        else if (!Crypt_RSA_Key::isValid($private_key)) {
-            $this->pushError('invalid private key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-            return false;
-        }
-        if ($private_key->getKeyType() != 'private') {
-            $this->pushError('signing key must be private', CRYPT_RSA_ERROR_NEED_PRV_KEY);
-            return false;
-        }
+        $this->password = $password;
+    }
 
-        // check hash_func
-        if (is_null($hash_func)) {
-            $hash_func = $this->_hash_func;
-        }
-        if (!function_exists($hash_func)) {
-            $this->pushError("cannot find hash function with name [$hash_func]", CRYPT_RSA_ERROR_WRONG_HASH_FUNC);
+    /**
+     * Defines the public key
+     *
+     * Some private key formats define the public exponent and some don't.  Those that don't define it are problematic when
+     * used in certain contexts.  For example, in SSH-2, RSA authentication works by sending the public key along with a
+     * message signed by the private key to the server.  The SSH-2 server looks the public key up in an index of public keys
+     * and if it's present then proceeds to verify the signature.  Problem is, if your private key doesn't include the public
+     * exponent this won't work unless you manually add the public exponent.
+     *
+     * Do note that when a new key is loaded the index will be cleared.
+     *
+     * Returns true on success, false on failure
+     *
+     * @see getPublicKey()
+     * @access public
+     * @param String $key
+     * @param Integer $type optional
+     * @return Boolean
+     */
+    function setPublicKey($key, $type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
+    {
+        $components = $this->_parseKey($key, $type);
+        if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) {
             return false;
         }
-
-        return $this->encrypt($hash_func($document), $private_key);
+        $this->publicExponent = $components['publicExponent'];
     }
 
     /**
-     * Validates $signature for document $document with public key $this->_public_key
-     * or $public_key and hash function $this->_hash_func or $hash_func.
+     * Returns the public key
      *
-     * @param string $document    document, signature of which must be validated
-     * @param string $signature   signature, which must be validated
-     * @param object $public_key  public key (object of Crypt_RSA_Key class)
-     * @param string $hash_func   hash function, which will be used during validating signature
-     * @return mixed
-     *         true, if signature of document is valid
-     *         false, if signature of document is invalid
-     *         null on error
+     * The public key is only returned under two circumstances - if the private key had the public key embedded within it
+     * or if the public key was set via setPublicKey().  If the currently loaded key is supposed to be the public key this
+     * function won't return it since this library, for the most part, doesn't distinguish between public and private keys.
      *
+     * @see getPublicKey()
      * @access public
+     * @param String $key
+     * @param Integer $type optional
      */
-    function validateSign($document, $signature, $public_key = null, $hash_func = null)
+    function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
     {
-        // check public key
-        if (is_null($public_key)) {
-            $public_key = $this->_public_key;
-        }
-        else if (!Crypt_RSA_Key::isValid($public_key)) {
-            $this->pushError('invalid public key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
-            return null;
-        }
-        if ($public_key->getKeyType() != 'public') {
-            $this->pushError('validating key must be public', CRYPT_RSA_ERROR_NEED_PUB_KEY);
-            return null;
-        }
-
-        // check hash_func
-        if (is_null($hash_func)) {
-            $hash_func = $this->_hash_func;
-        }
-        if (!function_exists($hash_func)) {
-            $this->pushError("cannot find hash function with name [$hash_func]", CRYPT_RSA_ERROR_WRONG_HASH_FUNC);
-            return null;
+        if (empty($this->modulus) || empty($this->publicExponent)) {
+            return false;
         }
 
-        return $hash_func($document) == $this->decrypt($signature, $public_key);
+        $oldFormat = $this->publicKeyFormat;
+        $this->publicKeyFormat = $type;
+        $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent);
+        $this->publicKeyFormat = $oldFormat;
+        return $temp;
     }
-}
 
-?>
\ No newline at end of file
+    /**
+     * Generates the smallest and largest numbers requiring $bits bits
+     *
+     * @access private
+     * @param Integer $bits
+     * @return Array
+     */
+    function _generateMinMax($bits)
+    {
+        $bytes = $bits >> 3;
+        $min = str_repeat(chr(0), $bytes);
+        $max = str_repeat(chr(0xFF), $bytes);
+        $msb = $bits & 7;
+        if ($msb) {
+            $min = chr(1 << ($msb - 1)) . $min;
+            $max = chr((1 << $msb) - 1) . $max;
+        } else {
+            $min[0] = chr(0x80);
+        }
+
+        return array(
+            'min' => new Math_BigInteger($min, 256),
+            'max' => new Math_BigInteger($max, 256)
+        );
+    }
+
+    /**
+     * DER-decode the length
+     *
+     * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4.  See
+     * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 § 8.1.3} for more information.
+     *
+     * @access private
+     * @param String $string
+     * @return Integer
+     */
+    function _decodeLength(&$string)
+    {
+        $length = ord($this->_string_shift($string));
+        if ( $length & 0x80 ) { // definite length, long form
+            $length&= 0x7F;
+            $temp = $this->_string_shift($string, $length);
+            list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4));
+        }
+        return $length;
+    }
+
+    /**
+     * DER-encode the length
+     *
+     * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4.  See
+     * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 § 8.1.3} for more information.
+     *
+     * @access private
+     * @param Integer $length
+     * @return String
+     */
+    function _encodeLength($length)
+    {
+        if ($length <= 0x7F) {
+            return chr($length);
+        }
+
+        $temp = ltrim(pack('N', $length), chr(0));
+        return pack('Ca*', 0x80 | strlen($temp), $temp);
+    }
+
+    /**
+     * String Shift
+     *
+     * Inspired by array_shift
+     *
+     * @param String $string
+     * @param optional Integer $index
+     * @return String
+     * @access private
+     */
+    function _string_shift(&$string, $index = 1)
+    {
+        $substr = substr($string, 0, $index);
+        $string = substr($string, $index);
+        return $substr;
+    }
+
+    /**
+     * Determines the private key format
+     *
+     * @see createKey()
+     * @access public
+     * @param Integer $format
+     */
+    function setPrivateKeyFormat($format)
+    {
+        $this->privateKeyFormat = $format;
+    }
+
+    /**
+     * Determines the public key format
+     *
+     * @see createKey()
+     * @access public
+     * @param Integer $format
+     */
+    function setPublicKeyFormat($format)
+    {
+        $this->publicKeyFormat = $format;
+    }
+
+    /**
+     * Determines which hashing function should be used
+     *
+     * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and
+     * decryption.  If $hash isn't supported, sha1 is used.
+     *
+     * @access public
+     * @param String $hash
+     */
+    function setHash($hash)
+    {
+        // Crypt_Hash supports algorithms that PKCS#1 doesn't support.  md5-96 and sha1-96, for example.
+        switch ($hash) {
+            case 'md2':
+            case 'md5':
+            case 'sha1':
+            case 'sha256':
+            case 'sha384':
+            case 'sha512':
+                $this->hash = new Crypt_Hash($hash);
+                $this->hashName = $hash;
+                break;
+            default:
+                $this->hash = new Crypt_Hash('sha1');
+                $this->hashName = 'sha1';
+        }
+        $this->hLen = $this->hash->getLength();
+    }
+
+    /**
+     * Determines which hashing function should be used for the mask generation function
+     *
+     * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's
+     * best if Hash and MGFHash are set to the same thing this is not a requirement.
+     *
+     * @access public
+     * @param String $hash
+     */
+    function setMGFHash($hash)
+    {
+        // Crypt_Hash supports algorithms that PKCS#1 doesn't support.  md5-96 and sha1-96, for example.
+        switch ($hash) {
+            case 'md2':
+            case 'md5':
+            case 'sha1':
+            case 'sha256':
+            case 'sha384':
+            case 'sha512':
+                $this->mgfHash = new Crypt_Hash($hash);
+                break;
+            default:
+                $this->mgfHash = new Crypt_Hash('sha1');
+        }
+        $this->mgfHLen = $this->mgfHash->getLength();
+    }
+
+    /**
+     * Determines the salt length
+     *
+     * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}:
+     *
+     *    Typical salt lengths in octets are hLen (the length of the output
+     *    of the hash function Hash) and 0.
+     *
+     * @access public
+     * @param Integer $format
+     */
+    function setSaltLength($sLen)
+    {
+        $this->sLen = $sLen;
+    }
+
+    /**
+     * Generates a random string x bytes long
+     *
+     * @access public
+     * @param Integer $bytes
+     * @param optional Integer $nonzero
+     * @return String
+     */
+    function _random($bytes, $nonzero = false)
+    {
+        $temp = '';
+        if ($nonzero) {
+            for ($i = 0; $i < $bytes; $i++) {
+                $temp.= chr(crypt_random(1, 255));
+            }
+        } else {
+            $ints = ($bytes + 1) >> 2;
+            for ($i = 0; $i < $ints; $i++) {
+                $temp.= pack('N', crypt_random());
+            }
+            $temp = substr($temp, 0, $bytes);
+        }
+        return $temp;
+    }
+
+    /**
+     * Integer-to-Octet-String primitive
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}.
+     *
+     * @access private
+     * @param Math_BigInteger $x
+     * @param Integer $xLen
+     * @return String
+     */
+    function _i2osp($x, $xLen)
+    {
+        $x = $x->toBytes();
+        if (strlen($x) > $xLen) {
+            user_error('Integer too large', E_USER_NOTICE);
+            return false;
+        }
+        return str_pad($x, $xLen, chr(0), STR_PAD_LEFT);
+    }
+
+    /**
+     * Octet-String-to-Integer primitive
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}.
+     *
+     * @access private
+     * @param String $x
+     * @return Math_BigInteger
+     */
+    function _os2ip($x)
+    {
+        return new Math_BigInteger($x, 256);
+    }
+
+    /**
+     * Exponentiate with or without Chinese Remainder Theorem
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}.
+     *
+     * @access private
+     * @param Math_BigInteger $x
+     * @return Math_BigInteger
+     */
+    function _exponentiate($x)
+    {
+        if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) {
+            return $x->modPow($this->exponent, $this->modulus);
+        }
+
+        $num_primes = count($this->primes);
+
+        if (defined('CRYPT_RSA_DISABLE_BLINDING')) {
+            $m_i = array(
+                1 => $x->modPow($this->exponents[1], $this->primes[1]),
+                2 => $x->modPow($this->exponents[2], $this->primes[2])
+            );
+            $h = $m_i[1]->subtract($m_i[2]);
+            $h = $h->multiply($this->coefficients[2]);
+            list(, $h) = $h->divide($this->primes[1]);
+            $m = $m_i[2]->add($h->multiply($this->primes[2]));
+
+            $r = $this->primes[1];
+            for ($i = 3; $i <= $num_primes; $i++) {
+                $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]);
+
+                $r = $r->multiply($this->primes[$i - 1]);
+
+                $h = $m_i->subtract($m);
+                $h = $h->multiply($this->coefficients[$i]);
+                list(, $h) = $h->divide($this->primes[$i]);
+
+                $m = $m->add($r->multiply($h));
+            }
+        } else {
+            $smallest = $this->primes[1];
+            for ($i = 2; $i <= $num_primes; $i++) {
+                if ($smallest->compare($this->primes[$i]) > 0) {
+                    $smallest = $this->primes[$i];
+                }
+            }
+
+            $one = new Math_BigInteger(1);
+            $one->setRandomGenerator('crypt_random');
+
+            $r = $one->random($one, $smallest->subtract($one));
+
+            $m_i = array(
+                1 => $this->_blind($x, $r, 1),
+                2 => $this->_blind($x, $r, 2)
+            );
+            $h = $m_i[1]->subtract($m_i[2]);
+            $h = $h->multiply($this->coefficients[2]);
+            list(, $h) = $h->divide($this->primes[1]);
+            $m = $m_i[2]->add($h->multiply($this->primes[2]));
+
+            $r = $this->primes[1];
+            for ($i = 3; $i <= $num_primes; $i++) {
+                $m_i = $this->_blind($x, $r, $i);
+
+                $r = $r->multiply($this->primes[$i - 1]);
+
+                $h = $m_i->subtract($m);
+                $h = $h->multiply($this->coefficients[$i]);
+                list(, $h) = $h->divide($this->primes[$i]);
+
+                $m = $m->add($r->multiply($h));
+            }
+        }
+
+        return $m;
+    }
+
+    /**
+     * Performs RSA Blinding
+     *
+     * Protects against timing attacks by employing RSA Blinding.
+     * Returns $x->modPow($this->exponents[$i], $this->primes[$i])
+     *
+     * @access private
+     * @param Math_BigInteger $x
+     * @param Math_BigInteger $r
+     * @param Integer $i
+     * @return Math_BigInteger
+     */
+    function _blind($x, $r, $i)
+    {
+        $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i]));
+
+        $x = $x->modPow($this->exponents[$i], $this->primes[$i]);
+
+        $r = $r->modInverse($this->primes[$i]);
+        $x = $x->multiply($r);
+        list(, $x) = $x->divide($this->primes[$i]);
+
+        return $x;
+    }
+
+    /**
+     * RSAEP
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}.
+     *
+     * @access private
+     * @param Math_BigInteger $m
+     * @return Math_BigInteger
+     */
+    function _rsaep($m)
+    {
+        if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
+            user_error('Message representative out of range', E_USER_NOTICE);
+            return false;
+        }
+        return $this->_exponentiate($m);
+    }
+
+    /**
+     * RSADP
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}.
+     *
+     * @access private
+     * @param Math_BigInteger $c
+     * @return Math_BigInteger
+     */
+    function _rsadp($c)
+    {
+        if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) {
+            user_error('Ciphertext representative out of range', E_USER_NOTICE);
+            return false;
+        }
+        return $this->_exponentiate($c);
+    }
+
+    /**
+     * RSASP1
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}.
+     *
+     * @access private
+     * @param Math_BigInteger $m
+     * @return Math_BigInteger
+     */
+    function _rsasp1($m)
+    {
+        if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
+            user_error('Message representative out of range', E_USER_NOTICE);
+            return false;
+        }
+        return $this->_exponentiate($m);
+    }
+
+    /**
+     * RSAVP1
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}.
+     *
+     * @access private
+     * @param Math_BigInteger $s
+     * @return Math_BigInteger
+     */
+    function _rsavp1($s)
+    {
+        if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) {
+            user_error('Signature representative out of range', E_USER_NOTICE);
+            return false;
+        }
+        return $this->_exponentiate($s);
+    }
+
+    /**
+     * MGF1
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}.
+     *
+     * @access private
+     * @param String $mgfSeed
+     * @param Integer $mgfLen
+     * @return String
+     */
+    function _mgf1($mgfSeed, $maskLen)
+    {
+        // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output.
+
+        $t = '';
+        $count = ceil($maskLen / $this->mgfHLen);
+        for ($i = 0; $i < $count; $i++) {
+            $c = pack('N', $i);
+            $t.= $this->mgfHash->hash($mgfSeed . $c);
+        }
+
+        return substr($t, 0, $maskLen);
+    }
+
+    /**
+     * RSAES-OAEP-ENCRYPT
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and
+     * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}.
+     *
+     * @access private
+     * @param String $m
+     * @param String $l
+     * @return String
+     */
+    function _rsaes_oaep_encrypt($m, $l = '')
+    {
+        $mLen = strlen($m);
+
+        // Length checking
+
+        // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+        // be output.
+
+        if ($mLen > $this->k - 2 * $this->hLen - 2) {
+            user_error('Message too long', E_USER_NOTICE);
+            return false;
+        }
+
+        // EME-OAEP encoding
+
+        $lHash = $this->hash->hash($l);
+        $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2);
+        $db = $lHash . $ps . chr(1) . $m;
+        $seed = $this->_random($this->hLen);
+        $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
+        $maskedDB = $db ^ $dbMask;
+        $seedMask = $this->_mgf1($maskedDB, $this->hLen);
+        $maskedSeed = $seed ^ $seedMask;
+        $em = chr(0) . $maskedSeed . $maskedDB;
+
+        // RSA encryption
+
+        $m = $this->_os2ip($em);
+        $c = $this->_rsaep($m);
+        $c = $this->_i2osp($c, $this->k);
+
+        // Output the ciphertext C
+
+        return $c;
+    }
+
+    /**
+     * RSAES-OAEP-DECRYPT
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}.  The fact that the error
+     * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2:
+     * 
+     *    Note.  Care must be taken to ensure that an opponent cannot
+     *    distinguish the different error conditions in Step 3.g, whether by
+     *    error message or timing, or, more generally, learn partial
+     *    information about the encoded message EM.  Otherwise an opponent may
+     *    be able to obtain useful information about the decryption of the
+     *    ciphertext C, leading to a chosen-ciphertext attack such as the one
+     *    observed by Manger [36].
+     *
+     * As for $l...  to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}:
+     *
+     *    Both the encryption and the decryption operations of RSAES-OAEP take
+     *    the value of a label L as input.  In this version of PKCS #1, L is
+     *    the empty string; other uses of the label are outside the scope of
+     *    this document.
+     *
+     * @access private
+     * @param String $c
+     * @param String $l
+     * @return String
+     */
+    function _rsaes_oaep_decrypt($c, $l = '')
+    {
+        // Length checking
+
+        // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+        // be output.
+
+        if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+
+        // RSA decryption
+
+        $c = $this->_os2ip($c);
+        $m = $this->_rsadp($c);
+        if ($m === false) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+        $em = $this->_i2osp($m, $this->k);
+
+        // EME-OAEP decoding
+
+        $lHash = $this->hash->hash($l);
+        $y = ord($em[0]);
+        $maskedSeed = substr($em, 1, $this->hLen);
+        $maskedDB = substr($em, $this->hLen + 1);
+        $seedMask = $this->_mgf1($maskedDB, $this->hLen);
+        $seed = $maskedSeed ^ $seedMask;
+        $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
+        $db = $maskedDB ^ $dbMask;
+        $lHash2 = substr($db, 0, $this->hLen);
+        $m = substr($db, $this->hLen);
+        if ($lHash != $lHash2) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+        $m = ltrim($m, chr(0));
+        if (ord($m[0]) != 1) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+
+        // Output the message M
+
+        return substr($m, 1);
+    }
+
+    /**
+     * RSAES-PKCS1-V1_5-ENCRYPT
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}.
+     *
+     * @access private
+     * @param String $m
+     * @return String
+     */
+    function _rsaes_pkcs1_v1_5_encrypt($m)
+    {
+        $mLen = strlen($m);
+
+        // Length checking
+
+        if ($mLen > $this->k - 11) {
+            user_error('Message too long', E_USER_NOTICE);
+            return false;
+        }
+
+        // EME-PKCS1-v1_5 encoding
+
+        $ps = $this->_random($this->k - $mLen - 3, true);
+        $em = chr(0) . chr(2) . $ps . chr(0) . $m;
+
+        // RSA encryption
+        $m = $this->_os2ip($em);
+        $c = $this->_rsaep($m);
+        $c = $this->_i2osp($c, $this->k);
+
+        // Output the ciphertext C
+
+        return $c;
+    }
+
+    /**
+     * RSAES-PKCS1-V1_5-DECRYPT
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}.
+     *
+     * @access private
+     * @param String $c
+     * @return String
+     */
+    function _rsaes_pkcs1_v1_5_decrypt($c)
+    {
+        // Length checking
+
+        if (strlen($c) != $this->k) { // or if k < 11
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+
+        // RSA decryption
+
+        $c = $this->_os2ip($c);
+        $m = $this->_rsadp($c);
+        if ($m === false) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+        $em = $this->_i2osp($m, $this->k);
+
+        // EME-PKCS1-v1_5 decoding
+
+        if (ord($em[0]) != 0 || ord($em[1]) != 2) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+
+        $ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
+        $m = substr($em, strlen($ps) + 3);
+
+        if (strlen($ps) < 8) {
+            user_error('Decryption error', E_USER_NOTICE);
+            return false;
+        }
+
+        // Output M
+
+        return $m;
+    }
+
+    /**
+     * EMSA-PSS-ENCODE
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}.
+     *
+     * @access private
+     * @param String $m
+     * @param Integer $emBits
+     */
+    function _emsa_pss_encode($m, $emBits)
+    {
+        // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+        // be output.
+
+        $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8)
+        $sLen = $this->sLen == false ? $this->hLen : $this->sLen;
+
+        $mHash = $this->hash->hash($m);
+        if ($emLen < $this->hLen + $sLen + 2) {
+            user_error('Encoding error', E_USER_NOTICE);
+            return false;
+        }
+
+        $salt = $this->_random($sLen);
+        $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
+        $h = $this->hash->hash($m2);
+        $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2);
+        $db = $ps . chr(1) . $salt;
+        $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
+        $maskedDB = $db ^ $dbMask;
+        $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0];
+        $em = $maskedDB . $h . chr(0xBC);
+
+        return $em;
+    }
+
+    /**
+     * EMSA-PSS-VERIFY
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}.
+     *
+     * @access private
+     * @param String $m
+     * @param String $em
+     * @param Integer $emBits
+     * @return String
+     */
+    function _emsa_pss_verify($m, $em, $emBits)
+    {
+        // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+        // be output.
+
+        $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8);
+        $sLen = $this->sLen == false ? $this->hLen : $this->sLen;
+
+        $mHash = $this->hash->hash($m);
+        if ($emLen < $this->hLen + $sLen + 2) {
+            return false;
+        }
+
+        if ($em[strlen($em) - 1] != chr(0xBC)) {
+            return false;
+        }
+
+        $maskedDB = substr($em, 0, $em - $this->hLen - 1);
+        $h = substr($em, $em - $this->hLen - 1, $this->hLen);
+        $temp = chr(0xFF << ($emBits & 7));
+        if ((~$maskedDB[0] & $temp) != $temp) {
+            return false;
+        }
+        $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
+        $db = $maskedDB ^ $dbMask;
+        $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0];
+        $temp = $emLen - $this->hLen - $sLen - 2;
+        if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) {
+            return false;
+        }
+        $salt = substr($db, $temp + 1); // should be $sLen long
+        $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
+        $h2 = $this->hash->hash($m2);
+        return $h == $h2;
+    }
+
+    /**
+     * RSASSA-PSS-SIGN
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}.
+     *
+     * @access private
+     * @param String $m
+     * @return String
+     */
+    function _rsassa_pss_sign($m)
+    {
+        // EMSA-PSS encoding
+
+        $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1);
+
+        // RSA signature
+
+        $m = $this->_os2ip($em);
+        $s = $this->_rsasp1($m);
+        $s = $this->_i2osp($s, $this->k);
+
+        // Output the signature S
+
+        return $s;
+    }
+
+    /**
+     * RSASSA-PSS-VERIFY
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}.
+     *
+     * @access private
+     * @param String $m
+     * @param String $s
+     * @return String
+     */
+    function _rsassa_pss_verify($m, $s)
+    {
+        // Length checking
+
+        if (strlen($s) != $this->k) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+
+        // RSA verification
+
+        $modBits = 8 * $this->k;
+
+        $s2 = $this->_os2ip($s);
+        $m2 = $this->_rsavp1($s2);
+        if ($m2 === false) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+        $em = $this->_i2osp($m2, $modBits >> 3);
+        if ($em === false) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+
+        // EMSA-PSS verification
+
+        return $this->_emsa_pss_verify($m, $em, $modBits - 1);
+    }
+
+    /**
+     * EMSA-PKCS1-V1_5-ENCODE
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}.
+     *
+     * @access private
+     * @param String $m
+     * @param Integer $emLen
+     * @return String
+     */
+    function _emsa_pkcs1_v1_5_encode($m, $emLen)
+    {
+        $h = $this->hash->hash($m);
+        if ($h === false) {
+            return false;
+        }
+
+        // see http://tools.ietf.org/html/rfc3447#page-43
+        switch ($this->hashName) {
+            case 'md2':
+                $t = pack('H*', '3020300c06082a864886f70d020205000410');
+                break;
+            case 'md5':
+                $t = pack('H*', '3020300c06082a864886f70d020505000410');
+                break;
+            case 'sha1':
+                $t = pack('H*', '3021300906052b0e03021a05000414');
+                break;
+            case 'sha256':
+                $t = pack('H*', '3031300d060960864801650304020105000420');
+                break;
+            case 'sha384':
+                $t = pack('H*', '3041300d060960864801650304020205000430');
+                break;
+            case 'sha512':
+                $t = pack('H*', '3051300d060960864801650304020305000440');
+        }
+        $t.= $h;
+        $tLen = strlen($t);
+
+        if ($emLen < $tLen + 11) {
+            user_error('Intended encoded message length too short', E_USER_NOTICE);
+            return false;
+        }
+
+        $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
+
+        $em = "\0\1$ps\0$t";
+
+        return $em;
+    }
+
+    /**
+     * RSASSA-PKCS1-V1_5-SIGN
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}.
+     *
+     * @access private
+     * @param String $m
+     * @return String
+     */
+    function _rsassa_pkcs1_v1_5_sign($m)
+    {
+        // EMSA-PKCS1-v1_5 encoding
+
+        $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
+        if ($em === false) {
+            user_error('RSA modulus too short', E_USER_NOTICE);
+            return false;
+        }
+
+        // RSA signature
+
+        $m = $this->_os2ip($em);
+        $s = $this->_rsasp1($m);
+        $s = $this->_i2osp($s, $this->k);
+
+        // Output the signature S
+
+        return $s;
+    }
+
+    /**
+     * RSASSA-PKCS1-V1_5-VERIFY
+     *
+     * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}.
+     *
+     * @access private
+     * @param String $m
+     * @return String
+     */
+    function _rsassa_pkcs1_v1_5_verify($m, $s)
+    {
+        // Length checking
+
+        if (strlen($s) != $this->k) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+
+        // RSA verification
+
+        $s = $this->_os2ip($s);
+        $m2 = $this->_rsavp1($s);
+        if ($m2 === false) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+        $em = $this->_i2osp($m2, $this->k);
+        if ($em === false) {
+            user_error('Invalid signature', E_USER_NOTICE);
+            return false;
+        }
+
+        // EMSA-PKCS1-v1_5 encoding
+
+        $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
+        if ($em2 === false) {
+            user_error('RSA modulus too short', E_USER_NOTICE);
+            return false;
+        }
+
+        // Compare
+
+        return $em === $em2;
+    }
+
+    /**
+     * Set Encryption Mode
+     *
+     * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1.
+     *
+     * @access public
+     * @param Integer $mode
+     */
+    function setEncryptionMode($mode)
+    {
+        $this->encryptionMode = $mode;
+    }
+
+    /**
+     * Set Signature Mode
+     *
+     * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1
+     *
+     * @access public
+     * @param Integer $mode
+     */
+    function setSignatureMode($mode)
+    {
+        $this->signatureMode = $mode;
+    }
+
+    /**
+     * Encryption
+     *
+     * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be.
+     * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will
+     * be concatenated together.
+     *
+     * @see decrypt()
+     * @access public
+     * @param String $plaintext
+     * @return String
+     */
+    function encrypt($plaintext)
+    {
+        switch ($this->encryptionMode) {
+            case CRYPT_RSA_ENCRYPTION_PKCS1:
+                $length = $this->k - 11;
+                if ($length <= 0) {
+                    return false;
+                }
+
+                $plaintext = str_split($plaintext, $length);
+                $ciphertext = '';
+                foreach ($plaintext as $m) {
+                    $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m);
+                }
+                return $ciphertext;
+            //case CRYPT_RSA_ENCRYPTION_OAEP:
+            default:
+                $length = $this->k - 2 * $this->hLen - 2;
+                if ($length <= 0) {
+                    return false;
+                }
+
+                $plaintext = str_split($plaintext, $length);
+                $ciphertext = '';
+                foreach ($plaintext as $m) {
+                    $ciphertext.= $this->_rsaes_oaep_encrypt($m);
+                }
+                return $ciphertext;
+        }
+    }
+
+    /**
+     * Decryption
+     *
+     * @see encrypt()
+     * @access public
+     * @param String $plaintext
+     * @return String
+     */
+    function decrypt($ciphertext)
+    {
+        if ($this->k <= 0) {
+            return false;
+        }
+
+        $ciphertext = str_split($ciphertext, $this->k);
+        $plaintext = '';
+
+        switch ($this->encryptionMode) {
+            case CRYPT_RSA_ENCRYPTION_PKCS1:
+                $decrypt = '_rsaes_pkcs1_v1_5_decrypt';
+                break;
+            //case CRYPT_RSA_ENCRYPTION_OAEP:
+            default:
+                $decrypt = '_rsaes_oaep_decrypt';
+        }
+
+        foreach ($ciphertext as $c) {
+            $temp = $this->$decrypt($c);
+            if ($temp === false) {
+                return false;
+            }
+            $plaintext.= $temp;
+        }
+
+        return $plaintext;
+    }
+
+    /**
+     * Create a signature
+     *
+     * @see verify()
+     * @access public
+     * @param String $message
+     * @return String
+     */
+    function sign($message)
+    {
+        if (empty($this->modulus) || empty($this->exponent)) {
+            return false;
+        }
+
+        switch ($this->signatureMode) {
+            case CRYPT_RSA_SIGNATURE_PKCS1:
+                return $this->_rsassa_pkcs1_v1_5_sign($message);
+            //case CRYPT_RSA_SIGNATURE_PSS:
+            default:
+                return $this->_rsassa_pss_sign($message);
+        }
+    }
+
+    /**
+     * Verifies a signature
+     *
+     * @see sign()
+     * @access public
+     * @param String $message
+     * @param String $signature
+     * @return Boolean
+     */
+    function verify($message, $signature)
+    {
+        if (empty($this->modulus) || empty($this->exponent)) {
+            return false;
+        }
+
+        switch ($this->signatureMode) {
+            case CRYPT_RSA_SIGNATURE_PKCS1:
+                return $this->_rsassa_pkcs1_v1_5_verify($message, $signature);
+            //case CRYPT_RSA_SIGNATURE_PSS:
+            default:
+                return $this->_rsassa_pss_verify($message, $signature);
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php b/plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php
deleted file mode 100644 (file)
index 8f39741..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   CVS: $Id: ErrorHandler.php,v 1.4 2009/01/05 08:30:29 clockwerx Exp $
- * @link      http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * uses PEAR's error handling
- */
-require_once 'PEAR.php';
-
-/**
- * cannot load required extension for math wrapper
- */
-define('CRYPT_RSA_ERROR_NO_EXT', 1);
-
-/**
- * cannot load any math wrappers.
- * Possible reasons:
- *  - there is no any wrappers (they must exist in Crypt/RSA/Math folder )
- *  - all available wrappers are incorrect (read docs/Crypt_RSA/docs/math_wrappers.txt )
- *  - cannot load any extension, required by available wrappers
- */
-define('CRYPT_RSA_ERROR_NO_WRAPPERS', 2);
-
-/**
- * cannot find file, containing requested math wrapper
- */
-define('CRYPT_RSA_ERROR_NO_FILE', 3);
-
-/**
- * cannot find math wrapper class in the math wrapper file
- */
-define('CRYPT_RSA_ERROR_NO_CLASS', 4);
-
-/**
- * invalid key type passed to function (it must be 'public' or 'private')
- */
-define('CRYPT_RSA_ERROR_WRONG_KEY_TYPE', 5);
-
-/**
- * key modulus must be greater than key exponent
- */
-define('CRYPT_RSA_ERROR_EXP_GE_MOD', 6);
-
-/**
- * missing $key_len parameter in Crypt_RSA_KeyPair::generate($key_len) function
- */
-define('CRYPT_RSA_ERROR_MISSING_KEY_LEN', 7);
-
-/**
- * wrong key object passed to function (it must be an object of Crypt_RSA_Key class)
- */
-define('CRYPT_RSA_ERROR_WRONG_KEY', 8);
-
-/**
- * wrong name of hash function passed to Crypt_RSA::setParams() function
- */
-define('CRYPT_RSA_ERROR_WRONG_HASH_FUNC', 9);
-
-/**
- * key, used for signing, must be private
- */
-define('CRYPT_RSA_ERROR_NEED_PRV_KEY', 10);
-
-/**
- * key, used for sign validating, must be public
- */
-define('CRYPT_RSA_ERROR_NEED_PUB_KEY', 11);
-
-/**
- * parameters must be passed to function as associative array
- */
-define('CRYPT_RSA_ERROR_WRONG_PARAMS', 12);
-
-/**
- * error tail of decrypted text. Maybe, wrong decryption key?
- */
-define('CRYPT_RSA_ERROR_WRONG_TAIL', 13);
-
-/**
- * Crypt_RSA_ErrorHandler class.
- *
- * This class is used as base for Crypt_RSA, Crypt_RSA_Key
- * and Crypt_RSA_KeyPair classes.
- *
- * It provides following functions:
- *   - isError() - returns true, if list contains errors, else returns false
- *   - getErrorList() - returns error list
- *   - getLastError() - returns last error from error list or false, if list is empty
- *   - pushError($errstr) - pushes $errstr into the error list
- *   - setErrorHandler($new_error_handler) - sets error handler function
- *   - getErrorHandler() - returns name of error handler function
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   Release: @package_version@
- * @link      http://pear.php.net/package/Crypt_RSA
- * @access    public
- */
-class Crypt_RSA_ErrorHandler
-{
-    /**
-     * array of error objects, pushed by $this->pushError()
-     *
-     * @var array
-     * @access private
-     */
-    var $_errors = array();
-
-    /**
-     * name of error handler - function, which calls on $this->pushError() call
-     *
-     * @var string
-     * @access private
-     */
-    var $_error_handler = '';
-
-    /**
-     * Returns true if list of errors is not empty, else returns false
-     *
-     * @param mixed $err Check if the object is an error
-     *
-     * @return bool    true, if list of errors is not empty or $err is PEAR_Error object, else false
-     * @access public
-     */
-    function isError($err = null)
-    {
-        return is_null($err) ? (sizeof($this->_errors) > 0) : PEAR::isError($err);
-    }
-
-    /**
-     * Returns list of all errors, pushed to error list by $this->pushError()
-     *
-     * @return array    list of errors (usually it contains objects of PEAR_Error class)
-     * @access public
-     */
-    function getErrorList()
-    {
-        return $this->_errors;
-    }
-
-    /**
-     * Returns last error from errors list or false, if list is empty
-     *
-     * @return mixed
-     *         last error from errors list (usually it is PEAR_Error object)
-     *         or false, if list is empty.
-     *
-     * @access public
-     */
-    function getLastError()
-    {
-        $len = sizeof($this->_errors);
-        return $len ? $this->_errors[$len - 1] : false;
-    }
-
-    /**
-     * pushes error object $error to the error list
-     *
-     * @param string $errstr error string
-     * @param int    $errno  error number
-     *
-     * @return bool          true on success, false on error
-     * @access public
-     */
-    function pushError($errstr, $errno = 0)
-    {
-        $this->_errors[] = PEAR::raiseError($errstr, $errno);
-
-        if ($this->_error_handler != '') {
-            // call user defined error handler
-            $func = $this->_error_handler;
-            $func($this);
-        }
-        return true;
-    }
-
-    /**
-     * sets error handler to function with name $func_name.
-     * Function $func_name must accept one parameter - current
-     * object, which triggered error.
-     *
-     * @param string $func_name name of error handler function
-     *
-     * @return bool             true on success, false on error
-     * @access public
-     */
-    function setErrorHandler($func_name = '')
-    {
-        if ($func_name == '') {
-            $this->_error_handler = '';
-        }
-        if (!function_exists($func_name)) {
-            return false;
-        }
-        $this->_error_handler = $func_name;
-        return true;
-    }
-
-    /**
-     * returns name of current error handler, or null if there is no error handler
-     *
-     * @return mixed  error handler name as string or null, if there is no error handler
-     * @access public
-     */
-    function getErrorHandler()
-    {
-        return $this->_error_handler;
-    }
-}
-
-?>
diff --git a/plugins/OStatus/extlib/Crypt/RSA/Key.php b/plugins/OStatus/extlib/Crypt/RSA/Key.php
deleted file mode 100644 (file)
index 6595302..0000000
+++ /dev/null
@@ -1,315 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   CVS: $Id: Key.php,v 1.6 2009/01/05 08:30:29 clockwerx Exp $
- * @link      http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * RSA error handling facilities
- */
-require_once 'Crypt/RSA/ErrorHandler.php';
-
-/**
- * loader for RSA math wrappers
- */
-require_once 'Crypt/RSA/MathLoader.php';
-
-/**
- * Crypt_RSA_Key class, derived from Crypt_RSA_ErrorHandler
- *
- * Provides the following functions:
- *  - getKeyLength() - returns bit key length
- *  - getExponent() - returns key exponent as binary string
- *  - getModulus() - returns key modulus as binary string
- *  - getKeyType() - returns type of the key (public or private)
- *  - toString() - returns serialized key as string
- *  - fromString($key_str) - static function; returns key, unserialized from string
- *  - isValid($key) - static function for validating of $key
- *
- * Example usage:
- *    // create new 1024-bit key pair
- *    $key_pair = new Crypt_RSA_KeyPair(1024);
- * 
- *    // get public key (its class is Crypt_RSA_Key)
- *    $key = $key_pair->getPublicKey();
- *
- *    // get key length
- *    $len = $key->getKeyLength();
- *
- *    // get modulus as string
- *    $modulus = $key->getModulus();
- *
- *    // get exponent as string
- *    $exponent = $key->getExponent();
- *
- *    // get string represenation of key (use it instead of serialization of Crypt_RSA_Key object)
- *    $key_in_str = $key->toString();
- *
- *    // restore key object from string using 'BigInt' math wrapper
- *    $key = Crypt_RSA_Key::fromString($key_in_str, 'BigInt');
- *
- *    // error check
- *    if ($key->isError()) {
- *        echo "error while unserializing key object:\n";
- *        $erorr = $key->getLastError();
- *        echo $error->getMessage(), "\n";
- *    }
- *
- *    // validate key
- *    if (Crypt_RSA_Key::isValid($key)) echo 'valid key';
- *    else echo 'invalid key';
- *
- *    // using factory() method instead of constructor (it returns PEAR_Error object on failure)
- *    $rsa_obj = &Crypt_RSA_Key::factory($modulus, $exp, $key_type);
- *    if (PEAR::isError($rsa_obj)) {
- *        echo "error: ", $rsa_obj->getMessage(), "\n";
- *    }
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   Release: @package_version@
- * @link      http://pear.php.net/package/Crypt_RSA
- * @access    public
- */
-class Crypt_RSA_Key extends Crypt_RSA_ErrorHandler
-{
-    /**
-     * Reference to math wrapper object, which is used to
-     * manipulate large integers in RSA algorithm.
-     *
-     * @var object of Crypt_RSA_Math_* class
-     * @access private
-     */
-    var $_math_obj;
-
-    /**
-     * shared modulus
-     *
-     * @var string
-     * @access private
-     */
-    var $_modulus;
-
-    /**
-     * exponent
-     *
-     * @var string
-     * @access private
-     */
-    var $_exp;
-
-    /**
-     * key type (private or public)
-     *
-     * @var string
-     * @access private
-     */
-    var $_key_type;
-
-    /**
-     * key length in bits
-     *
-     * @var int
-     * @access private
-     */
-    var $_key_len;
-
-    /**
-     * Crypt_RSA_Key constructor.
-     *
-     * You should pass in the name of math wrapper, which will be used to
-     *        perform different operations with big integers.
-     *        See contents of Crypt/RSA/Math folder for examples of wrappers.
-     *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     *
-     * @param string $modulus       key modulus
-     * @param string $exp           key exponent
-     * @param string $key_type      type of the key (public or private)
-     * @param string $wrapper_name  wrapper to use
-     * @param string $error_handler name of error handler function
-     *
-     * @access public
-     */
-    function Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '')
-    {
-        // set error handler
-        $this->setErrorHandler($error_handler);
-        // try to load math wrapper $wrapper_name
-        $obj = &Crypt_RSA_MathLoader::loadWrapper($wrapper_name);
-        if ($this->isError($obj)) {
-            // error during loading of math wrapper
-            $this->pushError($obj); // push error object into error list
-            return;
-        }
-        $this->_math_obj = &$obj;
-
-        $this->_modulus = $modulus;
-        $this->_exp = $exp;
-
-        if (!in_array($key_type, array('private', 'public'))) {
-            $this->pushError('invalid key type. It must be private or public', CRYPT_RSA_ERROR_WRONG_KEY_TYPE);
-            return;
-        }
-        $this->_key_type = $key_type;
-
-        /* check length of modulus & exponent ( abs(modulus) > abs(exp) ) */
-        $mod_num = $this->_math_obj->bin2int($this->_modulus);
-        $exp_num = $this->_math_obj->bin2int($this->_exp);
-
-        if ($this->_math_obj->cmpAbs($mod_num, $exp_num) <= 0) {
-            $this->pushError('modulus must be greater than exponent', CRYPT_RSA_ERROR_EXP_GE_MOD);
-            return;
-        }
-
-        // determine key length
-        $this->_key_len = $this->_math_obj->bitLen($mod_num);
-    }
-
-    /**
-     * Crypt_RSA_Key factory.
-     *
-     * @param string $modulus       key modulus
-     * @param string $exp           key exponent
-     * @param string $key_type      type of the key (public or private)
-     * @param string $wrapper_name  wrapper to use
-     * @param string $error_handler name of error handler function
-     *
-     * @return object   new Crypt_RSA_Key object on success or PEAR_Error object on failure
-     * @access public
-     */
-    function factory($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '')
-    {
-        $obj = new Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name, $error_handler);
-        if ($obj->isError()) {
-            // error during creating a new object. Retrurn PEAR_Error object
-            return $obj->getLastError();
-        }
-        // object created successfully. Return it
-        return $obj;
-    }
-
-    /**
-     * Calculates bit length of the key
-     *
-     * @return int    bit length of key
-     * @access public
-     */
-    function getKeyLength()
-    {
-        return $this->_key_len;
-    }
-
-    /**
-     * Returns modulus part of the key as binary string,
-     * which can be used to construct new Crypt_RSA_Key object.
-     *
-     * @return string  modulus as binary string
-     * @access public
-     */
-    function getModulus()
-    {
-        return $this->_modulus;
-    }
-
-    /**
-     * Returns exponent part of the key as binary string,
-     * which can be used to construct new Crypt_RSA_Key object.
-     *
-     * @return string  exponent as binary string
-     * @access public
-     */
-    function getExponent()
-    {
-        return $this->_exp;
-    }
-
-    /**
-     * Returns key type (public, private)
-     *
-     * @return string  key type (public, private)
-     * @access public
-     */
-    function getKeyType()
-    {
-        return $this->_key_type;
-    }
-
-    /**
-     * Returns string representation of key
-     *
-     * @return string  key, serialized to string
-     * @access public
-     */
-    function toString()
-    {
-        return base64_encode(
-            serialize(
-                array($this->_modulus, $this->_exp, $this->_key_type)
-            )
-        );
-    }
-
-    /**
-     * Returns Crypt_RSA_Key object, unserialized from
-     * string representation of key.
-     *
-     * optional parameter $wrapper_name - is the name of math wrapper,
-     * which will be used during unserialization of this object.
-     *
-     * This function can be called statically:
-     *     $key = Crypt_RSA_Key::fromString($key_in_string, 'BigInt');
-     *
-     * @param string $key_str      RSA key, serialized into string
-     * @param string $wrapper_name optional math wrapper name
-     *
-     * @return object        key as Crypt_RSA_Key object
-     * @access public
-     * @static
-     */
-    function fromString($key_str, $wrapper_name = 'default')
-    {
-        list($modulus, $exponent, $key_type) = unserialize(base64_decode($key_str));
-        $obj = new Crypt_RSA_Key($modulus, $exponent, $key_type, $wrapper_name);
-        return $obj;
-    }
-
-    /**
-     * Validates key
-     * This function can be called statically:
-     *    $is_valid = Crypt_RSA_Key::isValid($key)
-     *
-     * Returns true, if $key is valid Crypt_RSA key, else returns false
-     *
-     * @param object $key Crypt_RSA_Key object for validating
-     *
-     * @return bool        true if $key is valid, else false
-     * @access public
-     */
-    function isValid($key)
-    {
-        return (is_object($key) && strtolower(get_class($key)) === strtolower(__CLASS__));
-    }
-}
-
-?>
diff --git a/plugins/OStatus/extlib/Crypt/RSA/KeyPair.php b/plugins/OStatus/extlib/Crypt/RSA/KeyPair.php
deleted file mode 100644 (file)
index ecc0b7d..0000000
+++ /dev/null
@@ -1,804 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   CVS: $Id: KeyPair.php,v 1.7 2009/01/05 08:30:29 clockwerx Exp $
- * @link      http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * RSA error handling facilities
- */
-require_once 'Crypt/RSA/ErrorHandler.php';
-
-/**
- * loader for RSA math wrappers
- */
-require_once 'Crypt/RSA/MathLoader.php';
-
-/**
- * helper class for single key managing
- */
-require_once 'Crypt/RSA/Key.php';
-
-/**
- * Crypt_RSA_KeyPair class, derived from Crypt_RSA_ErrorHandler
- *
- * Provides the following functions:
- *  - generate($key) - generates new key pair
- *  - getPublicKey() - returns public key
- *  - getPrivateKey() - returns private key
- *  - getKeyLength() - returns bit key length
- *  - setRandomGenerator($func_name) - sets random generator to $func_name
- *  - fromPEMString($str) - retrieves keypair from PEM-encoded string
- *  - toPEMString() - stores keypair to PEM-encoded string
- *  - isEqual($keypair2) - compares current keypair to $keypair2
- *
- * Example usage:
- *    // create new 1024-bit key pair
- *    $key_pair = new Crypt_RSA_KeyPair(1024);
- *
- *    // error check
- *    if ($key_pair->isError()) {
- *        echo "error while initializing Crypt_RSA_KeyPair object:\n";
- *        $erorr = $key_pair->getLastError();
- *        echo $error->getMessage(), "\n";
- *    }
- *
- *    // get public key
- *    $public_key = $key_pair->getPublicKey();
- * 
- *    // get private key
- *    $private_key = $key_pair->getPrivateKey();
- * 
- *    // generate new 512-bit key pair
- *    $key_pair->generate(512);
- *
- *    // error check
- *    if ($key_pair->isError()) {
- *        echo "error while generating key pair:\n";
- *        $erorr = $key_pair->getLastError();
- *        echo $error->getMessage(), "\n";
- *    }
- *
- *    // get key pair length
- *    $length = $key_pair->getKeyLength();
- *
- *    // set random generator to $func_name, where $func_name
- *    // consists name of random generator function. See comments
- *    // before setRandomGenerator() method for details
- *    $key_pair->setRandomGenerator($func_name);
- *
- *    // error check
- *    if ($key_pair->isError()) {
- *        echo "error while changing random generator:\n";
- *        $erorr = $key_pair->getLastError();
- *        echo $error->getMessage(), "\n";
- *    }
- *
- *    // using factory() method instead of constructor (it returns PEAR_Error object on failure)
- *    $rsa_obj = &Crypt_RSA_KeyPair::factory($key_len);
- *    if (PEAR::isError($rsa_obj)) {
- *        echo "error: ", $rsa_obj->getMessage(), "\n";
- *    }
- *
- *    // read key pair from PEM-encoded string:
- *    $str = "-----BEGIN RSA PRIVATE KEY-----"
- *         . "MCsCAQACBHr5LDkCAwEAAQIEBc6jbQIDAOCfAgMAjCcCAk3pAgJMawIDAL41"
- *         . "-----END RSA PRIVATE KEY-----";
- *    $keypair = Crypt_RSA_KeyPair::fromPEMString($str);
- *
- *    // read key pair from .pem file 'private.pem':
- *    $str = file_get_contents('private.pem');
- *    $keypair = Crypt_RSA_KeyPair::fromPEMString($str);
- *
- *    // generate and write 1024-bit key pair to .pem file 'private_new.pem'
- *    $keypair = new Crypt_RSA_KeyPair(1024);
- *    $str = $keypair->toPEMString();
- *    file_put_contents('private_new.pem', $str);
- *
- *    // compare $keypair1 to $keypair2
- *    if ($keypair1->isEqual($keypair2)) {
- *        echo "keypair1 = keypair2\n";
- *    }
- *    else {
- *        echo "keypair1 != keypair2\n";
- *    }
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright 2005 Alexander Valyalkin
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   Release: @package_version@
- * @link      http://pear.php.net/package/Crypt_RSA
- * @access    public
- */
-class Crypt_RSA_KeyPair extends Crypt_RSA_ErrorHandler
-{
-    /**
-     * Reference to math wrapper object, which is used to
-     * manipulate large integers in RSA algorithm.
-     *
-     * @var object of Crypt_RSA_Math_* class
-     * @access private
-     */
-    var $_math_obj;
-
-    /**
-     * length of each key in the key pair
-     *
-     * @var int
-     * @access private
-     */
-    var $_key_len;
-
-    /**
-     * public key
-     *
-     * @var object of Crypt_RSA_KEY class
-     * @access private
-     */
-    var $_public_key;
-
-    /**
-     * private key
-     *
-     * @var object of Crypt_RSA_KEY class
-     * @access private
-     */
-    var $_private_key;
-
-    /**
-     * name of function, which is used as random generator
-     *
-     * @var string
-     * @access private
-     */
-    var $_random_generator;
-
-    /**
-     * RSA keypair attributes [version, n, e, d, p, q, dmp1, dmq1, iqmp] as associative array
-     *
-     * @var array
-     * @access private
-     */
-    var $_attrs;
-
-    /**
-     * Returns names of keypair attributes from $this->_attrs array
-     *
-     * @return array  Array of keypair attributes names
-     * @access private
-     */
-    function _get_attr_names() 
-    {
-        return array('version', 'n', 'e', 'd', 'p', 'q', 'dmp1', 'dmq1', 'iqmp');
-    }
-
-    /**
-     * Parses ASN.1 string [$str] starting form position [$pos].
-     * Returns tag and string value of parsed object.
-     *
-     * @param string                 $str
-     * @param int                    &$pos
-     * @param Crypt_RSA_ErrorHandler &$err_handler
-     *
-     * @return mixed    Array('tag' => ..., 'str' => ...) on success, false on error
-     * @access private
-     */
-    function _ASN1Parse($str, &$pos, &$err_handler)
-    {
-        $max_pos = strlen($str);
-        if ($max_pos < 2) {
-            $err_handler->pushError("ASN.1 string too short");
-            return false;
-        }
-
-        // get ASN.1 tag value
-        $tag = ord($str[$pos++]) & 0x1f;
-        if ($tag == 0x1f) {
-            $tag = 0;
-            do {
-                $n = ord($str[$pos++]);
-                $tag <<= 7;
-                $tag |= $n & 0x7f;
-            } while (($n & 0x80) && $pos < $max_pos);
-        }
-        if ($pos >= $max_pos) {
-            $err_handler->pushError("ASN.1 string too short");
-            return false;
-        }
-
-        // get ASN.1 object length
-        $len = ord($str[$pos++]);
-        if ($len & 0x80) {
-            $n = $len & 0x1f;
-            $len = 0;
-            while ($n-- && $pos < $max_pos) {
-                $len <<= 8;
-                $len |= ord($str[$pos++]);
-            }
-        }
-        if ($pos >= $max_pos || $len > $max_pos - $pos) {
-            $err_handler->pushError("ASN.1 string too short");
-            return false;
-        }
-
-        // get string value of ASN.1 object
-        $str = substr($str, $pos, $len);
-
-        return array(
-            'tag' => $tag,
-            'str' => $str,
-        );
-    }
-
-    /**
-     * Parses ASN.1 sting [$str] starting from position [$pos].
-     * Returns string representation of number, which can be passed
-     * in bin2int() function of math wrapper.
-     *
-     * @param string                 $str
-     * @param int                    &$pos
-     * @param Crypt_RSA_ErrorHandler &$err_handler
-     *
-     * @return mixed   string representation of parsed number on success, false on error
-     * @access private
-     */
-    function _ASN1ParseInt($str, &$pos, &$err_handler)
-    {
-        $tmp = Crypt_RSA_KeyPair::_ASN1Parse($str, $pos, $err_handler);
-        if ($err_handler->isError()) {
-            return false;
-        }
-        if ($tmp['tag'] != 0x02) {
-            $errstr = sprintf("wrong ASN tag value: 0x%02x. Expected 0x02 (INTEGER)", $tmp['tag']);
-            $err_handler->pushError($errstr);
-            return false;
-        }
-        $pos += strlen($tmp['str']);
-
-        return strrev($tmp['str']);
-    }
-
-    /**
-     * Constructs ASN.1 string from tag $tag and object $str
-     *
-     * @param string $str            ASN.1 object string
-     * @param int    $tag            ASN.1 tag value
-     * @param bool   $is_constructed 
-     * @param bool   $is_private 
-     *
-     * @return ASN.1-encoded string
-     * @access private
-     */
-    function _ASN1Store($str, $tag, $is_constructed = false, $is_private = false)
-    {
-        $out = '';
-
-        // encode ASN.1 tag value
-        $tag_ext = ($is_constructed ? 0x20 : 0) | ($is_private ? 0xc0 : 0);
-        if ($tag < 0x1f) {
-            $out .= chr($tag | $tag_ext);
-        } else {
-            $out .= chr($tag_ext | 0x1f);
-            $tmp = chr($tag & 0x7f);
-            $tag >>= 7;
-            while ($tag) {
-                $tmp .= chr(($tag & 0x7f) | 0x80);
-                $tag >>= 7;
-            }
-            $out .= strrev($tmp);
-        }
-
-        // encode ASN.1 object length
-        $len = strlen($str);
-        if ($len < 0x7f) {
-            $out .= chr($len);
-        } else {
-            $tmp = '';
-            $n = 0;
-            while ($len) {
-                $tmp .= chr($len & 0xff);
-                $len >>= 8;
-                $n++;
-            }
-            $out .= chr($n | 0x80);
-            $out .= strrev($tmp);
-        }
-
-        return $out . $str;
-    }
-
-    /**
-     * Constructs ASN.1 string from binary representation of big integer
-     *
-     * @param string $str binary representation of big integer
-     *
-     * @return ASN.1-encoded string
-     * @access private
-     */
-    function _ASN1StoreInt($str)
-    {
-        $str = strrev($str);
-        return Crypt_RSA_KeyPair::_ASN1Store($str, 0x02);
-    }
-
-    /**
-     * Crypt_RSA_KeyPair constructor.
-     *
-     * Wrapper: name of math wrapper, which will be used to
-     *        perform different operations with big integers.
-     *        See contents of Crypt/RSA/Math folder for examples of wrappers.
-     *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     *
-     * @param int      $key_len          bit length of key pair, which will be generated in constructor
-     * @param string   $wrapper_name     wrapper name
-     * @param string   $error_handler    name of error handler function
-     * @param callback $random_generator function which will be used as random generator
-     *
-     * @access public
-     */
-    function Crypt_RSA_KeyPair($key_len, $wrapper_name = 'default', $error_handler = '', $random_generator = null)
-    {
-        // set error handler
-        $this->setErrorHandler($error_handler);
-        // try to load math wrapper
-        $obj = &Crypt_RSA_MathLoader::loadWrapper($wrapper_name);
-        if ($this->isError($obj)) {
-            // error during loading of math wrapper
-            $this->pushError($obj);
-            return;
-        }
-        $this->_math_obj = &$obj;
-
-        // set random generator
-        if (!$this->setRandomGenerator($random_generator)) {
-            // error in setRandomGenerator() function
-            return;
-        }
-
-        if (is_array($key_len)) {
-            // ugly BC hack - it is possible to pass RSA private key attributes [version, n, e, d, p, q, dmp1, dmq1, iqmp]
-            // as associative array instead of key length to Crypt_RSA_KeyPair constructor
-            $rsa_attrs = $key_len;
-
-            // convert attributes to big integers
-            $attr_names = $this->_get_attr_names();
-            foreach ($attr_names as $attr) {
-                if (!isset($rsa_attrs[$attr])) {
-                    $this->pushError("missing required RSA attribute [$attr]");
-                    return;
-                }
-                ${$attr} = $this->_math_obj->bin2int($rsa_attrs[$attr]);
-            }
-
-            // check primality of p and q
-            if (!$this->_math_obj->isPrime($p)) {
-                $this->pushError("[p] must be prime");
-                return;
-            }
-            if (!$this->_math_obj->isPrime($q)) {
-                $this->pushError("[q] must be prime");
-                return;
-            }
-
-            // check n = p * q
-            $n1 = $this->_math_obj->mul($p, $q);
-            if ($this->_math_obj->cmpAbs($n, $n1)) {
-                $this->pushError("n != p * q");
-                return;
-            }
-
-            // check e * d = 1 mod (p-1) * (q-1)
-            $p1 = $this->_math_obj->dec($p);
-            $q1 = $this->_math_obj->dec($q);
-            $p1q1 = $this->_math_obj->mul($p1, $q1);
-            $ed = $this->_math_obj->mul($e, $d);
-            $one = $this->_math_obj->mod($ed, $p1q1);
-            if (!$this->_math_obj->isOne($one)) {
-                $this->pushError("e * d != 1 mod (p-1)*(q-1)");
-                return;
-            }
-
-            // check dmp1 = d mod (p-1)
-            $dmp = $this->_math_obj->mod($d, $p1);
-            if ($this->_math_obj->cmpAbs($dmp, $dmp1)) {
-                $this->pushError("dmp1 != d mod (p-1)");
-                return;
-            }
-
-            // check dmq1 = d mod (q-1)
-            $dmq = $this->_math_obj->mod($d, $q1);
-            if ($this->_math_obj->cmpAbs($dmq, $dmq1)) {
-                $this->pushError("dmq1 != d mod (q-1)");
-                return;
-            }
-
-            // check iqmp = 1/q mod p
-            $q1 = $this->_math_obj->invmod($iqmp, $p);
-            if ($this->_math_obj->cmpAbs($q, $q1)) {
-                $this->pushError("iqmp != 1/q mod p");
-                return;
-            }
-
-            // try to create public key object
-            $public_key = &new Crypt_RSA_Key($rsa_attrs['n'], $rsa_attrs['e'], 'public', $wrapper_name, $error_handler);
-            if ($public_key->isError()) {
-                // error during creating public object
-                $this->pushError($public_key->getLastError());
-                return;
-            }
-
-            // try to create private key object
-            $private_key = &new Crypt_RSA_Key($rsa_attrs['n'], $rsa_attrs['d'], 'private', $wrapper_name, $error_handler);
-            if ($private_key->isError()) {
-                // error during creating private key object
-                $this->pushError($private_key->getLastError());
-                return;
-            }
-
-            $this->_public_key = $public_key;
-            $this->_private_key = $private_key;
-            $this->_key_len = $public_key->getKeyLength();
-            $this->_attrs = $rsa_attrs;
-        } else {
-            // generate key pair
-            if (!$this->generate($key_len)) {
-                // error during generating key pair
-                return;
-            }
-        }
-    }
-
-    /**
-     * Crypt_RSA_KeyPair factory.
-     *
-     * Wrapper - Name of math wrapper, which will be used to
-     *        perform different operations with big integers.
-     *        See contents of Crypt/RSA/Math folder for examples of wrappers.
-     *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     *
-     * @param int      $key_len          bit length of key pair, which will be generated in constructor
-     * @param string   $wrapper_name     wrapper name
-     * @param string   $error_handler    name of error handler function
-     * @param callback $random_generator function which will be used as random generator
-     *
-     * @return object   new Crypt_RSA_KeyPair object on success or PEAR_Error object on failure
-     * @access public
-     */
-    function &factory($key_len, $wrapper_name = 'default', $error_handler = '', $random_generator = null)
-    {
-        $obj = &new Crypt_RSA_KeyPair($key_len, $wrapper_name, $error_handler, $random_generator);
-        if ($obj->isError()) {
-            // error during creating a new object. Return PEAR_Error object
-            return $obj->getLastError();
-        }
-        // object created successfully. Return it
-        return $obj;
-    }
-
-    /**
-     * Generates new Crypt_RSA key pair with length $key_len.
-     * If $key_len is missed, use an old key length from $this->_key_len
-     *
-     * @param int $key_len bit length of key pair, which will be generated
-     *
-     * @return bool         true on success or false on error
-     * @access public
-     */
-    function generate($key_len = null)
-    {
-        if (is_null($key_len)) {
-            // use an old key length
-            $key_len = $this->_key_len;
-            if (is_null($key_len)) {
-                $this->pushError('missing key_len parameter', CRYPT_RSA_ERROR_MISSING_KEY_LEN);
-                return false;
-            }
-        }
-
-        // minimal key length is 8 bit ;)
-        if ($key_len < 8) {
-            $key_len = 8;
-        }
-        // store key length in the _key_len property
-        $this->_key_len = $key_len;
-
-        // set [e] to 0x10001 (65537)
-        $e = $this->_math_obj->bin2int("\x01\x00\x01");
-
-        // generate [p], [q] and [n]
-        $p_len = intval(($key_len + 1) / 2);
-        $q_len = $key_len - $p_len;
-        $p1 = $q1 = 0;
-        do {
-            // generate prime number [$p] with length [$p_len] with the following condition:
-            // GCD($e, $p - 1) = 1
-            do {
-                $p = $this->_math_obj->getPrime($p_len, $this->_random_generator);
-                $p1 = $this->_math_obj->dec($p);
-                $tmp = $this->_math_obj->GCD($e, $p1);
-            } while (!$this->_math_obj->isOne($tmp));
-            // generate prime number [$q] with length [$q_len] with the following conditions:
-            // GCD($e, $q - 1) = 1
-            // $q != $p
-            do {
-                $q = $this->_math_obj->getPrime($q_len, $this->_random_generator);
-                $q1 = $this->_math_obj->dec($q);
-                $tmp = $this->_math_obj->GCD($e, $q1);
-            } while (!$this->_math_obj->isOne($tmp) && !$this->_math_obj->cmpAbs($q, $p));
-            // if (p < q), then exchange them
-            if ($this->_math_obj->cmpAbs($p, $q) < 0) {
-                $tmp = $p;
-                $p = $q;
-                $q = $tmp;
-                $tmp = $p1;
-                $p1 = $q1;
-                $q1 = $tmp;
-            }
-            // calculate n = p * q
-            $n = $this->_math_obj->mul($p, $q);
-        } while ($this->_math_obj->bitLen($n) != $key_len);
-
-        // calculate d = 1/e mod (p - 1) * (q - 1)
-        $pq = $this->_math_obj->mul($p1, $q1);
-        $d = $this->_math_obj->invmod($e, $pq);
-
-        // calculate dmp1 = d mod (p - 1)
-        $dmp1 = $this->_math_obj->mod($d, $p1);
-
-        // calculate dmq1 = d mod (q - 1)
-        $dmq1 = $this->_math_obj->mod($d, $q1);
-
-        // calculate iqmp = 1/q mod p
-        $iqmp = $this->_math_obj->invmod($q, $p);
-
-        // store RSA keypair attributes
-        $this->_attrs = array(
-            'version' => "\x00",
-            'n' => $this->_math_obj->int2bin($n),
-            'e' => $this->_math_obj->int2bin($e),
-            'd' => $this->_math_obj->int2bin($d),
-            'p' => $this->_math_obj->int2bin($p),
-            'q' => $this->_math_obj->int2bin($q),
-            'dmp1' => $this->_math_obj->int2bin($dmp1),
-            'dmq1' => $this->_math_obj->int2bin($dmq1),
-            'iqmp' => $this->_math_obj->int2bin($iqmp),
-        );
-
-        $n = $this->_attrs['n'];
-        $e = $this->_attrs['e'];
-        $d = $this->_attrs['d'];
-
-        // try to create public key object
-        $obj = &new Crypt_RSA_Key($n, $e, 'public', $this->_math_obj->getWrapperName(), $this->_error_handler);
-        if ($obj->isError()) {
-            // error during creating public object
-            $this->pushError($obj->getLastError());
-            return false;
-        }
-        $this->_public_key = &$obj;
-
-        // try to create private key object
-        $obj = &new Crypt_RSA_Key($n, $d, 'private', $this->_math_obj->getWrapperName(), $this->_error_handler);
-        if ($obj->isError()) {
-            // error during creating private key object
-            $this->pushError($obj->getLastError());
-            return false;
-        }
-        $this->_private_key = &$obj;
-
-        return true; // key pair successfully generated
-    }
-
-    /**
-     * Returns public key from the pair
-     *
-     * @return object  public key object of class Crypt_RSA_Key
-     * @access public
-     */
-    function getPublicKey()
-    {
-        return $this->_public_key;
-    }
-
-    /**
-     * Returns private key from the pair
-     *
-     * @return object   private key object of class Crypt_RSA_Key
-     * @access public
-     */
-    function getPrivateKey()
-    {
-        return $this->_private_key;
-    }
-
-    /**
-     * Sets name of random generator function for key generation.
-     * If parameter is skipped, then sets to default random generator.
-     *
-     * Random generator function must return integer with at least 8 lower
-     * significant bits, which will be used as random values.
-     *
-     * @param string $random_generator name of random generator function
-     *
-     * @return bool                     true on success or false on error
-     * @access public
-     */
-    function setRandomGenerator($random_generator = null)
-    {
-        static $default_random_generator = null;
-
-        if (is_string($random_generator)) {
-            // set user's random generator
-            if (!function_exists($random_generator)) {
-                $this->pushError("can't find random generator function with name [{$random_generator}]");
-                return false;
-            }
-            $this->_random_generator = $random_generator;
-        } else {
-            // set default random generator
-            $this->_random_generator = is_null($default_random_generator) ?
-                ($default_random_generator = create_function('', '$a=explode(" ",microtime());return(int)($a[0]*1000000);')) :
-                $default_random_generator;
-        }
-        return true;
-    }
-
-    /**
-     * Returns length of each key in the key pair
-     *
-     * @return int  bit length of each key in key pair
-     * @access public
-     */
-    function getKeyLength()
-    {
-        return $this->_key_len;
-    }
-
-    /**
-     * Retrieves RSA keypair from PEM-encoded string, containing RSA private key.
-     * Example of such string:
-     * -----BEGIN RSA PRIVATE KEY-----
-     * MCsCAQACBHtvbSECAwEAAQIEeYrk3QIDAOF3AgMAjCcCAmdnAgJMawIDALEk
-     * -----END RSA PRIVATE KEY-----
-     *
-     * Wrapper: Name of math wrapper, which will be used to
-     * perform different operations with big integers.
-     * See contents of Crypt/RSA/Math folder for examples of wrappers.
-     * Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
-     *
-     * @param string $str           PEM-encoded string
-     * @param string $wrapper_name  Wrapper name
-     * @param string $error_handler name of error handler function
-     *
-     * @return Crypt_RSA_KeyPair object on success, PEAR_Error object on error
-     * @access public
-     * @static
-     */
-    function &fromPEMString($str, $wrapper_name = 'default', $error_handler = '')
-    {
-        if (isset($this)) {
-            if ($wrapper_name == 'default') {
-                $wrapper_name = $this->_math_obj->getWrapperName();
-            }
-            if ($error_handler == '') {
-                $error_handler = $this->_error_handler;
-            }
-        }
-        $err_handler = &new Crypt_RSA_ErrorHandler;
-        $err_handler->setErrorHandler($error_handler);
-
-        // search for base64-encoded private key
-        if (!preg_match('/-----BEGIN RSA PRIVATE KEY-----([^-]+)-----END RSA PRIVATE KEY-----/', $str, $matches)) {
-            $err_handler->pushError("can't find RSA private key in the string [{$str}]");
-            return $err_handler->getLastError();
-        }
-
-        // parse private key. It is ASN.1-encoded
-        $str = base64_decode($matches[1]);
-        $pos = 0;
-        $tmp = Crypt_RSA_KeyPair::_ASN1Parse($str, $pos, $err_handler);
-        if ($err_handler->isError()) {
-            return $err_handler->getLastError();
-        }
-        if ($tmp['tag'] != 0x10) {
-            $errstr = sprintf("wrong ASN tag value: 0x%02x. Expected 0x10 (SEQUENCE)", $tmp['tag']);
-            $err_handler->pushError($errstr);
-            return $err_handler->getLastError();
-        }
-
-        // parse ASN.1 SEQUENCE for RSA private key
-        $attr_names = Crypt_RSA_KeyPair::_get_attr_names();
-        $n = sizeof($attr_names);
-        $rsa_attrs = array();
-        for ($i = 0; $i < $n; $i++) {
-            $tmp = Crypt_RSA_KeyPair::_ASN1ParseInt($str, $pos, $err_handler);
-            if ($err_handler->isError()) {
-                return $err_handler->getLastError();
-            }
-            $attr = $attr_names[$i];
-            $rsa_attrs[$attr] = $tmp;
-        }
-
-        // create Crypt_RSA_KeyPair object.
-        $keypair = &new Crypt_RSA_KeyPair($rsa_attrs, $wrapper_name, $error_handler);
-        if ($keypair->isError()) {
-            return $keypair->getLastError();
-        }
-
-        return $keypair;
-    }
-
-    /**
-     * converts keypair to PEM-encoded string, which can be stroed in 
-     * .pem compatible files, contianing RSA private key.
-     *
-     * @return string PEM-encoded keypair on success, false on error
-     * @access public
-     */
-    function toPEMString()
-    {
-        // store RSA private key attributes into ASN.1 string
-        $str = '';
-        $attr_names = $this->_get_attr_names();
-        $n = sizeof($attr_names);
-        $rsa_attrs = $this->_attrs;
-        for ($i = 0; $i < $n; $i++) {
-            $attr = $attr_names[$i];
-            if (!isset($rsa_attrs[$attr])) {
-                $this->pushError("Cannot find value for ASN.1 attribute [$attr]");
-                return false;
-            }
-            $tmp = $rsa_attrs[$attr];
-            $str .= Crypt_RSA_KeyPair::_ASN1StoreInt($tmp);
-        }
-
-        // prepend $str by ASN.1 SEQUENCE (0x10) header
-        $str = Crypt_RSA_KeyPair::_ASN1Store($str, 0x10, true);
-
-        // encode and format PEM string
-        $str = base64_encode($str);
-        $str = chunk_split($str, 64, "\n");
-        return "-----BEGIN RSA PRIVATE KEY-----\n$str-----END RSA PRIVATE KEY-----\n";
-    }
-
-    /**
-     * Compares keypairs in Crypt_RSA_KeyPair objects $this and $key_pair
-     *
-     * @param Crypt_RSA_KeyPair $key_pair  keypair to compare
-     *
-     * @return bool  true, if keypair stored in $this equal to keypair stored in $key_pair
-     * @access public
-     */
-    function isEqual($key_pair)
-    {
-        $attr_names = $this->_get_attr_names();
-        foreach ($attr_names as $attr) {
-            if ($this->_attrs[$attr] != $key_pair->_attrs[$attr]) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
-
-?>
diff --git a/plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php b/plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php
deleted file mode 100644 (file)
index 646ff67..0000000
+++ /dev/null
@@ -1,482 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    1.2.0b
- * @link       http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * Crypt_RSA_Math_BCMath class.
- *
- * Provides set of math functions, which are used by Crypt_RSA package
- * This class is a wrapper for PHP BCMath extension.
- * See http://php.net/manual/en/ref.bc.php for details.
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @link       http://pear.php.net/package/Crypt_RSA
- * @version    @package_version@
- * @access     public
- */
-class Crypt_RSA_Math_BCMath
-{
-    /**
-     * error description
-     *
-     * @var string
-     * @access public
-     */
-    var $errstr = '';
-
-    /**
-     * Performs Miller-Rabin primality test for number $num 
-     * with base $base. Returns true, if $num is strong pseudoprime
-     * by base $base. Else returns false.
-     *
-     * @param string $num
-     * @param string $base
-     * @return bool
-     * @access private
-     */
-    function _millerTest($num, $base)
-    {
-        if (!bccomp($num, '1')) {
-            // 1 is not prime ;)
-            return false;
-        }
-        $tmp = bcsub($num, '1');
-
-        $zero_bits = 0;
-        while (!bccomp(bcmod($tmp, '2'), '0')) {
-            $zero_bits++;
-            $tmp = bcdiv($tmp, '2');
-        }
-
-        $tmp = $this->powmod($base, $tmp, $num);
-        if (!bccomp($tmp, '1')) {
-            // $num is probably prime
-            return true;
-        }
-
-        while ($zero_bits--) {
-            if (!bccomp(bcadd($tmp, '1'), $num)) {
-                // $num is probably prime
-                return true;
-            }
-            $tmp = $this->powmod($tmp, '2', $num);
-        }
-        // $num is composite
-        return false;
-    }
-
-    /**
-     * Crypt_RSA_Math_BCMath constructor.
-     * Checks an existance of PHP BCMath extension.
-     * On failure saves error description in $this->errstr
-     *
-     * @access public
-     */
-    function Crypt_RSA_Math_BCMath()
-    {
-        if (!extension_loaded('bcmath')) {
-            if (!@dl('bcmath.' . PHP_SHLIB_SUFFIX) && !@dl('php_bcmath.' . PHP_SHLIB_SUFFIX)) {
-                // cannot load BCMath extension. Set error string
-                $this->errstr = 'Crypt_RSA package requires the BCMath extension. See http://php.net/manual/en/ref.bc.php for details';
-                return;
-            }
-        }
-    }
-
-    /**
-     * Transforms binary representation of large integer into its native form.
-     * 
-     * Example of transformation:
-     *    $str = "\x12\x34\x56\x78\x90";
-     *    $num = 0x9078563412;
-     *
-     * @param string $str
-     * @return string
-     * @access public
-     */
-    function bin2int($str)
-    {
-        $result = '0';
-        $n = strlen($str);
-        do {
-            $result = bcadd(bcmul($result, '256'), ord($str{--$n}));
-        } while ($n > 0);
-        return $result;
-    }
-
-    /**
-     * Transforms large integer into binary representation.
-     * 
-     * Example of transformation:
-     *    $num = 0x9078563412;
-     *    $str = "\x12\x34\x56\x78\x90";
-     *
-     * @param string $num
-     * @return string
-     * @access public
-     */
-    function int2bin($num)
-    {
-        $result = '';
-        do {
-            $result .= chr(bcmod($num, '256'));
-            $num = bcdiv($num, '256');
-        } while (bccomp($num, '0'));
-        return $result;
-    }
-
-    /**
-     * Calculates pow($num, $pow) (mod $mod)
-     *
-     * @param string $num
-     * @param string $pow
-     * @param string $mod
-     * @return string
-     * @access public
-     */
-    function powmod($num, $pow, $mod)
-    {
-        if (function_exists('bcpowmod')) {
-            // bcpowmod is only available under PHP5
-            return bcpowmod($num, $pow, $mod);
-        }
-
-        // emulate bcpowmod
-        $result = '1';
-        do {
-            if (!bccomp(bcmod($pow, '2'), '1')) {
-                $result = bcmod(bcmul($result, $num), $mod);
-            }
-            $num = bcmod(bcpow($num, '2'), $mod);
-            $pow = bcdiv($pow, '2');
-        } while (bccomp($pow, '0'));
-        return $result;
-    }
-
-    /**
-     * Calculates $num1 * $num2
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return string
-     * @access public
-     */
-    function mul($num1, $num2)
-    {
-        return bcmul($num1, $num2);
-    }
-
-    /**
-     * Calculates $num1 % $num2
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return string
-     * @access public
-     */
-    function mod($num1, $num2)
-    {
-        return bcmod($num1, $num2);
-    }
-
-    /**
-     * Compares abs($num1) to abs($num2).
-     * Returns:
-     *   -1, if abs($num1) < abs($num2)
-     *   0, if abs($num1) == abs($num2)
-     *   1, if abs($num1) > abs($num2)
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return int
-     * @access public
-     */
-    function cmpAbs($num1, $num2)
-    {
-        return bccomp($num1, $num2);
-    }
-
-    /**
-     * Tests $num on primality. Returns true, if $num is strong pseudoprime.
-     * Else returns false.
-     *
-     * @param string $num
-     * @return bool
-     * @access private
-     */
-    function isPrime($num)
-    {
-        static $primes = null;
-        static $primes_cnt = 0;
-        if (is_null($primes)) {
-            // generate all primes up to 10000
-            $primes = array();
-            for ($i = 0; $i < 10000; $i++) {
-                $primes[] = $i;
-            }
-            $primes[0] = $primes[1] = 0;
-            for ($i = 2; $i < 100; $i++) {
-                while (!$primes[$i]) {
-                    $i++;
-                }
-                $j = $i;
-                for ($j += $i; $j < 10000; $j += $i) {
-                    $primes[$j] = 0;
-                }
-            }
-            $j = 0;
-            for ($i = 0; $i < 10000; $i++) {
-                if ($primes[$i]) {
-                    $primes[$j++] = $primes[$i];
-                }
-            }
-            $primes_cnt = $j;
-        }
-
-        // try to divide number by small primes
-        for ($i = 0; $i < $primes_cnt; $i++) {
-            if (bccomp($num, $primes[$i]) <= 0) {
-                // number is prime
-                return true;
-            }
-            if (!bccomp(bcmod($num, $primes[$i]), '0')) {
-                // number divides by $primes[$i]
-                return false;
-            }
-        }
-
-        /*
-            try Miller-Rabin's probable-primality test for first
-            7 primes as bases
-        */
-        for ($i = 0; $i < 7; $i++) {
-            if (!$this->_millerTest($num, $primes[$i])) {
-                // $num is composite
-                return false;
-            }
-        }
-        // $num is strong pseudoprime
-        return true;
-    }
-
-    /**
-     * Generates prime number with length $bits_cnt
-     * using $random_generator as random generator function.
-     *
-     * @param int $bits_cnt
-     * @param string $rnd_generator
-     * @access public
-     */
-    function getPrime($bits_cnt, $random_generator)
-    {
-        $bytes_n = intval($bits_cnt / 8);
-        $bits_n = $bits_cnt % 8;
-        do {
-            $str = '';
-            for ($i = 0; $i < $bytes_n; $i++) {
-                $str .= chr(call_user_func($random_generator) & 0xff);
-            }
-            $n = call_user_func($random_generator) & 0xff;
-            $n |= 0x80;
-            $n >>= 8 - $bits_n;
-            $str .= chr($n);
-            $num = $this->bin2int($str);
-
-            // search for the next closest prime number after [$num]
-            if (!bccomp(bcmod($num, '2'), '0')) {
-                $num = bcadd($num, '1');
-            }
-            while (!$this->isPrime($num)) {
-                $num = bcadd($num, '2');
-            }
-        } while ($this->bitLen($num) != $bits_cnt);
-        return $num;
-    }
-
-    /**
-     * Calculates $num - 1
-     *
-     * @param string $num
-     * @return string
-     * @access public
-     */
-    function dec($num)
-    {
-        return bcsub($num, '1');
-    }
-
-    /**
-     * Returns true, if $num is equal to one. Else returns false
-     *
-     * @param string $num
-     * @return bool
-     * @access public
-     */
-    function isOne($num)
-    {
-        return !bccomp($num, '1');
-    }
-
-    /**
-     * Finds greatest common divider (GCD) of $num1 and $num2
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return string
-     * @access public
-     */
-    function GCD($num1, $num2)
-    {
-        do {
-            $tmp = bcmod($num1, $num2);
-            $num1 = $num2;
-            $num2 = $tmp;
-        } while (bccomp($num2, '0'));
-        return $num1;
-    }
-
-    /**
-     * Finds inverse number $inv for $num by modulus $mod, such as:
-     *     $inv * $num = 1 (mod $mod)
-     *
-     * @param string $num
-     * @param string $mod
-     * @return string
-     * @access public
-     */
-    function invmod($num, $mod)
-    {
-        $x = '1';
-        $y = '0';
-        $num1 = $mod;
-        do {
-            $tmp = bcmod($num, $num1);
-            $q = bcdiv($num, $num1);
-            $num = $num1;
-            $num1 = $tmp;
-
-            $tmp = bcsub($x, bcmul($y, $q));
-            $x = $y;
-            $y = $tmp;
-        } while (bccomp($num1, '0'));
-        if (bccomp($x, '0') < 0) {
-            $x = bcadd($x, $mod);
-        }
-        return $x;
-    }
-
-    /**
-     * Returns bit length of number $num
-     *
-     * @param string $num
-     * @return int
-     * @access public
-     */
-    function bitLen($num)
-    {
-        $tmp = $this->int2bin($num);
-        $bit_len = strlen($tmp) * 8;
-        $tmp = ord($tmp{strlen($tmp) - 1});
-        if (!$tmp) {
-            $bit_len -= 8;
-        }
-        else {
-            while (!($tmp & 0x80)) {
-                $bit_len--;
-                $tmp <<= 1;
-            }
-        }
-        return $bit_len;
-    }
-
-    /**
-     * Calculates bitwise or of $num1 and $num2,
-     * starting from bit $start_pos for number $num1
-     *
-     * @param string $num1
-     * @param string $num2
-     * @param int $start_pos
-     * @return string
-     * @access public
-     */
-    function bitOr($num1, $num2, $start_pos)
-    {
-        $start_byte = intval($start_pos / 8);
-        $start_bit = $start_pos % 8;
-        $tmp1 = $this->int2bin($num1);
-
-        $num2 = bcmul($num2, 1 << $start_bit);
-        $tmp2 = $this->int2bin($num2);
-        if ($start_byte < strlen($tmp1)) {
-            $tmp2 |= substr($tmp1, $start_byte);
-            $tmp1 = substr($tmp1, 0, $start_byte) . $tmp2;
-        }
-        else {
-            $tmp1 = str_pad($tmp1, $start_byte, "\0") . $tmp2;
-        }
-        return $this->bin2int($tmp1);
-    }
-
-    /**
-     * Returns part of number $num, starting at bit
-     * position $start with length $length
-     *
-     * @param string $num
-     * @param int start
-     * @param int length
-     * @return string
-     * @access public
-     */
-    function subint($num, $start, $length)
-    {
-        $start_byte = intval($start / 8);
-        $start_bit = $start % 8;
-        $byte_length = intval($length / 8);
-        $bit_length = $length % 8;
-        if ($bit_length) {
-            $byte_length++;
-        }
-        $num = bcdiv($num, 1 << $start_bit);
-        $tmp = substr($this->int2bin($num), $start_byte, $byte_length);
-        $tmp = str_pad($tmp, $byte_length, "\0");
-        $tmp = substr_replace($tmp, $tmp{$byte_length - 1} & chr(0xff >> (8 - $bit_length)), $byte_length - 1, 1);
-        return $this->bin2int($tmp);
-    }
-
-    /**
-     * Returns name of current wrapper
-     *
-     * @return string name of current wrapper
-     * @access public
-     */
-    function getWrapperName()
-    {
-        return 'BCMath';
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php b/plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php
deleted file mode 100644 (file)
index b7ac24c..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    1.2.0b
- * @link       http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * Crypt_RSA_Math_BigInt class.
- *
- * Provides set of math functions, which are used by Crypt_RSA package
- * This class is a wrapper for big_int PECL extension,
- * which could be loaded from http://pecl.php.net/packages/big_int
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @link       http://pear.php.net/package/Crypt_RSA
- * @version    @package_version@
- * @access     public
- */
-class Crypt_RSA_Math_BigInt
-{
-    /**
-     * error description
-     *
-     * @var string
-     * @access public
-     */
-    var $errstr = '';
-
-    /**
-     * Crypt_RSA_Math_BigInt constructor.
-     * Checks an existance of big_int PECL math package.
-     * This package is available at http://pecl.php.net/packages/big_int
-     * On failure saves error description in $this->errstr
-     *
-     * @access public
-     */
-    function Crypt_RSA_Math_BigInt()
-    {
-        if (!extension_loaded('big_int')) {
-            if (!@dl('big_int.' . PHP_SHLIB_SUFFIX) && !@dl('php_big_int.' . PHP_SHLIB_SUFFIX)) {
-                // cannot load big_int extension
-                $this->errstr = 'Crypt_RSA package requires big_int PECL package. ' .
-                     'It is available at http://pecl.php.net/packages/big_int';
-                return;
-            }
-        }
-
-        // check version of big_int extension ( Crypt_RSA requires version 1.0.2 and higher )
-        if (!in_array('bi_info', get_extension_funcs('big_int'))) {
-            // there is no bi_info() function in versions, older than 1.0.2
-            $this->errstr = 'Crypt_RSA package requires big_int package version 1.0.2 and higher';
-        }
-    }
-
-    /**
-     * Transforms binary representation of large integer into its native form.
-     * 
-     * Example of transformation:
-     *    $str = "\x12\x34\x56\x78\x90";
-     *    $num = 0x9078563412;
-     *
-     * @param string $str
-     * @return big_int resource
-     * @access public
-     */
-    function bin2int($str)
-    {
-        return bi_unserialize($str);
-    }
-
-    /**
-     * Transforms large integer into binary representation.
-     * 
-     * Example of transformation:
-     *    $num = 0x9078563412;
-     *    $str = "\x12\x34\x56\x78\x90";
-     *
-     * @param big_int resource $num
-     * @return string
-     * @access public
-     */
-    function int2bin($num)
-    {
-        return bi_serialize($num);
-    }
-
-    /**
-     * Calculates pow($num, $pow) (mod $mod)
-     *
-     * @param big_int resource $num
-     * @param big_int resource $pow
-     * @param big_int resource $mod
-     * @return big_int resource
-     * @access public
-     */
-    function powmod($num, $pow, $mod)
-    {
-        return bi_powmod($num, $pow, $mod);
-    }
-
-    /**
-     * Calculates $num1 * $num2
-     *
-     * @param big_int resource $num1
-     * @param big_int resource $num2
-     * @return big_int resource
-     * @access public
-     */
-    function mul($num1, $num2)
-    {
-        return bi_mul($num1, $num2);
-    }
-
-    /**
-     * Calculates $num1 % $num2
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return string
-     * @access public
-     */
-    function mod($num1, $num2)
-    {
-        return bi_mod($num1, $num2);
-    }
-
-    /**
-     * Compares abs($num1) to abs($num2).
-     * Returns:
-     *   -1, if abs($num1) < abs($num2)
-     *   0, if abs($num1) == abs($num2)
-     *   1, if abs($num1) > abs($num2)
-     *
-     * @param big_int resource $num1
-     * @param big_int resource $num2
-     * @return int
-     * @access public
-     */
-    function cmpAbs($num1, $num2)
-    {
-        return bi_cmp_abs($num1, $num2);
-    }
-
-    /**
-     * Tests $num on primality. Returns true, if $num is strong pseudoprime.
-     * Else returns false.
-     *
-     * @param string $num
-     * @return bool
-     * @access private
-     */
-    function isPrime($num)
-    {
-        return bi_is_prime($num) ? true : false;
-    }
-
-    /**
-     * Generates prime number with length $bits_cnt
-     * using $random_generator as random generator function.
-     *
-     * @param int $bits_cnt
-     * @param string $rnd_generator
-     * @access public
-     */
-    function getPrime($bits_cnt, $random_generator)
-    {
-        $bytes_n = intval($bits_cnt / 8);
-        $bits_n = $bits_cnt % 8;
-        do {
-            $str = '';
-            for ($i = 0; $i < $bytes_n; $i++) {
-                $str .= chr(call_user_func($random_generator) & 0xff);
-            }
-            $n = call_user_func($random_generator) & 0xff;
-            $n |= 0x80;
-            $n >>= 8 - $bits_n;
-            $str .= chr($n);
-            $num = $this->bin2int($str);
-
-            // search for the next closest prime number after [$num]
-            $num = bi_next_prime($num);
-        } while ($this->bitLen($num) != $bits_cnt);
-        return $num;
-    }
-
-    /**
-     * Calculates $num - 1
-     *
-     * @param big_int resource $num
-     * @return big_int resource
-     * @access public
-     */
-    function dec($num)
-    {
-        return bi_dec($num);
-    }
-
-    /**
-     * Returns true, if $num is equal to 1. Else returns false
-     *
-     * @param big_int resource $num
-     * @return bool
-     * @access public
-     */
-    function isOne($num)
-    {
-        return bi_is_one($num);
-    }
-
-    /**
-     * Finds greatest common divider (GCD) of $num1 and $num2
-     *
-     * @param big_int resource $num1
-     * @param big_int resource $num2
-     * @return big_int resource
-     * @access public
-     */
-    function GCD($num1, $num2)
-    {
-        return bi_gcd($num1, $num2);
-    }
-
-    /**
-     * Finds inverse number $inv for $num by modulus $mod, such as:
-     *     $inv * $num = 1 (mod $mod)
-     *
-     * @param big_int resource $num
-     * @param big_int resource $mod
-     * @return big_int resource
-     * @access public
-     */
-    function invmod($num, $mod)
-    {
-        return bi_invmod($num, $mod);
-    }
-
-    /**
-     * Returns bit length of number $num
-     *
-     * @param big_int resource $num
-     * @return int
-     * @access public
-     */
-    function bitLen($num)
-    {
-        return bi_bit_len($num);
-    }
-
-    /**
-     * Calculates bitwise or of $num1 and $num2,
-     * starting from bit $start_pos for number $num1
-     *
-     * @param big_int resource $num1
-     * @param big_int resource $num2
-     * @param int $start_pos
-     * @return big_int resource
-     * @access public
-     */
-    function bitOr($num1, $num2, $start_pos)
-    {
-        return bi_or($num1, $num2, $start_pos);
-    }
-
-    /**
-     * Returns part of number $num, starting at bit
-     * position $start with length $length
-     *
-     * @param big_int resource $num
-     * @param int start
-     * @param int length
-     * @return big_int resource
-     * @access public
-     */
-    function subint($num, $start, $length)
-    {
-        return bi_subint($num, $start, $length);
-    }
-
-    /**
-     * Returns name of current wrapper
-     *
-     * @return string name of current wrapper
-     * @access public
-     */
-    function getWrapperName()
-    {
-        return 'BigInt';
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php b/plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php
deleted file mode 100644 (file)
index 54e4c34..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version    1.2.0b
- * @link       http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * Crypt_RSA_Math_GMP class.
- *
- * Provides set of math functions, which are used by Crypt_RSA package
- * This class is a wrapper for PHP GMP extension.
- * See http://php.net/gmp for details.
- *
- * @category   Encryption
- * @package    Crypt_RSA
- * @author     Alexander Valyalkin <valyala@gmail.com>
- * @copyright  2005, 2006 Alexander Valyalkin
- * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
- * @link       http://pear.php.net/package/Crypt_RSA
- * @version    @package_version@
- * @access     public
- */
-class Crypt_RSA_Math_GMP
-{
-    /**
-     * error description
-     *
-     * @var string
-     * @access public
-     */
-    var $errstr = '';
-
-    /**
-     * Crypt_RSA_Math_GMP constructor.
-     * Checks an existance of PHP GMP package.
-     * See http://php.net/gmp for details.
-     *
-     * On failure saves error description in $this->errstr
-     *
-     * @access public
-     */
-    function Crypt_RSA_Math_GMP()
-    {
-        if (!extension_loaded('gmp')) {
-            if (!@dl('gmp.' . PHP_SHLIB_SUFFIX) && !@dl('php_gmp.' . PHP_SHLIB_SUFFIX)) {
-                // cannot load GMP extension
-                $this->errstr = 'Crypt_RSA package requires PHP GMP package. ' .
-                     'See http://php.net/gmp for details';
-                return;
-            }
-        }
-    }
-
-    /**
-     * Transforms binary representation of large integer into its native form.
-     * 
-     * Example of transformation:
-     *    $str = "\x12\x34\x56\x78\x90";
-     *    $num = 0x9078563412;
-     *
-     * @param string $str
-     * @return gmp resource
-     * @access public
-     */
-    function bin2int($str)
-    {
-        $result = 0;
-        $n = strlen($str);
-        do {
-            // dirty hack: GMP returns FALSE, when second argument equals to int(0).
-            // so, it must be converted to string '0'
-            $result = gmp_add(gmp_mul($result, 256), strval(ord($str{--$n})));
-        } while ($n > 0);
-        return $result;
-    }
-
-    /**
-     * Transforms large integer into binary representation.
-     * 
-     * Example of transformation:
-     *    $num = 0x9078563412;
-     *    $str = "\x12\x34\x56\x78\x90";
-     *
-     * @param gmp resource $num
-     * @return string
-     * @access public
-     */
-    function int2bin($num)
-    {
-        $result = '';
-        do {
-            $result .= chr(gmp_intval(gmp_mod($num, 256)));
-            $num = gmp_div($num, 256);
-        } while (gmp_cmp($num, 0));
-        return $result;
-    }
-
-    /**
-     * Calculates pow($num, $pow) (mod $mod)
-     *
-     * @param gmp resource $num
-     * @param gmp resource $pow
-     * @param gmp resource $mod
-     * @return gmp resource
-     * @access public
-     */
-    function powmod($num, $pow, $mod)
-    {
-        return gmp_powm($num, $pow, $mod);
-    }
-
-    /**
-     * Calculates $num1 * $num2
-     *
-     * @param gmp resource $num1
-     * @param gmp resource $num2
-     * @return gmp resource
-     * @access public
-     */
-    function mul($num1, $num2)
-    {
-        return gmp_mul($num1, $num2);
-    }
-
-    /**
-     * Calculates $num1 % $num2
-     *
-     * @param string $num1
-     * @param string $num2
-     * @return string
-     * @access public
-     */
-    function mod($num1, $num2)
-    {
-        return gmp_mod($num1, $num2);
-    }
-
-    /**
-     * Compares abs($num1) to abs($num2).
-     * Returns:
-     *   -1, if abs($num1) < abs($num2)
-     *   0, if abs($num1) == abs($num2)
-     *   1, if abs($num1) > abs($num2)
-     *
-     * @param gmp resource $num1
-     * @param gmp resource $num2
-     * @return int
-     * @access public
-     */
-    function cmpAbs($num1, $num2)
-    {
-        return gmp_cmp($num1, $num2);
-    }
-
-    /**
-     * Tests $num on primality. Returns true, if $num is strong pseudoprime.
-     * Else returns false.
-     *
-     * @param string $num
-     * @return bool
-     * @access private
-     */
-    function isPrime($num)
-    {
-        return gmp_prob_prime($num) ? true : false;
-    }
-
-    /**
-     * Generates prime number with length $bits_cnt
-     * using $random_generator as random generator function.
-     *
-     * @param int $bits_cnt
-     * @param string $rnd_generator
-     * @access public
-     */
-    function getPrime($bits_cnt, $random_generator)
-    {
-        $bytes_n = intval($bits_cnt / 8);
-        $bits_n = $bits_cnt % 8;
-        do {
-            $str = '';
-            for ($i = 0; $i < $bytes_n; $i++) {
-                $str .= chr(call_user_func($random_generator) & 0xff);
-            }
-            $n = call_user_func($random_generator) & 0xff;
-            $n |= 0x80;
-            $n >>= 8 - $bits_n;
-            $str .= chr($n);
-            $num = $this->bin2int($str);
-
-            // search for the next closest prime number after [$num]
-            if (!gmp_cmp(gmp_mod($num, '2'), '0')) {
-                $num = gmp_add($num, '1');
-            }
-            while (!gmp_prob_prime($num)) {
-                $num = gmp_add($num, '2');
-            }
-        } while ($this->bitLen($num) != $bits_cnt);
-        return $num;
-    }
-
-    /**
-     * Calculates $num - 1
-     *
-     * @param gmp resource $num
-     * @return gmp resource
-     * @access public
-     */
-    function dec($num)
-    {
-        return gmp_sub($num, 1);
-    }
-
-    /**
-     * Returns true, if $num is equal to one. Else returns false
-     *
-     * @param gmp resource $num
-     * @return bool
-     * @access public
-     */
-    function isOne($num)
-    {
-        return !gmp_cmp($num, 1);
-    }
-
-    /**
-     * Finds greatest common divider (GCD) of $num1 and $num2
-     *
-     * @param gmp resource $num1
-     * @param gmp resource $num2
-     * @return gmp resource
-     * @access public
-     */
-    function GCD($num1, $num2)
-    {
-        return gmp_gcd($num1, $num2);
-    }
-
-    /**
-     * Finds inverse number $inv for $num by modulus $mod, such as:
-     *     $inv * $num = 1 (mod $mod)
-     *
-     * @param gmp resource $num
-     * @param gmp resource $mod
-     * @return gmp resource
-     * @access public
-     */
-    function invmod($num, $mod)
-    {
-        return gmp_invert($num, $mod);
-    }
-
-    /**
-     * Returns bit length of number $num
-     *
-     * @param gmp resource $num
-     * @return int
-     * @access public
-     */
-    function bitLen($num)
-    {
-        $tmp = $this->int2bin($num);
-        $bit_len = strlen($tmp) * 8;
-        $tmp = ord($tmp{strlen($tmp) - 1});
-        if (!$tmp) {
-            $bit_len -= 8;
-        }
-        else {
-            while (!($tmp & 0x80)) {
-                $bit_len--;
-                $tmp <<= 1;
-            }
-        }
-        return $bit_len;
-    }
-
-    /**
-     * Calculates bitwise or of $num1 and $num2,
-     * starting from bit $start_pos for number $num1
-     *
-     * @param gmp resource $num1
-     * @param gmp resource $num2
-     * @param int $start_pos
-     * @return gmp resource
-     * @access public
-     */
-    function bitOr($num1, $num2, $start_pos)
-    {
-        $start_byte = intval($start_pos / 8);
-        $start_bit = $start_pos % 8;
-        $tmp1 = $this->int2bin($num1);
-
-        $num2 = gmp_mul($num2, 1 << $start_bit);
-        $tmp2 = $this->int2bin($num2);
-        if ($start_byte < strlen($tmp1)) {
-            $tmp2 |= substr($tmp1, $start_byte);
-            $tmp1 = substr($tmp1, 0, $start_byte) . $tmp2;
-        }
-        else {
-            $tmp1 = str_pad($tmp1, $start_byte, "\0") . $tmp2;
-        }
-        return $this->bin2int($tmp1);
-    }
-
-    /**
-     * Returns part of number $num, starting at bit
-     * position $start with length $length
-     *
-     * @param gmp resource $num
-     * @param int start
-     * @param int length
-     * @return gmp resource
-     * @access public
-     */
-    function subint($num, $start, $length)
-    {
-        $start_byte = intval($start / 8);
-        $start_bit = $start % 8;
-        $byte_length = intval($length / 8);
-        $bit_length = $length % 8;
-        if ($bit_length) {
-            $byte_length++;
-        }
-        $num = gmp_div($num, 1 << $start_bit);
-        $tmp = substr($this->int2bin($num), $start_byte, $byte_length);
-        $tmp = str_pad($tmp, $byte_length, "\0");
-        $tmp = substr_replace($tmp, $tmp{$byte_length - 1} & chr(0xff >> (8 - $bit_length)), $byte_length - 1, 1);
-        return $this->bin2int($tmp);
-    }
-
-    /**
-     * Returns name of current wrapper
-     *
-     * @return string name of current wrapper
-     * @access public
-     */
-    function getWrapperName()
-    {
-        return 'GMP';
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RSA/MathLoader.php b/plugins/OStatus/extlib/Crypt/RSA/MathLoader.php
deleted file mode 100644 (file)
index de6c946..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
- * Crypt_RSA allows to do following operations:
- *     - key pair generation
- *     - encryption and decryption
- *     - signing and sign validation
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright Alexander Valyalkin 2005
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   CVS: $Id: MathLoader.php,v 1.5 2009/01/05 08:30:29 clockwerx Exp $
- * @link      http://pear.php.net/package/Crypt_RSA
- */
-
-/**
- * RSA error handling facilities
- */
-require_once 'Crypt/RSA/ErrorHandler.php';
-
-/**
- * Crypt_RSA_MathLoader class.
- *
- * Provides static function:
- *  - loadWrapper($wrapper_name) - loads RSA math wrapper with name $wrapper_name
- *                                 or most suitable wrapper if $wrapper_name == 'default'
- *
- * Example usage:
- *    // load BigInt wrapper
- *    $big_int_wrapper = Crypt_RSA_MathLoader::loadWrapper('BigInt');
- * 
- *    // load BCMath wrapper
- *    $bcmath_wrapper = Crypt_RSA_MathLoader::loadWrapper('BCMath');
- * 
- *    // load the most suitable wrapper
- *    $bcmath_wrapper = Crypt_RSA_MathLoader::loadWrapper();
- * 
- * @category  Encryption
- * @package   Crypt_RSA
- * @author    Alexander Valyalkin <valyala@gmail.com>
- * @copyright Alexander Valyalkin 2005
- * @license   http://www.php.net/license/3_0.txt  PHP License 3.0
- * @version   Release: @package_version@
- * @link      http://pear.php.net/package/Crypt_RSA
- * @access    public
- */
-class Crypt_RSA_MathLoader
-{
-    /**
-     * Loads RSA math wrapper with name $wrapper_name.
-     * Implemented wrappers can be found at Crypt/RSA/Math folder.
-     * Read docs/Crypt_RSA/docs/math_wrappers.txt for details
-     *
-     * This is a static function:
-     *    // load BigInt wrapper
-     *    $big_int_wrapper = &Crypt_RSA_MathLoader::loadWrapper('BigInt');
-     *
-     *    // load BCMath wrapper
-     *    $bcmath_wrapper = &Crypt_RSA_MathLoader::loadWrapper('BCMath');
-     *
-     * @param string $wrapper_name Name of wrapper
-     *
-     * @return object
-     *         Reference to object of wrapper with name $wrapper_name on success
-     *         or PEAR_Error object on error
-     *
-     * @access public
-     */
-    function loadWrapper($wrapper_name = 'default')
-    {
-        static $math_objects = array();
-        // ordered by performance. GMP is the fastest math library, BCMath - the slowest.
-        static $math_wrappers = array('GMP', 'BigInt', 'BCMath',);
-
-        if (isset($math_objects[$wrapper_name])) {
-            /*
-                wrapper with name $wrapper_name is already loaded and created.
-                Return reference to existing copy of wrapper
-            */
-            return $math_objects[$wrapper_name];
-        }
-
-        $err_handler = new Crypt_RSA_ErrorHandler();
-
-        if ($wrapper_name === 'default') {
-            // try to load the most suitable wrapper
-            $n = sizeof($math_wrappers);
-            for ($i = 0; $i < $n; $i++) {
-                $obj = Crypt_RSA_MathLoader::loadWrapper($math_wrappers[$i]);
-                if (!$err_handler->isError($obj)) {
-                    // wrapper for $math_wrappers[$i] successfully loaded
-                    // register it as default wrapper and return reference to it
-                    return $math_objects['default'] = $obj;
-                }
-            }
-            // can't load any wrapper
-            $err_handler->pushError("can't load any wrapper for existing math libraries", CRYPT_RSA_ERROR_NO_WRAPPERS);
-            return $err_handler->getLastError();
-        }
-
-        $class_name = 'Crypt_RSA_Math_' . $wrapper_name;
-        $class_filename = dirname(__FILE__) . '/Math/' . $wrapper_name . '.php';
-
-        if (!is_file($class_filename)) {
-            $err_handler->pushError("can't find file [{$class_filename}] for RSA math wrapper [{$wrapper_name}]", CRYPT_RSA_ERROR_NO_FILE);
-            return $err_handler->getLastError();
-        }
-
-        include_once $class_filename;
-        if (!class_exists($class_name)) {
-            $err_handler->pushError("can't find class [{$class_name}] in file [{$class_filename}]", CRYPT_RSA_ERROR_NO_CLASS);
-            return $err_handler->getLastError();
-        }
-
-        // create and return wrapper object on success or PEAR_Error object on error
-        $obj = new $class_name;
-        if ($obj->errstr) {
-            // cannot load required extension for math wrapper
-            $err_handler->pushError($obj->errstr, CRYPT_RSA_ERROR_NO_EXT);
-            return $err_handler->getLastError();
-        }
-        return $math_objects[$wrapper_name] = $obj;
-    }
-}
-
-?>
diff --git a/plugins/OStatus/extlib/Crypt/Random.php b/plugins/OStatus/extlib/Crypt/Random.php
new file mode 100644 (file)
index 0000000..bfc24ca
--- /dev/null
@@ -0,0 +1,125 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Random Number Generator
+ *
+ * PHP versions 4 and 5
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/Random.php');
+ *
+ *    echo crypt_random();
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_Random
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: Random.php,v 1.6 2010/02/28 05:28:38 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Generate a random value.
+ *
+ * On 32-bit machines, the largest distance that can exist between $min and $max is 2**31.
+ * If $min and $max are farther apart than that then the last ($max - range) numbers.
+ *
+ * Depending on how this is being used, it may be worth while to write a replacement.  For example,
+ * a PHP-based web app that stores its data in an SQL database can collect more entropy than this function
+ * can.
+ *
+ * @param optional Integer $min
+ * @param optional Integer $max
+ * @return Integer
+ * @access public
+ */
+function crypt_random($min = 0, $max = 0x7FFFFFFF)
+{
+    if ($min == $max) {
+        return $min;
+    }
+
+    // see http://en.wikipedia.org/wiki//dev/random
+    if (file_exists('/dev/urandom')) {
+        $fp = fopen('/dev/urandom', 'rb');
+        extract(unpack('Nrandom', fread($fp, 4)));
+        fclose($fp);
+
+        // say $min = 0 and $max = 3.  if we didn't do abs() then we could have stuff like this:
+        // -4 % 3 + 0 = -1, even though -1 < $min
+        return abs($random) % ($max - $min) + $min;
+    }
+
+    /* Prior to PHP 4.2.0, mt_srand() had to be called before mt_rand() could be called.
+       Prior to PHP 5.2.6, mt_rand()'s automatic seeding was subpar, as elaborated here:
+
+       http://www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/
+
+       The seeding routine is pretty much ripped from PHP's own internal GENERATE_SEED() macro:
+
+       http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3_2/ext/standard/php_rand.h?view=markup */
+    if (version_compare(PHP_VERSION, '5.2.5', '<=')) { 
+        static $seeded;
+        if (!isset($seeded)) {
+            $seeded = true;
+            mt_srand(fmod(time() * getmypid(), 0x7FFFFFFF) ^ fmod(1000000 * lcg_value(), 0x7FFFFFFF));
+        }
+    }
+
+    static $crypto;
+
+    // The CSPRNG's Yarrow and Fortuna periodically reseed.  This function can be reseeded by hitting F5
+    // in the browser and reloading the page.
+
+    if (!isset($crypto)) {
+        $key = $iv = '';
+        for ($i = 0; $i < 8; $i++) {
+            $key.= pack('n', mt_rand(0, 0xFFFF));
+            $iv .= pack('n', mt_rand(0, 0xFFFF));
+        }
+        switch (true) {
+            case class_exists('Crypt_AES'):
+                $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR);
+                break;
+            case class_exists('Crypt_TripleDES'):
+                $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
+                break;
+            case class_exists('Crypt_DES'):
+                $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR);
+                break;
+            case class_exists('Crypt_RC4'):
+                $crypto = new Crypt_RC4();
+                break;
+            default:
+                extract(unpack('Nrandom', pack('H*', sha1(mt_rand(0, 0x7FFFFFFF)))));
+                return abs($random) % ($max - $min) + $min;
+        }
+        $crypto->setKey($key);
+        $crypto->setIV($iv);
+    }
+
+    extract(unpack('Nrandom', $crypto->encrypt("\0\0\0\0")));
+    return abs($random) % ($max - $min) + $min;
+}
+?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/Rijndael.php b/plugins/OStatus/extlib/Crypt/Rijndael.php
new file mode 100644 (file)
index 0000000..3b5fd6a
--- /dev/null
@@ -0,0 +1,1242 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementation of Rijndael.
+ *
+ * Does not use mcrypt, even when available, for reasons that are explained below.
+ *
+ * PHP versions 4 and 5
+ *
+ * If {@link Crypt_Rijndael::setBlockLength() setBlockLength()} isn't called, it'll be assumed to be 128 bits.  If 
+ * {@link Crypt_Rijndael::setKeyLength() setKeyLength()} isn't called, it'll be calculated from 
+ * {@link Crypt_Rijndael::setKey() setKey()}.  ie. if the key is 128-bits, the key length will be 128-bits.  If it's 
+ * 136-bits it'll be null-padded to 160-bits and 160 bits will be the key length until 
+ * {@link Crypt_Rijndael::setKey() setKey()} is called, again, at which point, it'll be recalculated.
+ *
+ * Not all Rijndael implementations may support 160-bits or 224-bits as the block length / key length.  mcrypt, for example,
+ * does not.  AES, itself, only supports block lengths of 128 and key lengths of 128, 192, and 256.
+ * {@link http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=10 Rijndael-ammended.pdf#page=10} defines the
+ * algorithm for block lengths of 192 and 256 but not for block lengths / key lengths of 160 and 224.  Indeed, 160 and 224
+ * are first defined as valid key / block lengths in 
+ * {@link http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=44 Rijndael-ammended.pdf#page=44}: 
+ * Extensions: Other block and Cipher Key lengths.
+ *
+ * {@internal The variable names are the same as those in 
+ * {@link http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf#page=10 fips-197.pdf#page=10}.}}
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/Rijndael.php');
+ *
+ *    $rijndael = new Crypt_Rijndael();
+ *
+ *    $rijndael->setKey('abcdefghijklmnop');
+ *
+ *    $size = 10 * 1024;
+ *    $plaintext = '';
+ *    for ($i = 0; $i < $size; $i++) {
+ *        $plaintext.= 'a';
+ *    }
+ *
+ *    echo $rijndael->decrypt($rijndael->encrypt($plaintext));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_Rijndael
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVIII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: Rijndael.php,v 1.12 2010/02/09 06:10:26 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access public
+ * @see Crypt_Rijndael::encrypt()
+ * @see Crypt_Rijndael::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_RIJNDAEL_MODE_CTR', -1);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_RIJNDAEL_MODE_ECB', 1);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_RIJNDAEL_MODE_CBC', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Crypt_Rijndael::Crypt_Rijndael()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_RIJNDAEL_MODE_INTERNAL', 1);
+/**
+ * Toggles the mcrypt implementation
+ */
+define('CRYPT_RIJNDAEL_MODE_MCRYPT', 2);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of Rijndael.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_Rijndael
+ */
+class Crypt_Rijndael {
+    /**
+     * The Encryption Mode
+     *
+     * @see Crypt_Rijndael::Crypt_Rijndael()
+     * @var Integer
+     * @access private
+     */
+    var $mode;
+
+    /**
+     * The Key
+     *
+     * @see Crypt_Rijndael::setKey()
+     * @var String
+     * @access private
+     */
+    var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+
+    /**
+     * The Initialization Vector
+     *
+     * @see Crypt_Rijndael::setIV()
+     * @var String
+     * @access private
+     */
+    var $iv = '';
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_Rijndael::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $encryptIV = '';
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_Rijndael::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $decryptIV = '';
+
+    /**
+     * Continuous Buffer status
+     *
+     * @see Crypt_Rijndael::enableContinuousBuffer()
+     * @var Boolean
+     * @access private
+     */
+    var $continuousBuffer = false;
+
+    /**
+     * Padding status
+     *
+     * @see Crypt_Rijndael::enablePadding()
+     * @var Boolean
+     * @access private
+     */
+    var $padding = true;
+
+    /**
+     * Does the key schedule need to be (re)calculated?
+     *
+     * @see setKey()
+     * @see setBlockLength()
+     * @see setKeyLength()
+     * @var Boolean
+     * @access private
+     */
+    var $changed = true;
+
+    /**
+     * Has the key length explicitly been set or should it be derived from the key, itself?
+     *
+     * @see setKeyLength()
+     * @var Boolean
+     * @access private
+     */
+    var $explicit_key_length = false;
+
+    /**
+     * The Key Schedule
+     *
+     * @see _setup()
+     * @var Array
+     * @access private
+     */
+    var $w;
+
+    /**
+     * The Inverse Key Schedule
+     *
+     * @see _setup()
+     * @var Array
+     * @access private
+     */
+    var $dw;
+
+    /**
+     * The Block Length
+     *
+     * @see setBlockLength()
+     * @var Integer
+     * @access private
+     * @internal The max value is 32, the min value is 16.  All valid values are multiples of 4.  Exists in conjunction with
+     *     $Nb because we need this value and not $Nb to pad strings appropriately.  
+     */
+    var $block_size = 16;
+
+    /**
+     * The Block Length divided by 32
+     *
+     * @see setBlockLength()
+     * @var Integer
+     * @access private
+     * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4.  Exists in conjunction with $block_size 
+     *    because the encryption / decryption / key schedule creation requires this number and not $block_size.  We could 
+     *    derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
+     *    of that, we'll just precompute it once.
+     *
+     */
+    var $Nb = 4;
+
+    /**
+     * The Key Length
+     *
+     * @see setKeyLength()
+     * @var Integer
+     * @access private
+     * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16.  Exists in conjunction with $key_size
+     *    because the encryption / decryption / key schedule creation requires this number and not $key_size.  We could 
+     *    derive this from $key_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
+     *    of that, we'll just precompute it once.
+     */
+    var $key_size = 16;
+
+    /**
+     * The Key Length divided by 32
+     *
+     * @see setKeyLength()
+     * @var Integer
+     * @access private
+     * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4
+     */
+    var $Nk = 4;
+
+    /**
+     * The Number of Rounds
+     *
+     * @var Integer
+     * @access private
+     * @internal The max value is 14, the min value is 10.
+     */
+    var $Nr;
+
+    /**
+     * Shift offsets
+     *
+     * @var Array
+     * @access private
+     */
+    var $c;
+
+    /**
+     * Precomputed mixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $t0;
+
+    /**
+     * Precomputed mixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $t1;
+
+    /**
+     * Precomputed mixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $t2;
+
+    /**
+     * Precomputed mixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $t3;
+
+    /**
+     * Precomputed invMixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $dt0;
+
+    /**
+     * Precomputed invMixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $dt1;
+
+    /**
+     * Precomputed invMixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $dt2;
+
+    /**
+     * Precomputed invMixColumns table
+     *
+     * @see Crypt_Rijndael()
+     * @var Array
+     * @access private
+     */
+    var $dt3;
+
+    /**
+     * Default Constructor.
+     *
+     * Determines whether or not the mcrypt extension should be used.  $mode should only, at present, be
+     * CRYPT_RIJNDAEL_MODE_ECB or CRYPT_RIJNDAEL_MODE_CBC.  If not explictly set, CRYPT_RIJNDAEL_MODE_CBC will be used.
+     *
+     * @param optional Integer $mode
+     * @return Crypt_Rijndael
+     * @access public
+     */
+    function Crypt_Rijndael($mode = CRYPT_RIJNDAEL_MODE_CBC)
+    {
+        switch ($mode) {
+            case CRYPT_RIJNDAEL_MODE_ECB:
+            case CRYPT_RIJNDAEL_MODE_CBC:
+            case CRYPT_RIJNDAEL_MODE_CTR:
+                $this->mode = $mode;
+                break;
+            default:
+                $this->mode = CRYPT_RIJNDAEL_MODE_CBC;
+        }
+
+        $t3 = &$this->t3;
+        $t2 = &$this->t2;
+        $t1 = &$this->t1;
+        $t0 = &$this->t0;
+
+        $dt3 = &$this->dt3;
+        $dt2 = &$this->dt2;
+        $dt1 = &$this->dt1;
+        $dt0 = &$this->dt0;
+
+        // according to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=19> (section 5.2.1), 
+        // precomputed tables can be used in the mixColumns phase.  in that example, they're assigned t0...t3, so
+        // those are the names we'll use.
+        $t3 = array(
+            0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, 
+            0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, 
+            0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, 
+            0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, 
+            0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, 
+            0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, 
+            0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, 
+            0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 
+            0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, 
+            0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, 
+            0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 
+            0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, 
+            0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, 
+            0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, 
+            0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, 
+            0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, 
+            0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, 
+            0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, 
+            0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, 
+            0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, 
+            0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, 
+            0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, 
+            0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 
+            0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, 
+            0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, 
+            0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 
+            0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, 
+            0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, 
+            0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, 
+            0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, 
+            0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, 
+            0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
+        );
+
+        $dt3 = array(
+            0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, 
+            0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, 
+            0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, 
+            0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, 
+            0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, 
+            0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, 
+            0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, 
+            0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 
+            0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, 
+            0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, 
+            0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, 
+            0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, 
+            0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, 
+            0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, 
+            0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, 
+            0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, 
+            0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, 
+            0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, 
+            0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, 
+            0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, 
+            0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, 
+            0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, 
+            0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 
+            0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, 
+            0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, 
+            0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, 
+            0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, 
+            0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, 
+            0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, 
+            0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, 
+            0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, 
+            0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
+        );
+
+        for ($i = 0; $i < 256; $i++) {
+            $t2[$i <<  8] = (($t3[$i] <<  8) & 0xFFFFFF00) | (($t3[$i] >> 24) & 0x000000FF);
+            $t1[$i << 16] = (($t3[$i] << 16) & 0xFFFF0000) | (($t3[$i] >> 16) & 0x0000FFFF);
+            $t0[$i << 24] = (($t3[$i] << 24) & 0xFF000000) | (($t3[$i] >>  8) & 0x00FFFFFF);
+
+            $dt2[$i <<  8] = (($this->dt3[$i] <<  8) & 0xFFFFFF00) | (($dt3[$i] >> 24) & 0x000000FF);
+            $dt1[$i << 16] = (($this->dt3[$i] << 16) & 0xFFFF0000) | (($dt3[$i] >> 16) & 0x0000FFFF);
+            $dt0[$i << 24] = (($this->dt3[$i] << 24) & 0xFF000000) | (($dt3[$i] >>  8) & 0x00FFFFFF);
+        }
+    }
+
+    /**
+     * Sets the key.
+     *
+     * Keys can be of any length.  Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and
+     * whose length is a multiple of 32.  If the key is less than 256-bits and the key length isn't set, we round the length
+     * up to the closest valid key length, padding $key with null bytes.  If the key is more than 256-bits, we trim the
+     * excess bits.
+     *
+     * If the key is not explicitly set, it'll be assumed to be all null bytes.
+     *
+     * @access public
+     * @param String $key
+     */
+    function setKey($key)
+    {
+        $this->key = $key;
+        $this->changed = true;
+    }
+
+    /**
+     * Sets the initialization vector. (optional)
+     *
+     * SetIV is not required when CRYPT_RIJNDAEL_MODE_ECB is being used.  If not explictly set, it'll be assumed
+     * to be all zero's.
+     *
+     * @access public
+     * @param String $iv
+     */
+    function setIV($iv)
+    {
+        $this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($iv, 0, $this->block_size), $this->block_size, chr(0));;
+    }
+
+    /**
+     * Sets the key length
+     *
+     * Valid key lengths are 128, 160, 192, 224, and 256.  If the length is less than 128, it will be rounded up to
+     * 128.  If the length is greater then 128 and invalid, it will be rounded down to the closest valid amount.
+     *
+     * @access public
+     * @param Integer $length
+     */
+    function setKeyLength($length)
+    {
+        $length >>= 5;
+        if ($length > 8) {
+            $length = 8;
+        } else if ($length < 4) {
+            $length = 4;
+        }
+        $this->Nk = $length;
+        $this->key_size = $length << 2;
+
+        $this->explicit_key_length = true;
+        $this->changed = true;
+    }
+
+    /**
+     * Sets the block length
+     *
+     * Valid block lengths are 128, 160, 192, 224, and 256.  If the length is less than 128, it will be rounded up to
+     * 128.  If the length is greater then 128 and invalid, it will be rounded down to the closest valid amount.
+     *
+     * @access public
+     * @param Integer $length
+     */
+    function setBlockLength($length)
+    {
+        $length >>= 5;
+        if ($length > 8) {
+            $length = 8;
+        } else if ($length < 4) {
+            $length = 4;
+        }
+        $this->Nb = $length;
+        $this->block_size = $length << 2;
+        $this->changed = true;
+    }
+
+    /**
+     * Generate CTR XOR encryption key
+     *
+     * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the
+     * plaintext / ciphertext in CTR mode.
+     *
+     * @see Crypt_Rijndael::decrypt()
+     * @see Crypt_Rijndael::encrypt()
+     * @access public
+     * @param Integer $length
+     * @param String $iv
+     */
+    function _generate_xor($length, &$iv)
+    {
+        $xor = '';
+        $block_size = $this->block_size;
+        $num_blocks = floor(($length + ($block_size - 1)) / $block_size);
+        for ($i = 0; $i < $num_blocks; $i++) {
+            $xor.= $iv;
+            for ($j = 4; $j <= $block_size; $j+=4) {
+                $temp = substr($iv, -$j, 4);
+                switch ($temp) {
+                    case "\xFF\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4);
+                        break;
+                    case "\x7F\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4);
+                        break 2;
+                    default:
+                        extract(unpack('Ncount', $temp));
+                        $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4);
+                        break 2;
+                }
+            }
+        }
+
+        return $xor;
+    }
+
+    /**
+     * Encrypts a message.
+     *
+     * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size.  Other Rjindael
+     * implementations may or may not pad in the same manner.  Other common approaches to padding and the reasons why it's
+     * necessary are discussed in the following
+     * URL:
+     *
+     * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
+     *
+     * An alternative to padding is to, separately, send the length of the file.  This is what SSH, in fact, does.
+     * strlen($plaintext) will still need to be a multiple of 8, however, arbitrary values can be added to make it that
+     * length.
+     *
+     * @see Crypt_Rijndael::decrypt()
+     * @access public
+     * @param String $plaintext
+     */
+    function encrypt($plaintext)
+    {
+        $this->_setup();
+        if ($this->mode != CRYPT_RIJNDAEL_MODE_CTR) {
+            $plaintext = $this->_pad($plaintext);
+        }
+
+        $block_size = $this->block_size;
+        $ciphertext = '';
+        switch ($this->mode) {
+            case CRYPT_RIJNDAEL_MODE_ECB:
+                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+                    $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size));
+                }
+                break;
+            case CRYPT_RIJNDAEL_MODE_CBC:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+                    $block = substr($plaintext, $i, $block_size);
+                    $block = $this->_encryptBlock($block ^ $xor);
+                    $xor = $block;
+                    $ciphertext.= $block;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+                break;
+            case CRYPT_RIJNDAEL_MODE_CTR:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+                    $block = substr($plaintext, $i, $block_size);
+                    $key = $this->_encryptBlock($this->_generate_xor($block_size, $xor));
+                    $ciphertext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+        }
+
+        return $ciphertext;
+    }
+
+    /**
+     * Decrypts a message.
+     *
+     * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until
+     * it is.
+     *
+     * @see Crypt_Rijndael::encrypt()
+     * @access public
+     * @param String $ciphertext
+     */
+    function decrypt($ciphertext)
+    {
+        $this->_setup();
+
+        if ($this->mode != CRYPT_RIJNDAEL_MODE_CTR) {
+            // we pad with chr(0) since that's what mcrypt_generic does.  to quote from http://php.net/function.mcrypt-generic :
+            // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+            $ciphertext = str_pad($ciphertext, (strlen($ciphertext) + $this->block_size - 1) % $this->block_size, chr(0));
+        }
+
+        $block_size = $this->block_size;
+        $plaintext = '';
+        switch ($this->mode) {
+            case CRYPT_RIJNDAEL_MODE_ECB:
+                for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+                    $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size));
+                }
+                break;
+            case CRYPT_RIJNDAEL_MODE_CBC:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+                    $block = substr($ciphertext, $i, $block_size);
+                    $plaintext.= $this->_decryptBlock($block) ^ $xor;
+                    $xor = $block;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+                break;
+            case CRYPT_RIJNDAEL_MODE_CTR:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+                    $block = substr($ciphertext, $i, $block_size);
+                    $key = $this->_encryptBlock($this->_generate_xor($block_size, $xor));
+                    $plaintext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+        }
+
+        return $this->mode != CRYPT_RIJNDAEL_MODE_CTR ? $this->_unpad($plaintext) : $plaintext;
+    }
+
+    /**
+     * Encrypts a block
+     *
+     * @access private
+     * @param String $in
+     * @return String
+     */
+    function _encryptBlock($in)
+    {
+        $state = array();
+        $words = unpack('N*word', $in);
+
+        $w = $this->w;
+        $t0 = $this->t0;
+        $t1 = $this->t1;
+        $t2 = $this->t2;
+        $t3 = $this->t3;
+        $Nb = $this->Nb;
+        $Nr = $this->Nr;
+        $c = $this->c;
+
+        // addRoundKey
+        $i = 0;
+        foreach ($words as $word) {
+            $state[] = $word ^ $w[0][$i++];
+        }
+
+        // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - 
+        // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding 
+        // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf.
+        // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization.
+        // Unfortunately, the description given there is not quite correct.  Per aes.spec.v316.pdf#page=19 [1], 
+        // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well.
+
+        // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf
+        $temp = array();
+        for ($round = 1; $round < $Nr; $round++) {
+            $i = 0; // $c[0] == 0
+            $j = $c[1];
+            $k = $c[2];
+            $l = $c[3];
+
+            while ($i < $this->Nb) {
+                $temp[$i] = $t0[$state[$i] & 0xFF000000] ^ 
+                            $t1[$state[$j] & 0x00FF0000] ^ 
+                            $t2[$state[$k] & 0x0000FF00] ^ 
+                            $t3[$state[$l] & 0x000000FF] ^ 
+                            $w[$round][$i];
+                $i++;
+                $j = ($j + 1) % $Nb;
+                $k = ($k + 1) % $Nb;
+                $l = ($l + 1) % $Nb;
+            }
+
+            for ($i = 0; $i < $Nb; $i++) {
+                $state[$i] = $temp[$i];
+            }
+        }
+
+        // subWord
+        for ($i = 0; $i < $Nb; $i++) {
+            $state[$i] = $this->_subWord($state[$i]);
+        }
+
+        // shiftRows + addRoundKey
+        $i = 0; // $c[0] == 0
+        $j = $c[1];
+        $k = $c[2];
+        $l = $c[3];
+        while ($i < $this->Nb) {
+            $temp[$i] = ($state[$i] & 0xFF000000) ^ 
+                        ($state[$j] & 0x00FF0000) ^ 
+                        ($state[$k] & 0x0000FF00) ^ 
+                        ($state[$l] & 0x000000FF) ^
+                         $w[$Nr][$i];
+            $i++;
+            $j = ($j + 1) % $Nb;
+            $k = ($k + 1) % $Nb;
+            $l = ($l + 1) % $Nb;
+        }
+        $state = $temp;
+
+        array_unshift($state, 'N*');
+
+        return call_user_func_array('pack', $state);
+    }
+
+    /**
+     * Decrypts a block
+     *
+     * @access private
+     * @param String $in
+     * @return String
+     */
+    function _decryptBlock($in)
+    {
+        $state = array();
+        $words = unpack('N*word', $in);
+
+        $num_states = count($state);
+        $dw = $this->dw;
+        $dt0 = $this->dt0;
+        $dt1 = $this->dt1;
+        $dt2 = $this->dt2;
+        $dt3 = $this->dt3;
+        $Nb = $this->Nb;
+        $Nr = $this->Nr;
+        $c = $this->c;
+
+        // addRoundKey
+        $i = 0;
+        foreach ($words as $word) {
+            $state[] = $word ^ $dw[$Nr][$i++];
+        }
+
+        $temp = array();
+        for ($round = $Nr - 1; $round > 0; $round--) {
+            $i = 0; // $c[0] == 0
+            $j = $Nb - $c[1];
+            $k = $Nb - $c[2];
+            $l = $Nb - $c[3];
+
+            while ($i < $Nb) {
+                $temp[$i] = $dt0[$state[$i] & 0xFF000000] ^ 
+                            $dt1[$state[$j] & 0x00FF0000] ^ 
+                            $dt2[$state[$k] & 0x0000FF00] ^ 
+                            $dt3[$state[$l] & 0x000000FF] ^ 
+                            $dw[$round][$i];
+                $i++;
+                $j = ($j + 1) % $Nb;
+                $k = ($k + 1) % $Nb;
+                $l = ($l + 1) % $Nb;
+            }
+
+            for ($i = 0; $i < $Nb; $i++) {
+                $state[$i] = $temp[$i];
+            }
+        }
+
+        // invShiftRows + invSubWord + addRoundKey
+        $i = 0; // $c[0] == 0
+        $j = $Nb - $c[1];
+        $k = $Nb - $c[2];
+        $l = $Nb - $c[3];
+
+        while ($i < $Nb) {
+            $temp[$i] = $dw[0][$i] ^ 
+                        $this->_invSubWord(($state[$i] & 0xFF000000) | 
+                                           ($state[$j] & 0x00FF0000) | 
+                                           ($state[$k] & 0x0000FF00) | 
+                                           ($state[$l] & 0x000000FF));
+            $i++;
+            $j = ($j + 1) % $Nb;
+            $k = ($k + 1) % $Nb;
+            $l = ($l + 1) % $Nb;
+        }
+
+        $state = $temp;
+
+        array_unshift($state, 'N*');
+
+        return call_user_func_array('pack', $state);
+    }
+
+    /**
+     * Setup Rijndael
+     *
+     * Validates all the variables and calculates $Nr - the number of rounds that need to be performed - and $w - the key
+     * key schedule.
+     *
+     * @access private
+     */
+    function _setup()
+    {
+        // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field.
+        // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse
+        static $rcon = array(0,
+            0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
+            0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
+            0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000,
+            0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000,
+            0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000,
+            0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000
+        );
+
+        if (!$this->changed) {
+            return;
+        }
+
+        if (!$this->explicit_key_length) {
+            // we do >> 2, here, and not >> 5, as we do above, since strlen($this->key) tells us the number of bytes - not bits
+            $length = strlen($this->key) >> 2;
+            if ($length > 8) {
+                $length = 8;
+            } else if ($length < 4) {
+                $length = 4;
+            }
+            $this->Nk = $length;
+            $this->key_size = $length << 2;
+        }
+
+        $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, chr(0));
+        $this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, chr(0));
+
+        // see Rijndael-ammended.pdf#page=44
+        $this->Nr = max($this->Nk, $this->Nb) + 6;
+
+        // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44,
+        //     "Table 8: Shift offsets in Shiftrow for the alternative block lengths"
+        // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14,
+        //     "Table 2: Shift offsets for different block lengths"
+        switch ($this->Nb) {
+            case 4:
+            case 5:
+            case 6:
+                $this->c = array(0, 1, 2, 3);
+                break;
+            case 7:
+                $this->c = array(0, 1, 2, 4);
+                break;
+            case 8:
+                $this->c = array(0, 1, 3, 4);
+        }
+
+        $key = $this->key;
+
+        $w = array_values(unpack('N*words', $key));
+
+        $length = $this->Nb * ($this->Nr + 1);
+        for ($i = $this->Nk; $i < $length; $i++) {
+            $temp = $w[$i - 1];
+            if ($i % $this->Nk == 0) {
+                // according to <http://php.net/language.types.integer>, "the size of an integer is platform-dependent".
+                // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine,
+                // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and'
+                // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
+                $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
+                $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
+            } else if ($this->Nk > 6 && $i % $this->Nk == 4) {
+                $temp = $this->_subWord($temp);
+            }
+            $w[$i] = $w[$i - $this->Nk] ^ $temp;
+        }
+
+        // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns
+        // and generate the inverse key schedule.  more specifically,
+        // according to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=23> (section 5.3.3), 
+        // "The key expansion for the Inverse Cipher is defined as follows:
+        //        1. Apply the Key Expansion.
+        //        2. Apply InvMixColumn to all Round Keys except the first and the last one."
+        // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
+        $temp = array();
+        for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
+            if ($col == $this->Nb) {
+                if ($row == 0) {
+                    $this->dw[0] = $this->w[0];
+                } else {
+                    // subWord + invMixColumn + invSubWord = invMixColumn
+                    $j = 0;
+                    while ($j < $this->Nb) {
+                        $dw = $this->_subWord($this->w[$row][$j]);
+                        $temp[$j] = $this->dt0[$dw & 0xFF000000] ^ 
+                                    $this->dt1[$dw & 0x00FF0000] ^ 
+                                    $this->dt2[$dw & 0x0000FF00] ^ 
+                                    $this->dt3[$dw & 0x000000FF];
+                        $j++;
+                    }
+                    $this->dw[$row] = $temp;
+                }
+
+                $col = 0;
+                $row++;
+            }
+            $this->w[$row][$col] = $w[$i];
+        }
+
+        $this->dw[$row] = $this->w[$row];
+
+        $this->changed = false;
+    }
+
+    /**
+     * Performs S-Box substitutions
+     *
+     * @access private
+     */
+    function _subWord($word)
+    {
+        static $sbox0, $sbox1, $sbox2, $sbox3;
+
+        if (empty($sbox0)) {
+            $sbox0 = array(
+                0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+                0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+                0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+                0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+                0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+                0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+                0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+                0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+                0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+                0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+                0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+                0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+                0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+                0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+                0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+                0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
+            );
+
+            $sbox1 = array();
+            $sbox2 = array();
+            $sbox3 = array();
+
+            for ($i = 0; $i < 256; $i++) {
+                $sbox1[$i <<  8] = $sbox0[$i] <<  8;
+                $sbox2[$i << 16] = $sbox0[$i] << 16;
+                $sbox3[$i << 24] = $sbox0[$i] << 24;
+            }
+        }
+
+        return $sbox0[$word & 0x000000FF] | 
+               $sbox1[$word & 0x0000FF00] | 
+               $sbox2[$word & 0x00FF0000] | 
+               $sbox3[$word & 0xFF000000];
+    }
+
+    /**
+     * Performs inverse S-Box substitutions
+     *
+     * @access private
+     */
+    function _invSubWord($word)
+    {
+        static $sbox0, $sbox1, $sbox2, $sbox3;
+
+        if (empty($sbox0)) {
+            $sbox0 = array(
+                0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+                0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+                0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+                0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+                0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+                0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+                0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+                0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+                0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+                0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+                0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+                0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+                0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+                0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+                0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+                0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
+            );
+
+            $sbox1 = array();
+            $sbox2 = array();
+            $sbox3 = array();
+
+            for ($i = 0; $i < 256; $i++) {
+                $sbox1[$i <<  8] = $sbox0[$i] <<  8;
+                $sbox2[$i << 16] = $sbox0[$i] << 16;
+                $sbox3[$i << 24] = $sbox0[$i] << 24;
+            }
+        }
+
+        return $sbox0[$word & 0x000000FF] | 
+               $sbox1[$word & 0x0000FF00] | 
+               $sbox2[$word & 0x00FF0000] | 
+               $sbox3[$word & 0xFF000000];
+    }
+
+    /**
+     * Pad "packets".
+     *
+     * Rijndael works by encrypting between sixteen and thirty-two bytes at a time, provided that number is also a multiple
+     * of four.  If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to
+     * pad the input so that it is of the proper length.
+     *
+     * Padding is enabled by default.  Sometimes, however, it is undesirable to pad strings.  Such is the case in SSH,
+     * where "packets" are padded with random bytes before being encrypted.  Unpad these packets and you risk stripping
+     * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
+     * transmitted separately)
+     *
+     * @see Crypt_Rijndael::disablePadding()
+     * @access public
+     */
+    function enablePadding()
+    {
+        $this->padding = true;
+    }
+
+    /**
+     * Do not pad packets.
+     *
+     * @see Crypt_Rijndael::enablePadding()
+     * @access public
+     */
+    function disablePadding()
+    {
+        $this->padding = false;
+    }
+
+    /**
+     * Pads a string
+     *
+     * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize.
+     * $block_size - (strlen($text) % $block_size) bytes are added, each of which is equal to 
+     * chr($block_size - (strlen($text) % $block_size)
+     *
+     * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
+     * and padding will, hence forth, be enabled.
+     *
+     * @see Crypt_Rijndael::_unpad()
+     * @access private
+     */
+    function _pad($text)
+    {
+        $length = strlen($text);
+
+        if (!$this->padding) {
+            if ($length % $this->block_size == 0) {
+                return $text;
+            } else {
+                user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})", E_USER_NOTICE);
+                $this->padding = true;
+            }
+        }
+
+        $pad = $this->block_size - ($length % $this->block_size);
+
+        return str_pad($text, $length + $pad, chr($pad));
+    }
+
+    /**
+     * Unpads a string.
+     *
+     * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
+     * and false will be returned.
+     *
+     * @see Crypt_Rijndael::_pad()
+     * @access private
+     */
+    function _unpad($text)
+    {
+        if (!$this->padding) {
+            return $text;
+        }
+
+        $length = ord($text[strlen($text) - 1]);
+
+        if (!$length || $length > $this->block_size) {
+            return false;
+        }
+
+        return substr($text, 0, -$length);
+    }
+
+    /**
+     * Treat consecutive "packets" as if they are a continuous buffer.
+     *
+     * Say you have a 32-byte plaintext $plaintext.  Using the default behavior, the two following code snippets
+     * will yield different outputs:
+     *
+     * <code>
+     *    echo $rijndael->encrypt(substr($plaintext,  0, 16));
+     *    echo $rijndael->encrypt(substr($plaintext, 16, 16));
+     * </code>
+     * <code>
+     *    echo $rijndael->encrypt($plaintext);
+     * </code>
+     *
+     * The solution is to enable the continuous buffer.  Although this will resolve the above discrepancy, it creates
+     * another, as demonstrated with the following:
+     *
+     * <code>
+     *    $rijndael->encrypt(substr($plaintext, 0, 16));
+     *    echo $rijndael->decrypt($des->encrypt(substr($plaintext, 16, 16)));
+     * </code>
+     * <code>
+     *    echo $rijndael->decrypt($des->encrypt(substr($plaintext, 16, 16)));
+     * </code>
+     *
+     * With the continuous buffer disabled, these would yield the same output.  With it enabled, they yield different
+     * outputs.  The reason is due to the fact that the initialization vector's change after every encryption /
+     * decryption round when the continuous buffer is enabled.  When it's disabled, they remain constant.
+     *
+     * Put another way, when the continuous buffer is enabled, the state of the Crypt_Rijndael() object changes after each
+     * encryption / decryption round, whereas otherwise, it'd remain constant.  For this reason, it's recommended that
+     * continuous buffers not be used.  They do offer better security and are, in fact, sometimes required (SSH uses them),
+     * however, they are also less intuitive and more likely to cause you problems.
+     *
+     * @see Crypt_Rijndael::disableContinuousBuffer()
+     * @access public
+     */
+    function enableContinuousBuffer()
+    {
+        $this->continuousBuffer = true;
+    }
+
+    /**
+     * Treat consecutive packets as if they are a discontinuous buffer.
+     *
+     * The default behavior.
+     *
+     * @see Crypt_Rijndael::enableContinuousBuffer()
+     * @access public
+     */
+    function disableContinuousBuffer()
+    {
+        $this->continuousBuffer = false;
+        $this->encryptIV = $this->iv;
+        $this->decryptIV = $this->iv;
+    }
+
+    /**
+     * String Shift
+     *
+     * Inspired by array_shift
+     *
+     * @param String $string
+     * @param optional Integer $index
+     * @return String
+     * @access private
+     */
+    function _string_shift(&$string, $index = 1)
+    {
+        $substr = substr($string, 0, $index);
+        $string = substr($string, $index);
+        return $substr;
+    }
+}
+
+// vim: ts=4:sw=4:et:
+// vim6: fdl=1:
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/TripleDES.php b/plugins/OStatus/extlib/Crypt/TripleDES.php
new file mode 100644 (file)
index 0000000..9d05408
--- /dev/null
@@ -0,0 +1,690 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP implementation of Triple DES.
+ *
+ * Uses mcrypt, if available, and an internal implementation, otherwise.  Operates in the EDE3 mode (encrypt-decrypt-encrypt).
+ *
+ * PHP versions 4 and 5
+ *
+ * Here's a short example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Crypt/TripleDES.php');
+ *
+ *    $des = new Crypt_TripleDES();
+ *
+ *    $des->setKey('abcdefghijklmnopqrstuvwx');
+ *
+ *    $size = 10 * 1024;
+ *    $plaintext = '';
+ *    for ($i = 0; $i < $size; $i++) {
+ *        $plaintext.= 'a';
+ *    }
+ *
+ *    echo $des->decrypt($des->encrypt($plaintext));
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Crypt
+ * @package    Crypt_TripleDES
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVII Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: TripleDES.php,v 1.13 2010/02/26 03:40:25 terrafrost Exp $
+ * @link       http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_DES
+ */
+require_once 'DES.php';
+
+/**
+ * Encrypt / decrypt using inner chaining
+ *
+ * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3).
+ */
+define('CRYPT_DES_MODE_3CBC', 3);
+
+/**
+ * Encrypt / decrypt using outer chaining
+ *
+ * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC.
+ */
+define('CRYPT_DES_MODE_CBC3', CRYPT_DES_MODE_CBC);
+
+/**
+ * Pure-PHP implementation of Triple DES.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 0.1.0
+ * @access  public
+ * @package Crypt_TerraDES
+ */
+class Crypt_TripleDES {
+    /**
+     * The Three Keys
+     *
+     * @see Crypt_TripleDES::setKey()
+     * @var String
+     * @access private
+     */
+    var $key = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * The Encryption Mode
+     *
+     * @see Crypt_TripleDES::Crypt_TripleDES()
+     * @var Integer
+     * @access private
+     */
+    var $mode = CRYPT_DES_MODE_CBC;
+
+    /**
+     * Continuous Buffer status
+     *
+     * @see Crypt_TripleDES::enableContinuousBuffer()
+     * @var Boolean
+     * @access private
+     */
+    var $continuousBuffer = false;
+
+    /**
+     * Padding status
+     *
+     * @see Crypt_TripleDES::enablePadding()
+     * @var Boolean
+     * @access private
+     */
+    var $padding = true;
+
+    /**
+     * The Initialization Vector
+     *
+     * @see Crypt_TripleDES::setIV()
+     * @var String
+     * @access private
+     */
+    var $iv = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_TripleDES::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $encryptIV = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * A "sliding" Initialization Vector
+     *
+     * @see Crypt_TripleDES::enableContinuousBuffer()
+     * @var String
+     * @access private
+     */
+    var $decryptIV = "\0\0\0\0\0\0\0\0";
+
+    /**
+     * The Crypt_DES objects
+     *
+     * @var Array
+     * @access private
+     */
+    var $des;
+
+    /**
+     * mcrypt resource for encryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::encrypt()
+     * @var String
+     * @access private
+     */
+    var $enmcrypt;
+
+    /**
+     * mcrypt resource for decryption
+     *
+     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+     *
+     * @see Crypt_AES::decrypt()
+     * @var String
+     * @access private
+     */
+    var $demcrypt;
+
+    /**
+     * Does the (en|de)mcrypt resource need to be (re)initialized?
+     *
+     * @see setKey()
+     * @see setIV()
+     * @var Boolean
+     * @access private
+     */
+    var $changed = true;
+
+    /**
+     * Default Constructor.
+     *
+     * Determines whether or not the mcrypt extension should be used.  $mode should only, at present, be
+     * CRYPT_DES_MODE_ECB or CRYPT_DES_MODE_CBC.  If not explictly set, CRYPT_DES_MODE_CBC will be used.
+     *
+     * @param optional Integer $mode
+     * @return Crypt_TripleDES
+     * @access public
+     */
+    function Crypt_TripleDES($mode = CRYPT_DES_MODE_CBC)
+    {
+        if ( !defined('CRYPT_DES_MODE') ) {
+            switch (true) {
+                case extension_loaded('mcrypt'):
+                    // i'd check to see if des was supported, by doing in_array('des', mcrypt_list_algorithms('')),
+                    // but since that can be changed after the object has been created, there doesn't seem to be
+                    // a lot of point...
+                    define('CRYPT_DES_MODE', CRYPT_DES_MODE_MCRYPT);
+                    break;
+                default:
+                    define('CRYPT_DES_MODE', CRYPT_DES_MODE_INTERNAL);
+            }
+        }
+
+        if ( $mode == CRYPT_DES_MODE_3CBC ) {
+            $this->mode = CRYPT_DES_MODE_3CBC;
+            $this->des = array(
+                new Crypt_DES(CRYPT_DES_MODE_CBC),
+                new Crypt_DES(CRYPT_DES_MODE_CBC),
+                new Crypt_DES(CRYPT_DES_MODE_CBC)
+            );
+
+            // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects
+            $this->des[0]->disablePadding();
+            $this->des[1]->disablePadding();
+            $this->des[2]->disablePadding();
+
+            return;
+        }
+
+        switch ( CRYPT_DES_MODE ) {
+            case CRYPT_DES_MODE_MCRYPT:
+                switch ($mode) {
+                    case CRYPT_DES_MODE_ECB:
+                        $this->mode = MCRYPT_MODE_ECB;
+                        break;
+                    case CRYPT_DES_MODE_CTR:
+                        $this->mode = 'ctr';
+                        break;
+                    case CRYPT_DES_MODE_CBC:
+                    default:
+                        $this->mode = MCRYPT_MODE_CBC;
+                }
+
+                break;
+            default:
+                $this->des = array(
+                    new Crypt_DES(CRYPT_DES_MODE_ECB),
+                    new Crypt_DES(CRYPT_DES_MODE_ECB),
+                    new Crypt_DES(CRYPT_DES_MODE_ECB)
+                );
+                // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects
+                $this->des[0]->disablePadding();
+                $this->des[1]->disablePadding();
+                $this->des[2]->disablePadding();
+
+                switch ($mode) {
+                    case CRYPT_DES_MODE_ECB:
+                    case CRYPT_DES_MODE_CTR:
+                    case CRYPT_DES_MODE_CBC:
+                        $this->mode = $mode;
+                        break;
+                    default:
+                        $this->mode = CRYPT_DES_MODE_CBC;
+                }
+        }
+    }
+
+    /**
+     * Sets the key.
+     *
+     * Keys can be of any length.  Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or
+     * 192-bit (eg. strlen($key) == 24) keys.  This function pads and truncates $key as appropriate.
+     *
+     * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
+     *
+     * If the key is not explicitly set, it'll be assumed to be all zero's.
+     *
+     * @access public
+     * @param String $key
+     */
+    function setKey($key)
+    {
+        $length = strlen($key);
+        if ($length > 8) {
+            $key = str_pad($key, 24, chr(0));
+            // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this:
+            // http://php.net/function.mcrypt-encrypt#47973
+            //$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24);
+        }
+        $this->key = $key;
+        switch (true) {
+            case CRYPT_DES_MODE == CRYPT_DES_MODE_INTERNAL:
+            case $this->mode == CRYPT_DES_MODE_3CBC:
+                $this->des[0]->setKey(substr($key,  0, 8));
+                $this->des[1]->setKey(substr($key,  8, 8));
+                $this->des[2]->setKey(substr($key, 16, 8));
+        }
+        $this->changed = true;
+    }
+
+    /**
+     * Sets the initialization vector. (optional)
+     *
+     * SetIV is not required when CRYPT_DES_MODE_ECB is being used.  If not explictly set, it'll be assumed
+     * to be all zero's.
+     *
+     * @access public
+     * @param String $iv
+     */
+    function setIV($iv)
+    {
+        $this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($iv, 0, 8), 8, chr(0));
+        if ($this->mode == CRYPT_DES_MODE_3CBC) {
+            $this->des[0]->setIV($iv);
+            $this->des[1]->setIV($iv);
+            $this->des[2]->setIV($iv);
+        }
+        $this->changed = true;
+    }
+
+    /**
+     * Generate CTR XOR encryption key
+     *
+     * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the
+     * plaintext / ciphertext in CTR mode.
+     *
+     * @see Crypt_DES::decrypt()
+     * @see Crypt_DES::encrypt()
+     * @access public
+     * @param Integer $length
+     * @param String $iv
+     */
+    function _generate_xor($length, &$iv)
+    {
+        $xor = '';
+        $num_blocks = ($length + 7) >> 3;
+        for ($i = 0; $i < $num_blocks; $i++) {
+            $xor.= $iv;
+            for ($j = 4; $j <= 8; $j+=4) {
+                $temp = substr($iv, -$j, 4);
+                switch ($temp) {
+                    case "\xFF\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4);
+                        break;
+                    case "\x7F\xFF\xFF\xFF":
+                        $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4);
+                        break 2;
+                    default:
+                        extract(unpack('Ncount', $temp));
+                        $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4);
+                        break 2;
+                }
+            }
+        }
+
+        return $xor;
+    }
+
+    /**
+     * Encrypts a message.
+     *
+     * @access public
+     * @param String $plaintext
+     */
+    function encrypt($plaintext)
+    {
+        if ($this->mode != CRYPT_DES_MODE_CTR && $this->mode != 'ctr') {
+            $plaintext = $this->_pad($plaintext);
+        }
+
+        // if the key is smaller then 8, do what we'd normally do
+        if ($this->mode == CRYPT_DES_MODE_3CBC && strlen($this->key) > 8) {
+            $ciphertext = $this->des[2]->encrypt($this->des[1]->decrypt($this->des[0]->encrypt($plaintext)));
+
+            return $ciphertext;
+        }
+
+        if ( CRYPT_DES_MODE == CRYPT_DES_MODE_MCRYPT ) {
+            if ($this->changed) {
+                if (!isset($this->enmcrypt)) {
+                    $this->enmcrypt = mcrypt_module_open(MCRYPT_3DES, '', $this->mode, '');
+                }
+                mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+                $this->changed = false;
+            }
+
+            $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+            }
+
+            return $ciphertext;
+        }
+
+        if (strlen($this->key) <= 8) {
+            $this->des[0]->mode = $this->mode;
+
+            return $this->des[0]->encrypt($plaintext);
+        }
+
+        // we pad with chr(0) since that's what mcrypt_generic does.  to quote from http://php.net/function.mcrypt-generic :
+        // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+        $plaintext = str_pad($plaintext, ceil(strlen($plaintext) / 8) * 8, chr(0));
+
+        $des = $this->des;
+
+        $ciphertext = '';
+        switch ($this->mode) {
+            case CRYPT_DES_MODE_ECB:
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $block = substr($plaintext, $i, 8);
+                    $block = $des[0]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $block = $des[1]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $block = $des[2]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $ciphertext.= $block;
+                }
+                break;
+            case CRYPT_DES_MODE_CBC:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $block = substr($plaintext, $i, 8) ^ $xor;
+                    $block = $des[0]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $block = $des[1]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $block = $des[2]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $xor = $block;
+                    $ciphertext.= $block;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+                break;
+            case CRYPT_DES_MODE_CTR:
+                $xor = $this->encryptIV;
+                for ($i = 0; $i < strlen($plaintext); $i+=8) {
+                    $key = $this->_generate_xor(8, $xor);
+                    $key = $des[0]->_processBlock($key, CRYPT_DES_ENCRYPT);
+                    $key = $des[1]->_processBlock($key, CRYPT_DES_DECRYPT);
+                    $key = $des[2]->_processBlock($key, CRYPT_DES_ENCRYPT);
+                    $block = substr($plaintext, $i, 8);
+                    $ciphertext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->encryptIV = $xor;
+                }
+        }
+
+        return $ciphertext;
+    }
+
+    /**
+     * Decrypts a message.
+     *
+     * @access public
+     * @param String $ciphertext
+     */
+    function decrypt($ciphertext)
+    {
+        if ($this->mode == CRYPT_DES_MODE_3CBC && strlen($this->key) > 8) {
+            $plaintext = $this->des[0]->decrypt($this->des[1]->encrypt($this->des[2]->decrypt($ciphertext)));
+
+            return $this->_unpad($plaintext);
+        }
+
+        // we pad with chr(0) since that's what mcrypt_generic does.  to quote from http://php.net/function.mcrypt-generic :
+        // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+        $ciphertext = str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, chr(0));
+
+        if ( CRYPT_DES_MODE == CRYPT_DES_MODE_MCRYPT ) {
+            if ($this->changed) {
+                if (!isset($this->demcrypt)) {
+                    $this->demcrypt = mcrypt_module_open(MCRYPT_3DES, '', $this->mode, '');
+                }
+                mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+                $this->changed = false;
+            }
+
+            $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
+
+            if (!$this->continuousBuffer) {
+                mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+            }
+
+            return $this->mode != 'ctr' ? $this->_unpad($plaintext) : $plaintext;
+        }
+
+        if (strlen($this->key) <= 8) {
+            $this->des[0]->mode = $this->mode;
+
+            return $this->_unpad($this->des[0]->decrypt($plaintext));
+        }
+
+        $des = $this->des;
+
+        $plaintext = '';
+        switch ($this->mode) {
+            case CRYPT_DES_MODE_ECB:
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $block = substr($ciphertext, $i, 8);
+                    $block = $des[2]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $block = $des[1]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $block = $des[0]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $plaintext.= $block;
+                }
+                break;
+            case CRYPT_DES_MODE_CBC:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $orig = $block = substr($ciphertext, $i, 8);
+                    $block = $des[2]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $block = $des[1]->_processBlock($block, CRYPT_DES_ENCRYPT);
+                    $block = $des[0]->_processBlock($block, CRYPT_DES_DECRYPT);
+                    $plaintext.= $block ^ $xor;
+                    $xor = $orig;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+                break;
+            case CRYPT_DES_MODE_CTR:
+                $xor = $this->decryptIV;
+                for ($i = 0; $i < strlen($ciphertext); $i+=8) {
+                    $key = $this->_generate_xor(8, $xor);
+                    $key = $des[0]->_processBlock($key, CRYPT_DES_ENCRYPT);
+                    $key = $des[1]->_processBlock($key, CRYPT_DES_DECRYPT);
+                    $key = $des[2]->_processBlock($key, CRYPT_DES_ENCRYPT);
+                    $block = substr($ciphertext, $i, 8);
+                    $plaintext.= $block ^ $key;
+                }
+                if ($this->continuousBuffer) {
+                    $this->decryptIV = $xor;
+                }
+        }
+
+        return $this->mode != CRYPT_DES_MODE_CTR ? $this->_unpad($plaintext) : $plaintext;
+    }
+
+    /**
+     * Treat consecutive "packets" as if they are a continuous buffer.
+     *
+     * Say you have a 16-byte plaintext $plaintext.  Using the default behavior, the two following code snippets
+     * will yield different outputs:
+     *
+     * <code>
+     *    echo $des->encrypt(substr($plaintext, 0, 8));
+     *    echo $des->encrypt(substr($plaintext, 8, 8));
+     * </code>
+     * <code>
+     *    echo $des->encrypt($plaintext);
+     * </code>
+     *
+     * The solution is to enable the continuous buffer.  Although this will resolve the above discrepancy, it creates
+     * another, as demonstrated with the following:
+     *
+     * <code>
+     *    $des->encrypt(substr($plaintext, 0, 8));
+     *    echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     * <code>
+     *    echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+     * </code>
+     *
+     * With the continuous buffer disabled, these would yield the same output.  With it enabled, they yield different
+     * outputs.  The reason is due to the fact that the initialization vector's change after every encryption /
+     * decryption round when the continuous buffer is enabled.  When it's disabled, they remain constant.
+     *
+     * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
+     * encryption / decryption round, whereas otherwise, it'd remain constant.  For this reason, it's recommended that
+     * continuous buffers not be used.  They do offer better security and are, in fact, sometimes required (SSH uses them),
+     * however, they are also less intuitive and more likely to cause you problems.
+     *
+     * @see Crypt_TripleDES::disableContinuousBuffer()
+     * @access public
+     */
+    function enableContinuousBuffer()
+    {
+        $this->continuousBuffer = true;
+        if ($this->mode == CRYPT_DES_MODE_3CBC) {
+            $this->des[0]->enableContinuousBuffer();
+            $this->des[1]->enableContinuousBuffer();
+            $this->des[2]->enableContinuousBuffer();
+        }
+    }
+
+    /**
+     * Treat consecutive packets as if they are a discontinuous buffer.
+     *
+     * The default behavior.
+     *
+     * @see Crypt_TripleDES::enableContinuousBuffer()
+     * @access public
+     */
+    function disableContinuousBuffer()
+    {
+        $this->continuousBuffer = false;
+        $this->encryptIV = $this->iv;
+        $this->decryptIV = $this->iv;
+
+        if ($this->mode == CRYPT_DES_MODE_3CBC) {
+            $this->des[0]->disableContinuousBuffer();
+            $this->des[1]->disableContinuousBuffer();
+            $this->des[2]->disableContinuousBuffer();
+        }
+    }
+
+    /**
+     * Pad "packets".
+     *
+     * DES works by encrypting eight bytes at a time.  If you ever need to encrypt or decrypt something that's not
+     * a multiple of eight, it becomes necessary to pad the input so that it's length is a multiple of eight.
+     *
+     * Padding is enabled by default.  Sometimes, however, it is undesirable to pad strings.  Such is the case in SSH1,
+     * where "packets" are padded with random bytes before being encrypted.  Unpad these packets and you risk stripping
+     * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
+     * transmitted separately)
+     *
+     * @see Crypt_TripleDES::disablePadding()
+     * @access public
+     */
+    function enablePadding()
+    {
+        $this->padding = true;
+    }
+
+    /**
+     * Do not pad packets.
+     *
+     * @see Crypt_TripleDES::enablePadding()
+     * @access public
+     */
+    function disablePadding()
+    {
+        $this->padding = false;
+    }
+
+    /**
+     * Pads a string
+     *
+     * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize (8).
+     * 8 - (strlen($text) & 7) bytes are added, each of which is equal to chr(8 - (strlen($text) & 7)
+     *
+     * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
+     * and padding will, hence forth, be enabled.
+     *
+     * @see Crypt_TripleDES::_unpad()
+     * @access private
+     */
+    function _pad($text)
+    {
+        $length = strlen($text);
+
+        if (!$this->padding) {
+            if (($length & 7) == 0) {
+                return $text;
+            } else {
+                user_error("The plaintext's length ($length) is not a multiple of the block size (8)", E_USER_NOTICE);
+                $this->padding = true;
+            }
+        }
+
+        $pad = 8 - ($length & 7);
+        return str_pad($text, $length + $pad, chr($pad));
+    }
+
+    /**
+     * Unpads a string
+     *
+     * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
+     * and false will be returned.
+     *
+     * @see Crypt_TripleDES::_pad()
+     * @access private
+     */
+    function _unpad($text)
+    {
+        if (!$this->padding) {
+            return $text;
+        }
+
+        $length = ord($text[strlen($text) - 1]);
+
+        if (!$length || $length > 8) {
+            return false;
+        }
+
+        return substr($text, 0, -$length);
+    }
+}
+
+// vim: ts=4:sw=4:et:
+// vim6: fdl=1:
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Math/BigInteger.php b/plugins/OStatus/extlib/Math/BigInteger.php
new file mode 100644 (file)
index 0000000..9733351
--- /dev/null
@@ -0,0 +1,3545 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Pure-PHP arbitrary precision integer arithmetic library.
+ *
+ * Supports base-2, base-10, base-16, and base-256 numbers.  Uses the GMP or BCMath extensions, if available,
+ * and an internal implementation, otherwise.
+ *
+ * PHP versions 4 and 5
+ *
+ * {@internal (all DocBlock comments regarding implementation - such as the one that follows - refer to the 
+ * {@link MATH_BIGINTEGER_MODE_INTERNAL MATH_BIGINTEGER_MODE_INTERNAL} mode)
+ *
+ * Math_BigInteger uses base-2**26 to perform operations such as multiplication and division and
+ * base-2**52 (ie. two base 2**26 digits) to perform addition and subtraction.  Because the largest possible
+ * value when multiplying two base-2**26 numbers together is a base-2**52 number, double precision floating
+ * point numbers - numbers that should be supported on most hardware and whose significand is 53 bits - are
+ * used.  As a consequence, bitwise operators such as >> and << cannot be used, nor can the modulo operator %,
+ * which only supports integers.  Although this fact will slow this library down, the fact that such a high
+ * base is being used should more than compensate.
+ *
+ * When PHP version 6 is officially released, we'll be able to use 64-bit integers.  This should, once again,
+ * allow bitwise operators, and will increase the maximum possible base to 2**31 (or 2**62 for addition /
+ * subtraction).
+ *
+ * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format.  ie.
+ * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1)
+ *
+ * Useful resources are as follows:
+ *
+ *  - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)}
+ *  - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)}
+ *  - Java's BigInteger classes.  See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip
+ *
+ * Here's an example of how to use this library:
+ * <code>
+ * <?php
+ *    include('Math/BigInteger.php');
+ *
+ *    $a = new Math_BigInteger(2);
+ *    $b = new Math_BigInteger(3);
+ *
+ *    $c = $a->add($b);
+ *
+ *    echo $c->toString(); // outputs 5
+ * ?>
+ * </code>
+ *
+ * LICENSE: This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA  02111-1307  USA
+ *
+ * @category   Math
+ * @package    Math_BigInteger
+ * @author     Jim Wigginton <terrafrost@php.net>
+ * @copyright  MMVI Jim Wigginton
+ * @license    http://www.gnu.org/licenses/lgpl.txt
+ * @version    $Id: BigInteger.php,v 1.31 2010/03/01 17:28:19 terrafrost Exp $
+ * @link       http://pear.php.net/package/Math_BigInteger
+ */
+
+/**#@+
+ * Reduction constants
+ *
+ * @access private
+ * @see Math_BigInteger::_reduce()
+ */
+/**
+ * @see Math_BigInteger::_montgomery()
+ * @see Math_BigInteger::_prepMontgomery()
+ */
+define('MATH_BIGINTEGER_MONTGOMERY', 0);
+/**
+ * @see Math_BigInteger::_barrett()
+ */
+define('MATH_BIGINTEGER_BARRETT', 1);
+/**
+ * @see Math_BigInteger::_mod2()
+ */
+define('MATH_BIGINTEGER_POWEROF2', 2);
+/**
+ * @see Math_BigInteger::_remainder()
+ */
+define('MATH_BIGINTEGER_CLASSIC', 3);
+/**
+ * @see Math_BigInteger::__clone()
+ */
+define('MATH_BIGINTEGER_NONE', 4);
+/**#@-*/
+
+/**#@+
+ * Array constants
+ *
+ * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and
+ * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them.
+ *
+ * @access private
+ */
+/**
+ * $result[MATH_BIGINTEGER_VALUE] contains the value.
+ */
+define('MATH_BIGINTEGER_VALUE', 0);
+/**
+ * $result[MATH_BIGINTEGER_SIGN] contains the sign.
+ */
+define('MATH_BIGINTEGER_SIGN', 1);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see Math_BigInteger::_montgomery()
+ * @see Math_BigInteger::_barrett()
+ */
+/**
+ * Cache constants
+ *
+ * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid.
+ */
+define('MATH_BIGINTEGER_VARIABLE', 0);
+/**
+ * $cache[MATH_BIGINTEGER_DATA] contains the cached data.
+ */
+define('MATH_BIGINTEGER_DATA', 1);
+/**#@-*/
+
+/**#@+
+ * Mode constants.
+ *
+ * @access private
+ * @see Math_BigInteger::Math_BigInteger()
+ */
+/**
+ * To use the pure-PHP implementation
+ */
+define('MATH_BIGINTEGER_MODE_INTERNAL', 1);
+/**
+ * To use the BCMath library
+ *
+ * (if enabled; otherwise, the internal implementation will be used)
+ */
+define('MATH_BIGINTEGER_MODE_BCMATH', 2);
+/**
+ * To use the GMP library
+ *
+ * (if present; otherwise, either the BCMath or the internal implementation will be used)
+ */
+define('MATH_BIGINTEGER_MODE_GMP', 3);
+/**#@-*/
+
+/**
+ * The largest digit that may be used in addition / subtraction
+ *
+ * (we do pow(2, 52) instead of using 4503599627370496, directly, because some PHP installations
+ *  will truncate 4503599627370496)
+ *
+ * @access private
+ */
+define('MATH_BIGINTEGER_MAX_DIGIT52', pow(2, 52));
+
+/**
+ * Karatsuba Cutoff
+ *
+ * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication?
+ *
+ * @access private
+ */
+define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25);
+
+/**
+ * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256
+ * numbers.
+ *
+ * @author  Jim Wigginton <terrafrost@php.net>
+ * @version 1.0.0RC4
+ * @access  public
+ * @package Math_BigInteger
+ */
+class Math_BigInteger {
+    /**
+     * Holds the BigInteger's value.
+     *
+     * @var Array
+     * @access private
+     */
+    var $value;
+
+    /**
+     * Holds the BigInteger's magnitude.
+     *
+     * @var Boolean
+     * @access private
+     */
+    var $is_negative = false;
+
+    /**
+     * Random number generator function
+     *
+     * @see setRandomGenerator()
+     * @access private
+     */
+    var $generator = 'mt_rand';
+
+    /**
+     * Precision
+     *
+     * @see setPrecision()
+     * @access private
+     */
+    var $precision = -1;
+
+    /**
+     * Precision Bitmask
+     *
+     * @see setPrecision()
+     * @access private
+     */
+    var $bitmask = false;
+
+    /**
+     * Mode independant value used for serialization.
+     *
+     * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for 
+     * a variable that'll be serializable regardless of whether or not extensions are being used.  Unlike $this->value,
+     * however, $this->hex is only calculated when $this->__sleep() is called.
+     *
+     * @see __sleep()
+     * @see __wakeup()
+     * @var String
+     * @access private
+     */
+    var $hex;
+
+    /**
+     * Converts base-2, base-10, base-16, and binary strings (eg. base-256) to BigIntegers.
+     *
+     * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using
+     * two's compliment.  The sole exception to this is -10, which is treated the same as 10 is.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('0x32', 16); // 50 in base-16
+     *
+     *    echo $a->toString(); // outputs 50
+     * ?>
+     * </code>
+     *
+     * @param optional $x base-10 number or base-$base number if $base set.
+     * @param optional integer $base
+     * @return Math_BigInteger
+     * @access public
+     */
+    function Math_BigInteger($x = 0, $base = 10)
+    {
+        if ( !defined('MATH_BIGINTEGER_MODE') ) {
+            switch (true) {
+                case extension_loaded('gmp'):
+                    define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP);
+                    break;
+                case extension_loaded('bcmath'):
+                    define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH);
+                    break;
+                default:
+                    define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL);
+            }
+        }
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                if (is_resource($x) && get_resource_type($x) == 'GMP integer') {
+                    $this->value = $x;
+                    return;
+                }
+                $this->value = gmp_init(0);
+                break;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $this->value = '0';
+                break;
+            default:
+                $this->value = array();
+        }
+
+        if ($x === 0) {
+            return;
+        }
+
+        switch ($base) {
+            case -256:
+                if (ord($x[0]) & 0x80) {
+                    $x = ~$x;
+                    $this->is_negative = true;
+                }
+            case  256:
+                switch ( MATH_BIGINTEGER_MODE ) {
+                    case MATH_BIGINTEGER_MODE_GMP:
+                        $sign = $this->is_negative ? '-' : '';
+                        $this->value = gmp_init($sign . '0x' . bin2hex($x));
+                        break;
+                    case MATH_BIGINTEGER_MODE_BCMATH:
+                        // round $len to the nearest 4 (thanks, DavidMJ!)
+                        $len = (strlen($x) + 3) & 0xFFFFFFFC;
+
+                        $x = str_pad($x, $len, chr(0), STR_PAD_LEFT);
+
+                        for ($i = 0; $i < $len; $i+= 4) {
+                            $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32
+                            $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0);
+                        }
+
+                        if ($this->is_negative) {
+                            $this->value = '-' . $this->value;
+                        }
+
+                        break;
+                    // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb)
+                    default:
+                        while (strlen($x)) {
+                            $this->value[] = $this->_bytes2int($this->_base256_rshift($x, 26));
+                        }
+                }
+
+                if ($this->is_negative) {
+                    if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) {
+                        $this->is_negative = false;
+                    }
+                    $temp = $this->add(new Math_BigInteger('-1'));
+                    $this->value = $temp->value;
+                }
+                break;
+            case  16:
+            case -16:
+                if ($base > 0 && $x[0] == '-') {
+                    $this->is_negative = true;
+                    $x = substr($x, 1);
+                }
+
+                $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x);
+
+                $is_negative = false;
+                if ($base < 0 && hexdec($x[0]) >= 8) {
+                    $this->is_negative = $is_negative = true;
+                    $x = bin2hex(~pack('H*', $x));
+                }
+
+                switch ( MATH_BIGINTEGER_MODE ) {
+                    case MATH_BIGINTEGER_MODE_GMP:
+                        $temp = $this->is_negative ? '-0x' . $x : '0x' . $x;
+                        $this->value = gmp_init($temp);
+                        $this->is_negative = false;
+                        break;
+                    case MATH_BIGINTEGER_MODE_BCMATH:
+                        $x = ( strlen($x) & 1 ) ? '0' . $x : $x;
+                        $temp = new Math_BigInteger(pack('H*', $x), 256);
+                        $this->value = $this->is_negative ? '-' . $temp->value : $temp->value;
+                        $this->is_negative = false;
+                        break;
+                    default:
+                        $x = ( strlen($x) & 1 ) ? '0' . $x : $x;
+                        $temp = new Math_BigInteger(pack('H*', $x), 256);
+                        $this->value = $temp->value;
+                }
+
+                if ($is_negative) {
+                    $temp = $this->add(new Math_BigInteger('-1'));
+                    $this->value = $temp->value;
+                }
+                break;
+            case  10:
+            case -10:
+                $x = preg_replace('#^(-?[0-9]*).*#', '$1', $x);
+
+                switch ( MATH_BIGINTEGER_MODE ) {
+                    case MATH_BIGINTEGER_MODE_GMP:
+                        $this->value = gmp_init($x);
+                        break;
+                    case MATH_BIGINTEGER_MODE_BCMATH:
+                        // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different
+                        // results then doing it on '-1' does (modInverse does $x[0])
+                        $this->value = (string) $x;
+                        break;
+                    default:
+                        $temp = new Math_BigInteger();
+
+                        // array(10000000) is 10**7 in base-2**26.  10**7 is the closest to 2**26 we can get without passing it.
+                        $multiplier = new Math_BigInteger();
+                        $multiplier->value = array(10000000);
+
+                        if ($x[0] == '-') {
+                            $this->is_negative = true;
+                            $x = substr($x, 1);
+                        }
+
+                        $x = str_pad($x, strlen($x) + (6 * strlen($x)) % 7, 0, STR_PAD_LEFT);
+
+                        while (strlen($x)) {
+                            $temp = $temp->multiply($multiplier);
+                            $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, 7)), 256));
+                            $x = substr($x, 7);
+                        }
+
+                        $this->value = $temp->value;
+                }
+                break;
+            case  2: // base-2 support originally implemented by Lluis Pamies - thanks!
+            case -2:
+                if ($base > 0 && $x[0] == '-') {
+                    $this->is_negative = true;
+                    $x = substr($x, 1);
+                }
+
+                $x = preg_replace('#^([01]*).*#', '$1', $x);
+                $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT);
+
+                $str = '0x';
+                while (strlen($x)) {
+                    $part = substr($x, 0, 4);
+                    $str.= dechex(bindec($part));
+                    $x = substr($x, 4);
+                }
+
+                if ($this->is_negative) {
+                    $str = '-' . $str;
+                }
+
+                $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16
+                $this->value = $temp->value;
+                $this->is_negative = $temp->is_negative;
+
+                break;
+            default:
+                // base not supported, so we'll let $this == 0
+        }
+    }
+
+    /**
+     * Converts a BigInteger to a byte string (eg. base-256).
+     *
+     * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+     * saved as two's compliment.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('65');
+     *
+     *    echo $a->toBytes(); // outputs chr(65)
+     * ?>
+     * </code>
+     *
+     * @param Boolean $twos_compliment
+     * @return String
+     * @access public
+     * @internal Converts a base-2**26 number to base-2**8
+     */
+    function toBytes($twos_compliment = false)
+    {
+        if ($twos_compliment) {
+            $comparison = $this->compare(new Math_BigInteger());
+            if ($comparison == 0) {
+                return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+            }
+
+            $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy();
+            $bytes = $temp->toBytes();
+
+            if (empty($bytes)) { // eg. if the number we're trying to convert is -1
+                $bytes = chr(0);
+            }
+
+            if (ord($bytes[0]) & 0x80) {
+                $bytes = chr(0) . $bytes;
+            }
+
+            return $comparison < 0 ? ~$bytes : $bytes;
+        }
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                if (gmp_cmp($this->value, gmp_init(0)) == 0) {
+                    return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+                }
+
+                $temp = gmp_strval(gmp_abs($this->value), 16);
+                $temp = ( strlen($temp) & 1 ) ? '0' . $temp : $temp;
+                $temp = pack('H*', $temp);
+
+                return $this->precision > 0 ?
+                    substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
+                    ltrim($temp, chr(0));
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                if ($this->value === '0') {
+                    return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+                }
+
+                $value = '';
+                $current = $this->value;
+
+                if ($current[0] == '-') {
+                    $current = substr($current, 1);
+                }
+
+                while (bccomp($current, '0', 0) > 0) {
+                    $temp = bcmod($current, '16777216');
+                    $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value;
+                    $current = bcdiv($current, '16777216', 0);
+                }
+
+                return $this->precision > 0 ?
+                    substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
+                    ltrim($value, chr(0));
+        }
+
+        if (!count($this->value)) {
+            return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+        }
+        $result = $this->_int2bytes($this->value[count($this->value) - 1]);
+
+        $temp = $this->copy();
+
+        for ($i = count($temp->value) - 2; $i >= 0; --$i) {
+            $temp->_base256_lshift($result, 26);
+            $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT);
+        }
+
+        return $this->precision > 0 ?
+            str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) :
+            $result;
+    }
+
+    /**
+     * Converts a BigInteger to a hex string (eg. base-16)).
+     *
+     * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+     * saved as two's compliment.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('65');
+     *
+     *    echo $a->toHex(); // outputs '41'
+     * ?>
+     * </code>
+     *
+     * @param Boolean $twos_compliment
+     * @return String
+     * @access public
+     * @internal Converts a base-2**26 number to base-2**8
+     */
+    function toHex($twos_compliment = false)
+    {
+        return bin2hex($this->toBytes($twos_compliment));
+    }
+
+    /**
+     * Converts a BigInteger to a bit string (eg. base-2).
+     *
+     * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+     * saved as two's compliment.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('65');
+     *
+     *    echo $a->toBits(); // outputs '1000001'
+     * ?>
+     * </code>
+     *
+     * @param Boolean $twos_compliment
+     * @return String
+     * @access public
+     * @internal Converts a base-2**26 number to base-2**2
+     */
+    function toBits($twos_compliment = false)
+    {
+        $hex = $this->toHex($twos_compliment);
+        $bits = '';
+        for ($i = 0; $i < strlen($hex); $i+=8) {
+            $bits.= str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT);
+        }
+        return $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0');
+    }
+
+    /**
+     * Converts a BigInteger to a base-10 number.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('50');
+     *
+     *    echo $a->toString(); // outputs 50
+     * ?>
+     * </code>
+     *
+     * @return String
+     * @access public
+     * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10)
+     */
+    function toString()
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                return gmp_strval($this->value);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                if ($this->value === '0') {
+                    return '0';
+                }
+
+                return ltrim($this->value, '0');
+        }
+
+        if (!count($this->value)) {
+            return '0';
+        }
+
+        $temp = $this->copy();
+        $temp->is_negative = false;
+
+        $divisor = new Math_BigInteger();
+        $divisor->value = array(10000000); // eg. 10**7
+        $result = '';
+        while (count($temp->value)) {
+            list($temp, $mod) = $temp->divide($divisor);
+            $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', 7, '0', STR_PAD_LEFT) . $result;
+        }
+        $result = ltrim($result, '0');
+        if (empty($result)) {
+            $result = '0';
+        }
+
+        if ($this->is_negative) {
+            $result = '-' . $result;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Copy an object
+     *
+     * PHP5 passes objects by reference while PHP4 passes by value.  As such, we need a function to guarantee
+     * that all objects are passed by value, when appropriate.  More information can be found here:
+     *
+     * {@link http://php.net/language.oop5.basic#51624}
+     *
+     * @access public
+     * @see __clone()
+     * @return Math_BigInteger
+     */
+    function copy()
+    {
+        $temp = new Math_BigInteger();
+        $temp->value = $this->value;
+        $temp->is_negative = $this->is_negative;
+        $temp->generator = $this->generator;
+        $temp->precision = $this->precision;
+        $temp->bitmask = $this->bitmask;
+        return $temp;
+    }
+
+    /**
+     *  __toString() magic method
+     *
+     * Will be called, automatically, if you're supporting just PHP5.  If you're supporting PHP4, you'll need to call
+     * toString().
+     *
+     * @access public
+     * @internal Implemented per a suggestion by Techie-Michael - thanks!
+     */
+    function __toString()
+    {
+        return $this->toString();
+    }
+
+    /**
+     * __clone() magic method
+     *
+     * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone()
+     * directly in PHP5.  You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5
+     * only syntax of $y = clone $x.  As such, if you're trying to write an application that works on both PHP4 and PHP5,
+     * call Math_BigInteger::copy(), instead.
+     *
+     * @access public
+     * @see copy()
+     * @return Math_BigInteger
+     */
+    function __clone()
+    {
+        return $this->copy();
+    }
+
+    /**
+     *  __sleep() magic method
+     *
+     * Will be called, automatically, when serialize() is called on a Math_BigInteger object.
+     *
+     * @see __wakeup
+     * @access public
+     */
+    function __sleep()
+    {
+        $this->hex = $this->toHex(true);
+        $vars = array('hex');
+        if ($this->generator != 'mt_rand') {
+            $vars[] = 'generator';
+        }
+        if ($this->precision > 0) {
+            $vars[] = 'precision';
+        }
+        return $vars;
+        
+    }
+
+    /**
+     *  __wakeup() magic method
+     *
+     * Will be called, automatically, when unserialize() is called on a Math_BigInteger object.
+     *
+     * @see __sleep
+     * @access public
+     */
+    function __wakeup()
+    {
+        $temp = new Math_BigInteger($this->hex, -16);
+        $this->value = $temp->value;
+        $this->is_negative = $temp->is_negative;
+        $this->setRandomGenerator($this->generator);
+        if ($this->precision > 0) {
+            // recalculate $this->bitmask
+            $this->setPrecision($this->precision);
+        }
+    }
+
+    /**
+     * Adds two BigIntegers.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('10');
+     *    $b = new Math_BigInteger('20');
+     *
+     *    $c = $a->add($b);
+     *
+     *    echo $c->toString(); // outputs 30
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $y
+     * @return Math_BigInteger
+     * @access public
+     * @internal Performs base-2**52 addition
+     */
+    function add($y)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_add($this->value, $y->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp = new Math_BigInteger();
+                $temp->value = bcadd($this->value, $y->value, 0);
+
+                return $this->_normalize($temp);
+        }
+
+        $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative);
+
+        $result = new Math_BigInteger();
+        $result->value = $temp[MATH_BIGINTEGER_VALUE];
+        $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Performs addition.
+     *
+     * @param Array $x_value
+     * @param Boolean $x_negative
+     * @param Array $y_value
+     * @param Boolean $y_negative
+     * @return Array
+     * @access private
+     */
+    function _add($x_value, $x_negative, $y_value, $y_negative)
+    {
+        $x_size = count($x_value);
+        $y_size = count($y_value);
+
+        if ($x_size == 0) {
+            return array(
+                MATH_BIGINTEGER_VALUE => $y_value,
+                MATH_BIGINTEGER_SIGN => $y_negative
+            );
+        } else if ($y_size == 0) {
+            return array(
+                MATH_BIGINTEGER_VALUE => $x_value,
+                MATH_BIGINTEGER_SIGN => $x_negative
+            );
+        }
+
+        // subtract, if appropriate
+        if ( $x_negative != $y_negative ) {
+            if ( $x_value == $y_value ) {
+                return array(
+                    MATH_BIGINTEGER_VALUE => array(),
+                    MATH_BIGINTEGER_SIGN => false
+                );
+            }
+
+            $temp = $this->_subtract($x_value, false, $y_value, false);
+            $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ?
+                                          $x_negative : $y_negative;
+
+            return $temp;
+        }
+
+        if ($x_size < $y_size) {
+            $size = $x_size;
+            $value = $y_value;
+        } else {
+            $size = $y_size;
+            $value = $x_value;
+        }
+
+        $value[] = 0; // just in case the carry adds an extra digit
+
+        $carry = 0;
+        for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) {
+            $sum = $x_value[$j] * 0x4000000 + $x_value[$i] + $y_value[$j] * 0x4000000 + $y_value[$i] + $carry;
+            $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT52; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
+            $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT52 : $sum;
+
+            $temp = (int) ($sum / 0x4000000);
+
+            $value[$i] = (int) ($sum - 0x4000000 * $temp); // eg. a faster alternative to fmod($sum, 0x4000000)
+            $value[$j] = $temp;
+        }
+
+        if ($j == $size) { // ie. if $y_size is odd
+            $sum = $x_value[$i] + $y_value[$i] + $carry;
+            $carry = $sum >= 0x4000000;
+            $value[$i] = $carry ? $sum - 0x4000000 : $sum;
+            ++$i; // ie. let $i = $j since we've just done $value[$i]
+        }
+
+        if ($carry) {
+            for (; $value[$i] == 0x3FFFFFF; ++$i) {
+                $value[$i] = 0;
+            }
+            ++$value[$i];
+        }
+
+        return array(
+            MATH_BIGINTEGER_VALUE => $this->_trim($value),
+            MATH_BIGINTEGER_SIGN => $x_negative
+        );
+    }
+
+    /**
+     * Subtracts two BigIntegers.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('10');
+     *    $b = new Math_BigInteger('20');
+     *
+     *    $c = $a->subtract($b);
+     *
+     *    echo $c->toString(); // outputs -10
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $y
+     * @return Math_BigInteger
+     * @access public
+     * @internal Performs base-2**52 subtraction
+     */
+    function subtract($y)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_sub($this->value, $y->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp = new Math_BigInteger();
+                $temp->value = bcsub($this->value, $y->value, 0);
+
+                return $this->_normalize($temp);
+        }
+
+        $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative);
+
+        $result = new Math_BigInteger();
+        $result->value = $temp[MATH_BIGINTEGER_VALUE];
+        $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Performs subtraction.
+     *
+     * @param Array $x_value
+     * @param Boolean $x_negative
+     * @param Array $y_value
+     * @param Boolean $y_negative
+     * @return Array
+     * @access private
+     */
+    function _subtract($x_value, $x_negative, $y_value, $y_negative)
+    {
+        $x_size = count($x_value);
+        $y_size = count($y_value);
+
+        if ($x_size == 0) {
+            return array(
+                MATH_BIGINTEGER_VALUE => $y_value,
+                MATH_BIGINTEGER_SIGN => !$y_negative
+            );
+        } else if ($y_size == 0) {
+            return array(
+                MATH_BIGINTEGER_VALUE => $x_value,
+                MATH_BIGINTEGER_SIGN => $x_negative
+            );
+        }
+
+        // add, if appropriate (ie. -$x - +$y or +$x - -$y)
+        if ( $x_negative != $y_negative ) {
+            $temp = $this->_add($x_value, false, $y_value, false);
+            $temp[MATH_BIGINTEGER_SIGN] = $x_negative;
+
+            return $temp;
+        }
+
+        $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative);
+
+        if ( !$diff ) {
+            return array(
+                MATH_BIGINTEGER_VALUE => array(),
+                MATH_BIGINTEGER_SIGN => false
+            );
+        }
+
+        // switch $x and $y around, if appropriate.
+        if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) {
+            $temp = $x_value;
+            $x_value = $y_value;
+            $y_value = $temp;
+
+            $x_negative = !$x_negative;
+
+            $x_size = count($x_value);
+            $y_size = count($y_value);
+        }
+
+        // at this point, $x_value should be at least as big as - if not bigger than - $y_value
+
+        $carry = 0;
+        for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) {
+            $sum = $x_value[$j] * 0x4000000 + $x_value[$i] - $y_value[$j] * 0x4000000 - $y_value[$i] - $carry;
+            $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
+            $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT52 : $sum;
+
+            $temp = (int) ($sum / 0x4000000);
+
+            $x_value[$i] = (int) ($sum - 0x4000000 * $temp);
+            $x_value[$j] = $temp;
+        }
+
+        if ($j == $y_size) { // ie. if $y_size is odd
+            $sum = $x_value[$i] - $y_value[$i] - $carry;
+            $carry = $sum < 0;
+            $x_value[$i] = $carry ? $sum + 0x4000000 : $sum;
+            ++$i;
+        }
+
+        if ($carry) {
+            for (; !$x_value[$i]; ++$i) {
+                $x_value[$i] = 0x3FFFFFF;
+            }
+            --$x_value[$i];
+        }
+
+        return array(
+            MATH_BIGINTEGER_VALUE => $this->_trim($x_value),
+            MATH_BIGINTEGER_SIGN => $x_negative
+        );
+    }
+
+    /**
+     * Multiplies two BigIntegers
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('10');
+     *    $b = new Math_BigInteger('20');
+     *
+     *    $c = $a->multiply($b);
+     *
+     *    echo $c->toString(); // outputs 200
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $x
+     * @return Math_BigInteger
+     * @access public
+     */
+    function multiply($x)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_mul($this->value, $x->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp = new Math_BigInteger();
+                $temp->value = bcmul($this->value, $x->value, 0);
+
+                return $this->_normalize($temp);
+        }
+
+        $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative);
+
+        $product = new Math_BigInteger();
+        $product->value = $temp[MATH_BIGINTEGER_VALUE];
+        $product->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+        return $this->_normalize($product);
+    }
+
+    /**
+     * Performs multiplication.
+     *
+     * @param Array $x_value
+     * @param Boolean $x_negative
+     * @param Array $y_value
+     * @param Boolean $y_negative
+     * @return Array
+     * @access private
+     */
+    function _multiply($x_value, $x_negative, $y_value, $y_negative)
+    {
+        //if ( $x_value == $y_value ) {
+        //    return array(
+        //        MATH_BIGINTEGER_VALUE => $this->_square($x_value),
+        //        MATH_BIGINTEGER_SIGN => $x_sign != $y_value
+        //    );
+        //}
+
+        $x_length = count($x_value);
+        $y_length = count($y_value);
+
+        if ( !$x_length || !$y_length ) { // a 0 is being multiplied
+            return array(
+                MATH_BIGINTEGER_VALUE => array(),
+                MATH_BIGINTEGER_SIGN => false
+            );
+        }
+
+        return array(
+            MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
+                $this->_trim($this->_regularMultiply($x_value, $y_value)) :
+                $this->_trim($this->_karatsuba($x_value, $y_value)),
+            MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
+        );
+    }
+
+    /**
+     * Performs long multiplication on two BigIntegers
+     *
+     * Modeled after 'multiply' in MutableBigInteger.java.
+     *
+     * @param Array $x_value
+     * @param Array $y_value
+     * @return Array
+     * @access private
+     */
+    function _regularMultiply($x_value, $y_value)
+    {
+        $x_length = count($x_value);
+        $y_length = count($y_value);
+
+        if ( !$x_length || !$y_length ) { // a 0 is being multiplied
+            return array();
+        }
+
+        if ( $x_length < $y_length ) {
+            $temp = $x_value;
+            $x_value = $y_value;
+            $y_value = $temp;
+
+            $x_length = count($x_value);
+            $y_length = count($y_value);
+        }
+
+        $product_value = $this->_array_repeat(0, $x_length + $y_length);
+
+        // the following for loop could be removed if the for loop following it
+        // (the one with nested for loops) initially set $i to 0, but
+        // doing so would also make the result in one set of unnecessary adds,
+        // since on the outermost loops first pass, $product->value[$k] is going
+        // to always be 0
+
+        $carry = 0;
+
+        for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0
+            $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
+            $carry = (int) ($temp / 0x4000000);
+            $product_value[$j] = (int) ($temp - 0x4000000 * $carry);
+        }
+
+        $product_value[$j] = $carry;
+
+        // the above for loop is what the previous comment was talking about.  the
+        // following for loop is the "one with nested for loops"
+        for ($i = 1; $i < $y_length; ++$i) {
+            $carry = 0;
+
+            for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) {
+                $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
+                $carry = (int) ($temp / 0x4000000);
+                $product_value[$k] = (int) ($temp - 0x4000000 * $carry);
+            }
+
+            $product_value[$k] = $carry;
+        }
+
+        return $product_value;
+    }
+
+    /**
+     * Performs Karatsuba multiplication on two BigIntegers
+     *
+     * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}.
+     *
+     * @param Array $x_value
+     * @param Array $y_value
+     * @return Array
+     * @access private
+     */
+    function _karatsuba($x_value, $y_value)
+    {
+        $m = min(count($x_value) >> 1, count($y_value) >> 1);
+
+        if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
+            return $this->_regularMultiply($x_value, $y_value);
+        }
+
+        $x1 = array_slice($x_value, $m);
+        $x0 = array_slice($x_value, 0, $m);
+        $y1 = array_slice($y_value, $m);
+        $y0 = array_slice($y_value, 0, $m);
+
+        $z2 = $this->_karatsuba($x1, $y1);
+        $z0 = $this->_karatsuba($x0, $y0);
+
+        $z1 = $this->_add($x1, false, $x0, false);
+        $temp = $this->_add($y1, false, $y0, false);
+        $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]);
+        $temp = $this->_add($z2, false, $z0, false);
+        $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+        $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
+        $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
+
+        $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
+        $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false);
+
+        return $xy[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * Performs squaring
+     *
+     * @param Array $x
+     * @return Array
+     * @access private
+     */
+    function _square($x = false)
+    {
+        return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
+            $this->_trim($this->_baseSquare($x)) :
+            $this->_trim($this->_karatsubaSquare($x));
+    }
+
+    /**
+     * Performs traditional squaring on two BigIntegers
+     *
+     * Squaring can be done faster than multiplying a number by itself can be.  See
+     * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} /
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information.
+     *
+     * @param Array $value
+     * @return Array
+     * @access private
+     */
+    function _baseSquare($value)
+    {
+        if ( empty($value) ) {
+            return array();
+        }
+        $square_value = $this->_array_repeat(0, 2 * count($value));
+
+        for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) {
+            $i2 = $i << 1;
+
+            $temp = $square_value[$i2] + $value[$i] * $value[$i];
+            $carry = (int) ($temp / 0x4000000);
+            $square_value[$i2] = (int) ($temp - 0x4000000 * $carry);
+
+            // note how we start from $i+1 instead of 0 as we do in multiplication.
+            for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) {
+                $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry;
+                $carry = (int) ($temp / 0x4000000);
+                $square_value[$k] = (int) ($temp - 0x4000000 * $carry);
+            }
+
+            // the following line can yield values larger 2**15.  at this point, PHP should switch
+            // over to floats.
+            $square_value[$i + $max_index + 1] = $carry;
+        }
+
+        return $square_value;
+    }
+
+    /**
+     * Performs Karatsuba "squaring" on two BigIntegers
+     *
+     * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}.
+     *
+     * @param Array $value
+     * @return Array
+     * @access private
+     */
+    function _karatsubaSquare($value)
+    {
+        $m = count($value) >> 1;
+
+        if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
+            return $this->_baseSquare($value);
+        }
+
+        $x1 = array_slice($value, $m);
+        $x0 = array_slice($value, 0, $m);
+
+        $z2 = $this->_karatsubaSquare($x1);
+        $z0 = $this->_karatsubaSquare($x0);
+
+        $z1 = $this->_add($x1, false, $x0, false);
+        $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]);
+        $temp = $this->_add($z2, false, $z0, false);
+        $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+        $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
+        $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
+
+        $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
+        $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false);
+
+        return $xx[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * Divides two BigIntegers.
+     *
+     * Returns an array whose first element contains the quotient and whose second element contains the
+     * "common residue".  If the remainder would be positive, the "common residue" and the remainder are the
+     * same.  If the remainder would be negative, the "common residue" is equal to the sum of the remainder
+     * and the divisor (basically, the "common residue" is the first positive modulo).
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('10');
+     *    $b = new Math_BigInteger('20');
+     *
+     *    list($quotient, $remainder) = $a->divide($b);
+     *
+     *    echo $quotient->toString(); // outputs 0
+     *    echo "\r\n";
+     *    echo $remainder->toString(); // outputs 10
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $y
+     * @return Array
+     * @access public
+     * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}.
+     */
+    function divide($y)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $quotient = new Math_BigInteger();
+                $remainder = new Math_BigInteger();
+
+                list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value);
+
+                if (gmp_sign($remainder->value) < 0) {
+                    $remainder->value = gmp_add($remainder->value, gmp_abs($y->value));
+                }
+
+                return array($this->_normalize($quotient), $this->_normalize($remainder));
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $quotient = new Math_BigInteger();
+                $remainder = new Math_BigInteger();
+
+                $quotient->value = bcdiv($this->value, $y->value, 0);
+                $remainder->value = bcmod($this->value, $y->value);
+
+                if ($remainder->value[0] == '-') {
+                    $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0);
+                }
+
+                return array($this->_normalize($quotient), $this->_normalize($remainder));
+        }
+
+        if (count($y->value) == 1) {
+            list($q, $r) = $this->_divide_digit($this->value, $y->value[0]);
+            $quotient = new Math_BigInteger();
+            $remainder = new Math_BigInteger();
+            $quotient->value = $q;
+            $remainder->value = array($r);
+            $quotient->is_negative = $this->is_negative != $y->is_negative;
+            return array($this->_normalize($quotient), $this->_normalize($remainder));
+        }
+
+        static $zero;
+        if ( !isset($zero) ) {
+            $zero = new Math_BigInteger();
+        }
+
+        $x = $this->copy();
+        $y = $y->copy();
+
+        $x_sign = $x->is_negative;
+        $y_sign = $y->is_negative;
+
+        $x->is_negative = $y->is_negative = false;
+
+        $diff = $x->compare($y);
+
+        if ( !$diff ) {
+            $temp = new Math_BigInteger();
+            $temp->value = array(1);
+            $temp->is_negative = $x_sign != $y_sign;
+            return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger()));
+        }
+
+        if ( $diff < 0 ) {
+            // if $x is negative, "add" $y.
+            if ( $x_sign ) {
+                $x = $y->subtract($x);
+            }
+            return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x));
+        }
+
+        // normalize $x and $y as described in HAC 14.23 / 14.24
+        $msb = $y->value[count($y->value) - 1];
+        for ($shift = 0; !($msb & 0x2000000); ++$shift) {
+            $msb <<= 1;
+        }
+        $x->_lshift($shift);
+        $y->_lshift($shift);
+        $y_value = &$y->value;
+
+        $x_max = count($x->value) - 1;
+        $y_max = count($y->value) - 1;
+
+        $quotient = new Math_BigInteger();
+        $quotient_value = &$quotient->value;
+        $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1);
+
+        static $temp, $lhs, $rhs;
+        if (!isset($temp)) {
+            $temp = new Math_BigInteger();
+            $lhs =  new Math_BigInteger();
+            $rhs =  new Math_BigInteger();
+        }
+        $temp_value = &$temp->value;
+        $rhs_value =  &$rhs->value;
+
+        // $temp = $y << ($x_max - $y_max-1) in base 2**26
+        $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value);
+
+        while ( $x->compare($temp) >= 0 ) {
+            // calculate the "common residue"
+            ++$quotient_value[$x_max - $y_max];
+            $x = $x->subtract($temp);
+            $x_max = count($x->value) - 1;
+        }
+
+        for ($i = $x_max; $i >= $y_max + 1; --$i) {
+            $x_value = &$x->value;
+            $x_window = array(
+                isset($x_value[$i]) ? $x_value[$i] : 0,
+                isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0,
+                isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0
+            );
+            $y_window = array(
+                $y_value[$y_max],
+                ( $y_max > 0 ) ? $y_value[$y_max - 1] : 0
+            );
+
+            $q_index = $i - $y_max - 1;
+            if ($x_window[0] == $y_window[0]) {
+                $quotient_value[$q_index] = 0x3FFFFFF;
+            } else {
+                $quotient_value[$q_index] = (int) (
+                    ($x_window[0] * 0x4000000 + $x_window[1])
+                    /
+                    $y_window[0]
+                );
+            }
+
+            $temp_value = array($y_window[1], $y_window[0]);
+
+            $lhs->value = array($quotient_value[$q_index]);
+            $lhs = $lhs->multiply($temp);
+
+            $rhs_value = array($x_window[2], $x_window[1], $x_window[0]);
+
+            while ( $lhs->compare($rhs) > 0 ) {
+                --$quotient_value[$q_index];
+
+                $lhs->value = array($quotient_value[$q_index]);
+                $lhs = $lhs->multiply($temp);
+            }
+
+            $adjust = $this->_array_repeat(0, $q_index);
+            $temp_value = array($quotient_value[$q_index]);
+            $temp = $temp->multiply($y);
+            $temp_value = &$temp->value;
+            $temp_value = array_merge($adjust, $temp_value);
+
+            $x = $x->subtract($temp);
+
+            if ($x->compare($zero) < 0) {
+                $temp_value = array_merge($adjust, $y_value);
+                $x = $x->add($temp);
+
+                --$quotient_value[$q_index];
+            }
+
+            $x_max = count($x_value) - 1;
+        }
+
+        // unnormalize the remainder
+        $x->_rshift($shift);
+
+        $quotient->is_negative = $x_sign != $y_sign;
+
+        // calculate the "common residue", if appropriate
+        if ( $x_sign ) {
+            $y->_rshift($shift);
+            $x = $y->subtract($x);
+        }
+
+        return array($this->_normalize($quotient), $this->_normalize($x));
+    }
+
+    /**
+     * Divides a BigInteger by a regular integer
+     *
+     * abc / x = a00 / x + b0 / x + c / x
+     *
+     * @param Array $dividend
+     * @param Array $divisor
+     * @return Array
+     * @access private
+     */
+    function _divide_digit($dividend, $divisor)
+    {
+        $carry = 0;
+        $result = array();
+
+        for ($i = count($dividend) - 1; $i >= 0; --$i) {
+            $temp = 0x4000000 * $carry + $dividend[$i];
+            $result[$i] = (int) ($temp / $divisor);
+            $carry = (int) ($temp - $divisor * $result[$i]);
+        }
+
+        return array($result, $carry);
+    }
+
+    /**
+     * Performs modular exponentiation.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger('10');
+     *    $b = new Math_BigInteger('20');
+     *    $c = new Math_BigInteger('30');
+     *
+     *    $c = $a->modPow($b, $c);
+     *
+     *    echo $c->toString(); // outputs 10
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $e
+     * @param Math_BigInteger $n
+     * @return Math_BigInteger
+     * @access public
+     * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and
+     *    and although the approach involving repeated squaring does vastly better, it, too, is impractical
+     *    for our purposes.  The reason being that division - by far the most complicated and time-consuming
+     *    of the basic operations (eg. +,-,*,/) - occurs multiple times within it.
+     *
+     *    Modular reductions resolve this issue.  Although an individual modular reduction takes more time
+     *    then an individual division, when performed in succession (with the same modulo), they're a lot faster.
+     *
+     *    The two most commonly used modular reductions are Barrett and Montgomery reduction.  Montgomery reduction,
+     *    although faster, only works when the gcd of the modulo and of the base being used is 1.  In RSA, when the
+     *    base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because
+     *    the product of two odd numbers is odd), but what about when RSA isn't used?
+     *
+     *    In contrast, Barrett reduction has no such constraint.  As such, some bigint implementations perform a
+     *    Barrett reduction after every operation in the modpow function.  Others perform Barrett reductions when the
+     *    modulo is even and Montgomery reductions when the modulo is odd.  BigInteger.java's modPow method, however,
+     *    uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and
+     *    the other, a power of two - and recombine them, later.  This is the method that this modPow function uses.
+     *    {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates.
+     */
+    function modPow($e, $n)
+    {
+        $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs();
+
+        if ($e->compare(new Math_BigInteger()) < 0) {
+            $e = $e->abs();
+
+            $temp = $this->modInverse($n);
+            if ($temp === false) {
+                return false;
+            }
+
+            return $this->_normalize($temp->modPow($e, $n));
+        }
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_powm($this->value, $e->value, $n->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp = new Math_BigInteger();
+                $temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
+
+                return $this->_normalize($temp);
+        }
+
+        if ( empty($e->value) ) {
+            $temp = new Math_BigInteger();
+            $temp->value = array(1);
+            return $this->_normalize($temp);
+        }
+
+        if ( $e->value == array(1) ) {
+            list(, $temp) = $this->divide($n);
+            return $this->_normalize($temp);
+        }
+
+        if ( $e->value == array(2) ) {
+            $temp = new Math_BigInteger();
+            $temp->value = $this->_square($this->value);
+            list(, $temp) = $temp->divide($n);
+            return $this->_normalize($temp);
+        }
+
+        return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT));
+
+        // is the modulo odd?
+        if ( $n->value[0] & 1 ) {
+            return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY));
+        }
+        // if it's not, it's even
+
+        // find the lowest set bit (eg. the max pow of 2 that divides $n)
+        for ($i = 0; $i < count($n->value); ++$i) {
+            if ( $n->value[$i] ) {
+                $temp = decbin($n->value[$i]);
+                $j = strlen($temp) - strrpos($temp, '1') - 1;
+                $j+= 26 * $i;
+                break;
+            }
+        }
+        // at this point, 2^$j * $n/(2^$j) == $n
+
+        $mod1 = $n->copy();
+        $mod1->_rshift($j);
+        $mod2 = new Math_BigInteger();
+        $mod2->value = array(1);
+        $mod2->_lshift($j);
+
+        $part1 = ( $mod1->value != array(1) ) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger();
+        $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2);
+
+        $y1 = $mod2->modInverse($mod1);
+        $y2 = $mod1->modInverse($mod2);
+
+        $result = $part1->multiply($mod2);
+        $result = $result->multiply($y1);
+
+        $temp = $part2->multiply($mod1);
+        $temp = $temp->multiply($y2);
+
+        $result = $result->add($temp);
+        list(, $result) = $result->divide($n);
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Performs modular exponentiation.
+     *
+     * Alias for Math_BigInteger::modPow()
+     *
+     * @param Math_BigInteger $e
+     * @param Math_BigInteger $n
+     * @return Math_BigInteger
+     * @access public
+     */
+    function powMod($e, $n)
+    {
+        return $this->modPow($e, $n);
+    }
+
+    /**
+     * Sliding Window k-ary Modular Exponentiation
+     *
+     * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} /
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}.  In a departure from those algorithims,
+     * however, this function performs a modular reduction after every multiplication and squaring operation.
+     * As such, this function has the same preconditions that the reductions being used do.
+     *
+     * @param Math_BigInteger $e
+     * @param Math_BigInteger $n
+     * @param Integer $mode
+     * @return Math_BigInteger
+     * @access private
+     */
+    function _slidingWindow($e, $n, $mode)
+    {
+        static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function
+        //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1
+
+        $e_value = $e->value;
+        $e_length = count($e_value) - 1;
+        $e_bits = decbin($e_value[$e_length]);
+        for ($i = $e_length - 1; $i >= 0; --$i) {
+            $e_bits.= str_pad(decbin($e_value[$i]), 26, '0', STR_PAD_LEFT);
+        }
+
+        $e_length = strlen($e_bits);
+
+        // calculate the appropriate window size.
+        // $window_size == 3 if $window_ranges is between 25 and 81, for example.
+        for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i);
+
+        $n_value = $n->value;
+
+        // precompute $this^0 through $this^$window_size
+        $powers = array();
+        $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode);
+        $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode);
+
+        // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end
+        // in a 1.  ie. it's supposed to be odd.
+        $temp = 1 << ($window_size - 1);
+        for ($i = 1; $i < $temp; ++$i) {
+            $i2 = $i << 1;
+            $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode);
+        }
+
+        $result = array(1);
+        $result = $this->_prepareReduce($result, $n_value, $mode);
+
+        for ($i = 0; $i < $e_length; ) {
+            if ( !$e_bits[$i] ) {
+                $result = $this->_squareReduce($result, $n_value, $mode);
+                ++$i;
+            } else {
+                for ($j = $window_size - 1; $j > 0; --$j) {
+                    if ( !empty($e_bits[$i + $j]) ) {
+                        break;
+                    }
+                }
+
+                for ($k = 0; $k <= $j; ++$k) {// eg. the length of substr($e_bits, $i, $j+1)
+                    $result = $this->_squareReduce($result, $n_value, $mode);
+                }
+
+                $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode);
+
+                $i+=$j + 1;
+            }
+        }
+
+        $temp = new Math_BigInteger();
+        $temp->value = $this->_reduce($result, $n_value, $mode);
+
+        return $temp;
+    }
+
+    /**
+     * Modular reduction
+     *
+     * For most $modes this will return the remainder.
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @param Integer $mode
+     * @return Array
+     */
+    function _reduce($x, $n, $mode)
+    {
+        switch ($mode) {
+            case MATH_BIGINTEGER_MONTGOMERY:
+                return $this->_montgomery($x, $n);
+            case MATH_BIGINTEGER_BARRETT:
+                return $this->_barrett($x, $n);
+            case MATH_BIGINTEGER_POWEROF2:
+                $lhs = new Math_BigInteger();
+                $lhs->value = $x;
+                $rhs = new Math_BigInteger();
+                $rhs->value = $n;
+                return $x->_mod2($n);
+            case MATH_BIGINTEGER_CLASSIC:
+                $lhs = new Math_BigInteger();
+                $lhs->value = $x;
+                $rhs = new Math_BigInteger();
+                $rhs->value = $n;
+                list(, $temp) = $lhs->divide($rhs);
+                return $temp->value;
+            case MATH_BIGINTEGER_NONE:
+                return $x;
+            default:
+                // an invalid $mode was provided
+        }
+    }
+
+    /**
+     * Modular reduction preperation
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @param Integer $mode
+     * @return Array
+     */
+    function _prepareReduce($x, $n, $mode)
+    {
+        if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+            return $this->_prepMontgomery($x, $n);
+        }
+        return $this->_reduce($x, $n, $mode);
+    }
+
+    /**
+     * Modular multiply
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $y
+     * @param Array $n
+     * @param Integer $mode
+     * @return Array
+     */
+    function _multiplyReduce($x, $y, $n, $mode)
+    {
+        if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+            return $this->_montgomeryMultiply($x, $y, $n);
+        }
+        $temp = $this->_multiply($x, false, $y, false);
+        return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode);
+    }
+
+    /**
+     * Modular square
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @param Integer $mode
+     * @return Array
+     */
+    function _squareReduce($x, $n, $mode)
+    {
+        if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+            return $this->_montgomeryMultiply($x, $x, $n);
+        }
+        return $this->_reduce($this->_square($x), $n, $mode);
+    }
+
+    /**
+     * Modulos for Powers of Two
+     *
+     * Calculates $x%$n, where $n = 2**$e, for some $e.  Since this is basically the same as doing $x & ($n-1),
+     * we'll just use this function as a wrapper for doing that.
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Math_BigInteger
+     * @return Math_BigInteger
+     */
+    function _mod2($n)
+    {
+        $temp = new Math_BigInteger();
+        $temp->value = array(1);
+        return $this->bitwise_and($n->subtract($temp));
+    }
+
+    /**
+     * Barrett Modular Reduction
+     *
+     * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} /
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information.  Modified slightly,
+     * so as not to require negative numbers (initially, this script didn't support negative numbers).
+     *
+     * Employs "folding", as described at
+     * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}.  To quote from
+     * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x."
+     *
+     * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that
+     * usable on account of (1) its not using reasonable radix points as discussed in
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable
+     * radix points, it only works when there are an even number of digits in the denominator.  The reason for (2) is that
+     * (x >> 1) + (x >> 1) != x / 2 + x / 2.  If x is even, they're the same, but if x is odd, they're not.  See the in-line
+     * comments for details.
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $n
+     * @param Array $m
+     * @return Array
+     */
+    function _barrett($n, $m)
+    {
+        static $cache = array(
+            MATH_BIGINTEGER_VARIABLE => array(),
+            MATH_BIGINTEGER_DATA => array()
+        );
+
+        $m_length = count($m);
+
+        // if ($this->_compare($n, $this->_square($m)) >= 0) {
+        if (count($n) > 2 * $m_length) {
+            $lhs = new Math_BigInteger();
+            $rhs = new Math_BigInteger();
+            $lhs->value = $n;
+            $rhs->value = $m;
+            list(, $temp) = $lhs->divide($rhs);
+            return $temp->value;
+        }
+
+        // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced
+        if ($m_length < 5) {
+            return $this->_regularBarrett($n, $m);
+        }
+
+        // n = 2 * m.length
+
+        if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
+            $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+            $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
+
+            $lhs = new Math_BigInteger();
+            $lhs_value = &$lhs->value;
+            $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1));
+            $lhs_value[] = 1;
+            $rhs = new Math_BigInteger();
+            $rhs->value = $m;
+
+            list($u, $m1) = $lhs->divide($rhs);
+            $u = $u->value;
+            $m1 = $m1->value;
+
+            $cache[MATH_BIGINTEGER_DATA][] = array(
+                'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1)
+                'm1'=> $m1 // m.length
+            );
+        } else {
+            extract($cache[MATH_BIGINTEGER_DATA][$key]);
+        }
+
+        $cutoff = $m_length + ($m_length >> 1);
+        $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1)
+        $msd = array_slice($n, $cutoff);    // m.length >> 1
+        $lsd = $this->_trim($lsd);
+        $temp = $this->_multiply($msd, false, $m1, false);
+        $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1
+
+        if ($m_length & 1) {
+            return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m);
+        }
+
+        // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2
+        $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1);
+        // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2
+        // if odd:  ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1
+        $temp = $this->_multiply($temp, false, $u, false);
+        // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1
+        // if odd:  (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1)
+        $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1);
+        // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1
+        // if odd:  (m.length - (m.length >> 1)) + m.length     = 2 * m.length - (m.length >> 1)
+        $temp = $this->_multiply($temp, false, $m, false);
+
+        // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit
+        // number from a m.length + (m.length >> 1) + 1 digit number.  ie. there'd be an extra digit and the while loop
+        // following this comment would loop a lot (hence our calling _regularBarrett() in that situation).
+
+        $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+        while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) {
+            $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false);
+        }
+
+        return $result[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * (Regular) Barrett Modular Reduction
+     *
+     * For numbers with more than four digits Math_BigInteger::_barrett() is faster.  The difference between that and this
+     * is that this function does not fold the denominator into a smaller form.
+     *
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @return Array
+     */
+    function _regularBarrett($x, $n)
+    {
+        static $cache = array(
+            MATH_BIGINTEGER_VARIABLE => array(),
+            MATH_BIGINTEGER_DATA => array()
+        );
+
+        $n_length = count($n);
+
+        if (count($x) > 2 * $n_length) {
+            $lhs = new Math_BigInteger();
+            $rhs = new Math_BigInteger();
+            $lhs->value = $x;
+            $rhs->value = $n;
+            list(, $temp) = $lhs->divide($rhs);
+            return $temp->value;
+        }
+
+        if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
+            $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+            $cache[MATH_BIGINTEGER_VARIABLE][] = $n;
+            $lhs = new Math_BigInteger();
+            $lhs_value = &$lhs->value;
+            $lhs_value = $this->_array_repeat(0, 2 * $n_length);
+            $lhs_value[] = 1;
+            $rhs = new Math_BigInteger();
+            $rhs->value = $n;
+            list($temp, ) = $lhs->divide($rhs); // m.length
+            $cache[MATH_BIGINTEGER_DATA][] = $temp->value;
+        }
+
+        // 2 * m.length - (m.length - 1) = m.length + 1
+        $temp = array_slice($x, $n_length - 1);
+        // (m.length + 1) + m.length = 2 * m.length + 1
+        $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false);
+        // (2 * m.length + 1) - (m.length - 1) = m.length + 2
+        $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1);
+
+        // m.length + 1
+        $result = array_slice($x, 0, $n_length + 1);
+        // m.length + 1
+        $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1);
+        // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1)
+
+        if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) {
+            $corrector_value = $this->_array_repeat(0, $n_length + 1);
+            $corrector_value[] = 1;
+            $result = $this->_add($result, false, $corrector, false);
+            $result = $result[MATH_BIGINTEGER_VALUE];
+        }
+
+        // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits
+        $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]);
+        while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) {
+            $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false);
+        }
+
+        return $result[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * Performs long multiplication up to $stop digits
+     *
+     * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved.
+     *
+     * @see _regularBarrett()
+     * @param Array $x_value
+     * @param Boolean $x_negative
+     * @param Array $y_value
+     * @param Boolean $y_negative
+     * @return Array
+     * @access private
+     */
+    function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop)
+    {
+        $x_length = count($x_value);
+        $y_length = count($y_value);
+
+        if ( !$x_length || !$y_length ) { // a 0 is being multiplied
+            return array(
+                MATH_BIGINTEGER_VALUE => array(),
+                MATH_BIGINTEGER_SIGN => false
+            );
+        }
+
+        if ( $x_length < $y_length ) {
+            $temp = $x_value;
+            $x_value = $y_value;
+            $y_value = $temp;
+
+            $x_length = count($x_value);
+            $y_length = count($y_value);
+        }
+
+        $product_value = $this->_array_repeat(0, $x_length + $y_length);
+
+        // the following for loop could be removed if the for loop following it
+        // (the one with nested for loops) initially set $i to 0, but
+        // doing so would also make the result in one set of unnecessary adds,
+        // since on the outermost loops first pass, $product->value[$k] is going
+        // to always be 0
+
+        $carry = 0;
+
+        for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i
+            $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
+            $carry = (int) ($temp / 0x4000000);
+            $product_value[$j] = (int) ($temp - 0x4000000 * $carry);
+        }
+
+        if ($j < $stop) {
+            $product_value[$j] = $carry;
+        }
+
+        // the above for loop is what the previous comment was talking about.  the
+        // following for loop is the "one with nested for loops"
+
+        for ($i = 1; $i < $y_length; ++$i) {
+            $carry = 0;
+
+            for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) {
+                $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
+                $carry = (int) ($temp / 0x4000000);
+                $product_value[$k] = (int) ($temp - 0x4000000 * $carry);
+            }
+
+            if ($k < $stop) {
+                $product_value[$k] = $carry;
+            }
+        }
+
+        return array(
+            MATH_BIGINTEGER_VALUE => $this->_trim($product_value),
+            MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
+        );
+    }
+
+    /**
+     * Montgomery Modular Reduction
+     *
+     * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n.
+     * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be
+     * improved upon (basically, by using the comba method).  gcd($n, 2) must be equal to one for this function
+     * to work correctly.
+     *
+     * @see _prepMontgomery()
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @return Array
+     */
+    function _montgomery($x, $n)
+    {
+        static $cache = array(
+            MATH_BIGINTEGER_VARIABLE => array(),
+            MATH_BIGINTEGER_DATA => array()
+        );
+
+        if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
+            $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+            $cache[MATH_BIGINTEGER_VARIABLE][] = $x;
+            $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n);
+        }
+
+        $k = count($n);
+
+        $result = array(MATH_BIGINTEGER_VALUE => $x);
+
+        for ($i = 0; $i < $k; ++$i) {
+            $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key];
+            $temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
+            $temp = $this->_regularMultiply(array($temp), $n);
+            $temp = array_merge($this->_array_repeat(0, $i), $temp);
+            $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false);
+        }
+
+        $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k);
+
+        if ($this->_compare($result, false, $n, false) >= 0) {
+            $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false);
+        }
+
+        return $result[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * Montgomery Multiply
+     *
+     * Interleaves the montgomery reduction and long multiplication algorithms together as described in 
+     * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36}
+     *
+     * @see _prepMontgomery()
+     * @see _montgomery()
+     * @access private
+     * @param Array $x
+     * @param Array $y
+     * @param Array $m
+     * @return Array
+     */
+    function _montgomeryMultiply($x, $y, $m)
+    {
+        $temp = $this->_multiply($x, false, $y, false);
+        return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m);
+
+        static $cache = array(
+            MATH_BIGINTEGER_VARIABLE => array(),
+            MATH_BIGINTEGER_DATA => array()
+        );
+
+        if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
+            $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+            $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
+            $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m);
+        }
+
+        $n = max(count($x), count($y), count($m));
+        $x = array_pad($x, $n, 0);
+        $y = array_pad($y, $n, 0);
+        $m = array_pad($m, $n, 0);
+        $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1));
+        for ($i = 0; $i < $n; ++$i) {
+            $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0];
+            $temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
+            $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key];
+            $temp = (int) ($temp - 0x4000000 * ((int) ($temp / 0x4000000)));
+            $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false);
+            $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
+            $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1);
+        }
+        if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) {
+            $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false);
+        }
+        return $a[MATH_BIGINTEGER_VALUE];
+    }
+
+    /**
+     * Prepare a number for use in Montgomery Modular Reductions
+     *
+     * @see _montgomery()
+     * @see _slidingWindow()
+     * @access private
+     * @param Array $x
+     * @param Array $n
+     * @return Array
+     */
+    function _prepMontgomery($x, $n)
+    {
+        $lhs = new Math_BigInteger();
+        $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x);
+        $rhs = new Math_BigInteger();
+        $rhs->value = $n;
+
+        list(, $temp) = $lhs->divide($rhs);
+        return $temp->value;
+    }
+
+    /**
+     * Modular Inverse of a number mod 2**26 (eg. 67108864)
+     *
+     * Based off of the bnpInvDigit function implemented and justified in the following URL:
+     *
+     * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js}
+     *
+     * The following URL provides more info:
+     *
+     * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85}
+     *
+     * As for why we do all the bitmasking...  strange things can happen when converting from floats to ints. For
+     * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields 
+     * int(-2147483648).  To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't
+     * auto-converted to floats.  The outermost bitmask is present because without it, there's no guarantee that
+     * the "residue" returned would be the so-called "common residue".  We use fmod, in the last step, because the
+     * maximum possible $x is 26 bits and the maximum $result is 16 bits.  Thus, we have to be able to handle up to
+     * 40 bits, which only 64-bit floating points will support.
+     *
+     * Thanks to Pedro Gimeno Fortea for input!
+     *
+     * @see _montgomery()
+     * @access private
+     * @param Array $x
+     * @return Integer
+     */
+    function _modInverse67108864($x) // 2**26 == 67108864
+    {
+        $x = -$x[0];
+        $result = $x & 0x3; // x**-1 mod 2**2
+        $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4
+        $result = ($result * (2 - ($x & 0xFF) * $result))  & 0xFF; // x**-1 mod 2**8
+        $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16
+        $result = fmod($result * (2 - fmod($x * $result, 0x4000000)), 0x4000000); // x**-1 mod 2**26
+        return $result & 0x3FFFFFF;
+    }
+
+    /**
+     * Calculates modular inverses.
+     *
+     * Say you have (30 mod 17 * x mod 17) mod 17 == 1.  x can be found using modular inverses.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger(30);
+     *    $b = new Math_BigInteger(17);
+     *
+     *    $c = $a->modInverse($b);
+     *    echo $c->toString(); // outputs 4
+     *
+     *    echo "\r\n";
+     *
+     *    $d = $a->multiply($c);
+     *    list(, $d) = $d->divide($b);
+     *    echo $d; // outputs 1 (as per the definition of modular inverse)
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $n
+     * @return mixed false, if no modular inverse exists, Math_BigInteger, otherwise.
+     * @access public
+     * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information.
+     */
+    function modInverse($n)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_invert($this->value, $n->value);
+
+                return ( $temp->value === false ) ? false : $this->_normalize($temp);
+        }
+
+        static $zero, $one;
+        if (!isset($zero)) {
+            $zero = new Math_BigInteger();
+            $one = new Math_BigInteger(1);
+        }
+
+        // $x mod $n == $x mod -$n.
+        $n = $n->abs();
+
+        if ($this->compare($zero) < 0) {
+            $temp = $this->abs();
+            $temp = $temp->modInverse($n);
+            return $negated === false ? false : $this->_normalize($n->subtract($temp));
+        }
+
+        extract($this->extendedGCD($n));
+
+        if (!$gcd->equals($one)) {
+            return false;
+        }
+
+        $x = $x->compare($zero) < 0 ? $x->add($n) : $x;
+
+        return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x);
+    }
+
+    /**
+     * Calculates the greatest common divisor and Bézout's identity.
+     *
+     * Say you have 693 and 609.  The GCD is 21.  Bézout's identity states that there exist integers x and y such that
+     * 693*x + 609*y == 21.  In point of fact, there are actually an infinite number of x and y combinations and which
+     * combination is returned is dependant upon which mode is in use.  See
+     * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bézout's identity - Wikipedia} for more information.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger(693);
+     *    $b = new Math_BigInteger(609);
+     *
+     *    extract($a->extendedGCD($b));
+     *
+     *    echo $gcd->toString() . "\r\n"; // outputs 21
+     *    echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $n
+     * @return Math_BigInteger
+     * @access public
+     * @internal Calculates the GCD using the binary xGCD algorithim described in
+     *    {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}.  As the text above 14.61 notes,
+     *    the more traditional algorithim requires "relatively costly multiple-precision divisions".
+     */
+    function extendedGCD($n)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                extract(gmp_gcdext($this->value, $n->value));
+
+                return array(
+                    'gcd' => $this->_normalize(new Math_BigInteger($g)),
+                    'x'   => $this->_normalize(new Math_BigInteger($s)),
+                    'y'   => $this->_normalize(new Math_BigInteger($t))
+                );
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works
+                // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway.  as is,
+                // the basic extended euclidean algorithim is what we're using.
+
+                $u = $this->value;
+                $v = $n->value;
+
+                $a = '1';
+                $b = '0';
+                $c = '0';
+                $d = '1';
+
+                while (bccomp($v, '0', 0) != 0) {
+                    $q = bcdiv($u, $v, 0);
+
+                    $temp = $u;
+                    $u = $v;
+                    $v = bcsub($temp, bcmul($v, $q, 0), 0);
+
+                    $temp = $a;
+                    $a = $c;
+                    $c = bcsub($temp, bcmul($a, $q, 0), 0);
+
+                    $temp = $b;
+                    $b = $d;
+                    $d = bcsub($temp, bcmul($b, $q, 0), 0);
+                }
+
+                return array(
+                    'gcd' => $this->_normalize(new Math_BigInteger($u)),
+                    'x'   => $this->_normalize(new Math_BigInteger($a)),
+                    'y'   => $this->_normalize(new Math_BigInteger($b))
+                );
+        }
+
+        $y = $n->copy();
+        $x = $this->copy();
+        $g = new Math_BigInteger();
+        $g->value = array(1);
+
+        while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) {
+            $x->_rshift(1);
+            $y->_rshift(1);
+            $g->_lshift(1);
+        }
+
+        $u = $x->copy();
+        $v = $y->copy();
+
+        $a = new Math_BigInteger();
+        $b = new Math_BigInteger();
+        $c = new Math_BigInteger();
+        $d = new Math_BigInteger();
+
+        $a->value = $d->value = $g->value = array(1);
+        $b->value = $c->value = array();
+
+        while ( !empty($u->value) ) {
+            while ( !($u->value[0] & 1) ) {
+                $u->_rshift(1);
+                if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) {
+                    $a = $a->add($y);
+                    $b = $b->subtract($x);
+                }
+                $a->_rshift(1);
+                $b->_rshift(1);
+            }
+
+            while ( !($v->value[0] & 1) ) {
+                $v->_rshift(1);
+                if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) {
+                    $c = $c->add($y);
+                    $d = $d->subtract($x);
+                }
+                $c->_rshift(1);
+                $d->_rshift(1);
+            }
+
+            if ($u->compare($v) >= 0) {
+                $u = $u->subtract($v);
+                $a = $a->subtract($c);
+                $b = $b->subtract($d);
+            } else {
+                $v = $v->subtract($u);
+                $c = $c->subtract($a);
+                $d = $d->subtract($b);
+            }
+        }
+
+        return array(
+            'gcd' => $this->_normalize($g->multiply($v)),
+            'x'   => $this->_normalize($c),
+            'y'   => $this->_normalize($d)
+        );
+    }
+
+    /**
+     * Calculates the greatest common divisor
+     *
+     * Say you have 693 and 609.  The GCD is 21.
+     *
+     * Here's an example:
+     * <code>
+     * <?php
+     *    include('Math/BigInteger.php');
+     *
+     *    $a = new Math_BigInteger(693);
+     *    $b = new Math_BigInteger(609);
+     *
+     *    $gcd = a->extendedGCD($b);
+     *
+     *    echo $gcd->toString() . "\r\n"; // outputs 21
+     * ?>
+     * </code>
+     *
+     * @param Math_BigInteger $n
+     * @return Math_BigInteger
+     * @access public
+     */
+    function gcd($n)
+    {
+        extract($this->extendedGCD($n));
+        return $gcd;
+    }
+
+    /**
+     * Absolute value.
+     *
+     * @return Math_BigInteger
+     * @access public
+     */
+    function abs()
+    {
+        $temp = new Math_BigInteger();
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp->value = gmp_abs($this->value);
+                break;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value;
+                break;
+            default:
+                $temp->value = $this->value;
+        }
+
+        return $temp;
+    }
+
+    /**
+     * Compares two numbers.
+     *
+     * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite.  The reason for this is
+     * demonstrated thusly:
+     *
+     * $x  > $y: $x->compare($y)  > 0
+     * $x  < $y: $x->compare($y)  < 0
+     * $x == $y: $x->compare($y) == 0
+     *
+     * Note how the same comparison operator is used.  If you want to test for equality, use $x->equals($y).
+     *
+     * @param Math_BigInteger $x
+     * @return Integer < 0 if $this is less than $x; > 0 if $this is greater than $x, and 0 if they are equal.
+     * @access public
+     * @see equals()
+     * @internal Could return $this->subtract($x), but that's not as fast as what we do do.
+     */
+    function compare($y)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                return gmp_cmp($this->value, $y->value);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                return bccomp($this->value, $y->value, 0);
+        }
+
+        return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative);
+    }
+
+    /**
+     * Compares two numbers.
+     *
+     * @param Array $x_value
+     * @param Boolean $x_negative
+     * @param Array $y_value
+     * @param Boolean $y_negative
+     * @return Integer
+     * @see compare()
+     * @access private
+     */
+    function _compare($x_value, $x_negative, $y_value, $y_negative)
+    {
+        if ( $x_negative != $y_negative ) {
+            return ( !$x_negative && $y_negative ) ? 1 : -1;
+        }
+
+        $result = $x_negative ? -1 : 1;
+
+        if ( count($x_value) != count($y_value) ) {
+            return ( count($x_value) > count($y_value) ) ? $result : -$result;
+        }
+        $size = max(count($x_value), count($y_value));
+
+        $x_value = array_pad($x_value, $size, 0);
+        $y_value = array_pad($y_value, $size, 0);
+
+        for ($i = count($x_value) - 1; $i >= 0; --$i) {
+            if ($x_value[$i] != $y_value[$i]) {
+                return ( $x_value[$i] > $y_value[$i] ) ? $result : -$result;
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * Tests the equality of two numbers.
+     *
+     * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare()
+     *
+     * @param Math_BigInteger $x
+     * @return Boolean
+     * @access public
+     * @see compare()
+     */
+    function equals($x)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                return gmp_cmp($this->value, $x->value) == 0;
+            default:
+                return $this->value === $x->value && $this->is_negative == $x->is_negative;
+        }
+    }
+
+    /**
+     * Set Precision
+     *
+     * Some bitwise operations give different results depending on the precision being used.  Examples include left
+     * shift, not, and rotates.
+     *
+     * @param Math_BigInteger $x
+     * @access public
+     * @return Math_BigInteger
+     */
+    function setPrecision($bits)
+    {
+        $this->precision = $bits;
+        if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) {
+            $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
+        } else {
+            $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0));
+        }
+
+        $temp = $this->_normalize($this);
+        $this->value = $temp->value;
+    }
+
+    /**
+     * Logical And
+     *
+     * @param Math_BigInteger $x
+     * @access public
+     * @internal Implemented per a request by Lluis Pamies i Juarez <lluis _a_ pamies.cat>
+     * @return Math_BigInteger
+     */
+    function bitwise_and($x)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_and($this->value, $x->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $left = $this->toBytes();
+                $right = $x->toBytes();
+
+                $length = max(strlen($left), strlen($right));
+
+                $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+                $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+                return $this->_normalize(new Math_BigInteger($left & $right, 256));
+        }
+
+        $result = $this->copy();
+
+        $length = min(count($x->value), count($this->value));
+
+        $result->value = array_slice($result->value, 0, $length);
+
+        for ($i = 0; $i < $length; ++$i) {
+            $result->value[$i] = $result->value[$i] & $x->value[$i];
+        }
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Logical Or
+     *
+     * @param Math_BigInteger $x
+     * @access public
+     * @internal Implemented per a request by Lluis Pamies i Juarez <lluis _a_ pamies.cat>
+     * @return Math_BigInteger
+     */
+    function bitwise_or($x)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_or($this->value, $x->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $left = $this->toBytes();
+                $right = $x->toBytes();
+
+                $length = max(strlen($left), strlen($right));
+
+                $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+                $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+                return $this->_normalize(new Math_BigInteger($left | $right, 256));
+        }
+
+        $length = max(count($this->value), count($x->value));
+        $result = $this->copy();
+        $result->value = array_pad($result->value, 0, $length);
+        $x->value = array_pad($x->value, 0, $length);
+
+        for ($i = 0; $i < $length; ++$i) {
+            $result->value[$i] = $this->value[$i] | $x->value[$i];
+        }
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Logical Exclusive-Or
+     *
+     * @param Math_BigInteger $x
+     * @access public
+     * @internal Implemented per a request by Lluis Pamies i Juarez <lluis _a_ pamies.cat>
+     * @return Math_BigInteger
+     */
+    function bitwise_xor($x)
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                $temp = new Math_BigInteger();
+                $temp->value = gmp_xor($this->value, $x->value);
+
+                return $this->_normalize($temp);
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $left = $this->toBytes();
+                $right = $x->toBytes();
+
+                $length = max(strlen($left), strlen($right));
+
+                $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+                $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+                return $this->_normalize(new Math_BigInteger($left ^ $right, 256));
+        }
+
+        $length = max(count($this->value), count($x->value));
+        $result = $this->copy();
+        $result->value = array_pad($result->value, 0, $length);
+        $x->value = array_pad($x->value, 0, $length);
+
+        for ($i = 0; $i < $length; ++$i) {
+            $result->value[$i] = $this->value[$i] ^ $x->value[$i];
+        }
+
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Logical Not
+     *
+     * @access public
+     * @internal Implemented per a request by Lluis Pamies i Juarez <lluis _a_ pamies.cat>
+     * @return Math_BigInteger
+     */
+    function bitwise_not()
+    {
+        // calculuate "not" without regard to $this->precision
+        // (will always result in a smaller number.  ie. ~1 isn't 1111 1110 - it's 0)
+        $temp = $this->toBytes();
+        $pre_msb = decbin(ord($temp[0]));
+        $temp = ~$temp;
+        $msb = decbin(ord($temp[0]));
+        if (strlen($msb) == 8) {
+            $msb = substr($msb, strpos($msb, '0'));
+        }
+        $temp[0] = chr(bindec($msb));
+
+        // see if we need to add extra leading 1's
+        $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8;
+        $new_bits = $this->precision - $current_bits;
+        if ($new_bits <= 0) {
+            return $this->_normalize(new Math_BigInteger($temp, 256));
+        }
+
+        // generate as many leading 1's as we need to.
+        $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3);
+        $this->_base256_lshift($leading_ones, $current_bits);
+
+        $temp = str_pad($temp, ceil($this->bits / 8), chr(0), STR_PAD_LEFT);
+
+        return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256));
+    }
+
+    /**
+     * Logical Right Shift
+     *
+     * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift.
+     *
+     * @param Integer $shift
+     * @return Math_BigInteger
+     * @access public
+     * @internal The only version that yields any speed increases is the internal version.
+     */
+    function bitwise_rightShift($shift)
+    {
+        $temp = new Math_BigInteger();
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                static $two;
+
+                if (!isset($two)) {
+                    $two = gmp_init('2');
+                }
+
+                $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift));
+
+                break;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0);
+
+                break;
+            default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten
+                     // and I don't want to do that...
+                $temp->value = $this->value;
+                $temp->_rshift($shift);
+        }
+
+        return $this->_normalize($temp);
+    }
+
+    /**
+     * Logical Left Shift
+     *
+     * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift.
+     *
+     * @param Integer $shift
+     * @return Math_BigInteger
+     * @access public
+     * @internal The only version that yields any speed increases is the internal version.
+     */
+    function bitwise_leftShift($shift)
+    {
+        $temp = new Math_BigInteger();
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                static $two;
+
+                if (!isset($two)) {
+                    $two = gmp_init('2');
+                }
+
+                $temp->value = gmp_mul($this->value, gmp_pow($two, $shift));
+
+                break;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0);
+
+                break;
+            default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten
+                     // and I don't want to do that...
+                $temp->value = $this->value;
+                $temp->_lshift($shift);
+        }
+
+        return $this->_normalize($temp);
+    }
+
+    /**
+     * Logical Left Rotate
+     *
+     * Instead of the top x bits being dropped they're appended to the shifted bit string.
+     *
+     * @param Integer $shift
+     * @return Math_BigInteger
+     * @access public
+     */
+    function bitwise_leftRotate($shift)
+    {
+        $bits = $this->toBytes();
+
+        if ($this->precision > 0) {
+            $precision = $this->precision;
+            if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) {
+                $mask = $this->bitmask->subtract(new Math_BigInteger(1));
+                $mask = $mask->toBytes();
+            } else {
+                $mask = $this->bitmask->toBytes();
+            }
+        } else {
+            $temp = ord($bits[0]);
+            for ($i = 0; $temp >> $i; ++$i);
+            $precision = 8 * strlen($bits) - 8 + $i;
+            $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
+        }
+
+        if ($shift < 0) {
+            $shift+= $precision;
+        }
+        $shift%= $precision;
+
+        if (!$shift) {
+            return $this->copy();
+        }
+
+        $left = $this->bitwise_leftShift($shift);
+        $left = $left->bitwise_and(new Math_BigInteger($mask, 256));
+        $right = $this->bitwise_rightShift($precision - $shift);
+        $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right);
+        return $this->_normalize($result);
+    }
+
+    /**
+     * Logical Right Rotate
+     *
+     * Instead of the bottom x bits being dropped they're prepended to the shifted bit string.
+     *
+     * @param Integer $shift
+     * @return Math_BigInteger
+     * @access public
+     */
+    function bitwise_rightRotate($shift)
+    {
+        return $this->bitwise_leftRotate(-$shift);
+    }
+
+    /**
+     * Set random number generator function
+     *
+     * $generator should be the name of a random generating function whose first parameter is the minimum
+     * value and whose second parameter is the maximum value.  If this function needs to be seeded, it should
+     * be seeded prior to calling Math_BigInteger::random() or Math_BigInteger::randomPrime()
+     *
+     * If the random generating function is not explicitly set, it'll be assumed to be mt_rand().
+     *
+     * @see random()
+     * @see randomPrime()
+     * @param optional String $generator
+     * @access public
+     */
+    function setRandomGenerator($generator)
+    {
+        $this->generator = $generator;
+    }
+
+    /**
+     * Generate a random number
+     *
+     * @param optional Integer $min
+     * @param optional Integer $max
+     * @return Math_BigInteger
+     * @access public
+     */
+    function random($min = false, $max = false)
+    {
+        if ($min === false) {
+            $min = new Math_BigInteger(0);
+        }
+
+        if ($max === false) {
+            $max = new Math_BigInteger(0x7FFFFFFF);
+        }
+
+        $compare = $max->compare($min);
+
+        if (!$compare) {
+            return $this->_normalize($min);
+        } else if ($compare < 0) {
+            // if $min is bigger then $max, swap $min and $max
+            $temp = $max;
+            $max = $min;
+            $min = $temp;
+        }
+
+        $generator = $this->generator;
+
+        $max = $max->subtract($min);
+        $max = ltrim($max->toBytes(), chr(0));
+        $size = strlen($max) - 1;
+        $random = '';
+
+        $bytes = $size & 1;
+        for ($i = 0; $i < $bytes; ++$i) {
+            $random.= chr($generator(0, 255));
+        }
+
+        $blocks = $size >> 1;
+        for ($i = 0; $i < $blocks; ++$i) {
+            // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems
+            $random.= pack('n', $generator(0, 0xFFFF));
+        }
+
+        $temp = new Math_BigInteger($random, 256);
+        if ($temp->compare(new Math_BigInteger(substr($max, 1), 256)) > 0) {
+            $random = chr($generator(0, ord($max[0]) - 1)) . $random;
+        } else {
+            $random = chr($generator(0, ord($max[0])    )) . $random;
+        }
+
+        $random = new Math_BigInteger($random, 256);
+
+        return $this->_normalize($random->add($min));
+    }
+
+    /**
+     * Generate a random prime number.
+     *
+     * If there's not a prime within the given range, false will be returned.  If more than $timeout seconds have elapsed,
+     * give up and return false.
+     *
+     * @param optional Integer $min
+     * @param optional Integer $max
+     * @param optional Integer $timeout
+     * @return Math_BigInteger
+     * @access public
+     * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}.
+     */
+    function randomPrime($min = false, $max = false, $timeout = false)
+    {
+        $compare = $max->compare($min);
+
+        if (!$compare) {
+            return $min;
+        } else if ($compare < 0) {
+            // if $min is bigger then $max, swap $min and $max
+            $temp = $max;
+            $max = $min;
+            $min = $temp;
+        }
+
+        // gmp_nextprime() requires PHP 5 >= 5.2.0 per <http://php.net/gmp-nextprime>.
+        if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) {
+            // we don't rely on Math_BigInteger::random()'s min / max when gmp_nextprime() is being used since this function
+            // does its own checks on $max / $min when gmp_nextprime() is used.  When gmp_nextprime() is not used, however,
+            // the same $max / $min checks are not performed.
+            if ($min === false) {
+                $min = new Math_BigInteger(0);
+            }
+
+            if ($max === false) {
+                $max = new Math_BigInteger(0x7FFFFFFF);
+            }
+
+            $x = $this->random($min, $max);
+
+            $x->value = gmp_nextprime($x->value);
+
+            if ($x->compare($max) <= 0) {
+                return $x;
+            }
+
+            $x->value = gmp_nextprime($min->value);
+
+            if ($x->compare($max) <= 0) {
+                return $x;
+            }
+
+            return false;
+        }
+
+        static $one, $two;
+        if (!isset($one)) {
+            $one = new Math_BigInteger(1);
+            $two = new Math_BigInteger(2);
+        }
+
+        $start = time();
+
+        $x = $this->random($min, $max);
+        if ($x->equals($two)) {
+            return $x;
+        }
+
+        $x->_make_odd();
+        if ($x->compare($max) > 0) {
+            // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range
+            if ($min->equals($max)) {
+                return false;
+            }
+            $x = $min->copy();
+            $x->_make_odd();
+        }
+
+        $initial_x = $x->copy();
+
+        while (true) {
+            if ($timeout !== false && time() - $start > $timeout) {
+                return false;
+            }
+
+            if ($x->isPrime()) {
+                return $x;
+            }
+
+            $x = $x->add($two);
+
+            if ($x->compare($max) > 0) {
+                $x = $min->copy();
+                if ($x->equals($two)) {
+                    return $x;
+                }
+                $x->_make_odd();
+            }
+
+            if ($x->equals($initial_x)) {
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Make the current number odd
+     *
+     * If the current number is odd it'll be unchanged.  If it's even, one will be added to it.
+     *
+     * @see randomPrime()
+     * @access private
+     */
+    function _make_odd()
+    {
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                gmp_setbit($this->value, 0);
+                break;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                if ($this->value[strlen($this->value) - 1] % 2 == 0) {
+                    $this->value = bcadd($this->value, '1');
+                }
+                break;
+            default:
+                $this->value[0] |= 1;
+        }
+    }
+
+    /**
+     * Checks a numer to see if it's prime
+     *
+     * Assuming the $t parameter is not set, this function has an error rate of 2**-80.  The main motivation for the
+     * $t parameter is distributability.  Math_BigInteger::randomPrime() can be distributed accross multiple pageloads
+     * on a website instead of just one.
+     *
+     * @param optional Integer $t
+     * @return Boolean
+     * @access public
+     * @internal Uses the
+     *     {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}.  See 
+     *     {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}.
+     */
+    function isPrime($t = false)
+    {
+        $length = strlen($this->toBytes());
+
+        if (!$t) {
+            // see HAC 4.49 "Note (controlling the error probability)"
+                 if ($length >= 163) { $t =  2; } // floor(1300 / 8)
+            else if ($length >= 106) { $t =  3; } // floor( 850 / 8)
+            else if ($length >= 81 ) { $t =  4; } // floor( 650 / 8)
+            else if ($length >= 68 ) { $t =  5; } // floor( 550 / 8)
+            else if ($length >= 56 ) { $t =  6; } // floor( 450 / 8)
+            else if ($length >= 50 ) { $t =  7; } // floor( 400 / 8)
+            else if ($length >= 43 ) { $t =  8; } // floor( 350 / 8)
+            else if ($length >= 37 ) { $t =  9; } // floor( 300 / 8)
+            else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8)
+            else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8)
+            else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8)
+            else                     { $t = 27; }
+        }
+
+        // ie. gmp_testbit($this, 0)
+        // ie. isEven() or !isOdd()
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                return gmp_prob_prime($this->value, $t) != 0;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                if ($this->value === '2') {
+                    return true;
+                }
+                if ($this->value[strlen($this->value) - 1] % 2 == 0) {
+                    return false;
+                }
+                break;
+            default:
+                if ($this->value == array(2)) {
+                    return true;
+                }
+                if (~$this->value[0] & 1) {
+                    return false;
+                }
+        }
+
+        static $primes, $zero, $one, $two;
+
+        if (!isset($primes)) {
+            $primes = array(
+                3,    5,    7,    11,   13,   17,   19,   23,   29,   31,   37,   41,   43,   47,   53,   59,   
+                61,   67,   71,   73,   79,   83,   89,   97,   101,  103,  107,  109,  113,  127,  131,  137,  
+                139,  149,  151,  157,  163,  167,  173,  179,  181,  191,  193,  197,  199,  211,  223,  227,  
+                229,  233,  239,  241,  251,  257,  263,  269,  271,  277,  281,  283,  293,  307,  311,  313,  
+                317,  331,  337,  347,  349,  353,  359,  367,  373,  379,  383,  389,  397,  401,  409,  419,  
+                421,  431,  433,  439,  443,  449,  457,  461,  463,  467,  479,  487,  491,  499,  503,  509,  
+                521,  523,  541,  547,  557,  563,  569,  571,  577,  587,  593,  599,  601,  607,  613,  617,  
+                619,  631,  641,  643,  647,  653,  659,  661,  673,  677,  683,  691,  701,  709,  719,  727,  
+                733,  739,  743,  751,  757,  761,  769,  773,  787,  797,  809,  811,  821,  823,  827,  829,  
+                839,  853,  857,  859,  863,  877,  881,  883,  887,  907,  911,  919,  929,  937,  941,  947,  
+                953,  967,  971,  977,  983,  991,  997
+            );
+
+            if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) {
+                for ($i = 0; $i < count($primes); ++$i) {
+                    $primes[$i] = new Math_BigInteger($primes[$i]);
+                }
+            }
+
+            $zero = new Math_BigInteger();
+            $one = new Math_BigInteger(1);
+            $two = new Math_BigInteger(2);
+        }
+
+        if ($this->equals($one)) {
+            return false;
+        }
+
+        // see HAC 4.4.1 "Random search for probable primes"
+        if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) {
+            foreach ($primes as $prime) {
+                list(, $r) = $this->divide($prime);
+                if ($r->equals($zero)) {
+                    return $this->equals($prime);
+                }
+            }
+        } else {
+            $value = $this->value;
+            foreach ($primes as $prime) {
+                list(, $r) = $this->_divide_digit($value, $prime);
+                if (!$r) {
+                    return count($value) == 1 && $value[0] == $prime;
+                }
+            }
+        }
+
+        $n   = $this->copy();
+        $n_1 = $n->subtract($one);
+        $n_2 = $n->subtract($two);
+
+        $r = $n_1->copy();
+        $r_value = $r->value;
+        // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s));
+        if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) {
+            $s = 0;
+            // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
+            while ($r->value[strlen($r->value) - 1] % 2 == 0) {
+                $r->value = bcdiv($r->value, '2', 0);
+                ++$s;
+            }
+        } else {
+            for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
+                $temp = ~$r_value[$i] & 0xFFFFFF;
+                for ($j = 1; ($temp >> $j) & 1; ++$j);
+                if ($j != 25) {
+                    break;
+                }
+            }
+            $s = 26 * $i + $j - 1;
+            $r->_rshift($s);
+        }
+
+        for ($i = 0; $i < $t; ++$i) {
+            $a = $this->random($two, $n_2);
+            $y = $a->modPow($r, $n);
+
+            if (!$y->equals($one) && !$y->equals($n_1)) {
+                for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) {
+                    $y = $y->modPow($two, $n);
+                    if ($y->equals($one)) {
+                        return false;
+                    }
+                }
+
+                if (!$y->equals($n_1)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Logical Left Shift
+     *
+     * Shifts BigInteger's by $shift bits.
+     *
+     * @param Integer $shift
+     * @access private
+     */
+    function _lshift($shift)
+    {
+        if ( $shift == 0 ) {
+            return;
+        }
+
+        $num_digits = (int) ($shift / 26);
+        $shift %= 26;
+        $shift = 1 << $shift;
+
+        $carry = 0;
+
+        for ($i = 0; $i < count($this->value); ++$i) {
+            $temp = $this->value[$i] * $shift + $carry;
+            $carry = (int) ($temp / 0x4000000);
+            $this->value[$i] = (int) ($temp - $carry * 0x4000000);
+        }
+
+        if ( $carry ) {
+            $this->value[] = $carry;
+        }
+
+        while ($num_digits--) {
+            array_unshift($this->value, 0);
+        }
+    }
+
+    /**
+     * Logical Right Shift
+     *
+     * Shifts BigInteger's by $shift bits.
+     *
+     * @param Integer $shift
+     * @access private
+     */
+    function _rshift($shift)
+    {
+        if ($shift == 0) {
+            return;
+        }
+
+        $num_digits = (int) ($shift / 26);
+        $shift %= 26;
+        $carry_shift = 26 - $shift;
+        $carry_mask = (1 << $shift) - 1;
+
+        if ( $num_digits ) {
+            $this->value = array_slice($this->value, $num_digits);
+        }
+
+        $carry = 0;
+
+        for ($i = count($this->value) - 1; $i >= 0; --$i) {
+            $temp = $this->value[$i] >> $shift | $carry;
+            $carry = ($this->value[$i] & $carry_mask) << $carry_shift;
+            $this->value[$i] = $temp;
+        }
+
+        $this->value = $this->_trim($this->value);
+    }
+
+    /**
+     * Normalize
+     *
+     * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision
+     *
+     * @param Math_BigInteger
+     * @return Math_BigInteger
+     * @see _trim()
+     * @access private
+     */
+    function _normalize($result)
+    {
+        $result->precision = $this->precision;
+        $result->bitmask = $this->bitmask;
+
+        switch ( MATH_BIGINTEGER_MODE ) {
+            case MATH_BIGINTEGER_MODE_GMP:
+                if (!empty($result->bitmask->value)) {
+                    $result->value = gmp_and($result->value, $result->bitmask->value);
+                }
+
+                return $result;
+            case MATH_BIGINTEGER_MODE_BCMATH:
+                if (!empty($result->bitmask->value)) {
+                    $result->value = bcmod($result->value, $result->bitmask->value);
+                }
+
+                return $result;
+        }
+
+        $value = &$result->value;
+
+        if ( !count($value) ) {
+            return $result;
+        }
+
+        $value = $this->_trim($value);
+
+        if (!empty($result->bitmask->value)) {
+            $length = min(count($value), count($this->bitmask->value));
+            $value = array_slice($value, 0, $length);
+
+            for ($i = 0; $i < $length; ++$i) {
+                $value[$i] = $value[$i] & $this->bitmask->value[$i];
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Trim
+     *
+     * Removes leading zeros
+     *
+     * @return Math_BigInteger
+     * @access private
+     */
+    function _trim($value)
+    {
+        for ($i = count($value) - 1; $i >= 0; --$i) {
+            if ( $value[$i] ) {
+                break;
+            }
+            unset($value[$i]);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Array Repeat
+     *
+     * @param $input Array
+     * @param $multiplier mixed
+     * @return Array
+     * @access private
+     */
+    function _array_repeat($input, $multiplier)
+    {
+        return ($multiplier) ? array_fill(0, $multiplier, $input) : array();
+    }
+
+    /**
+     * Logical Left Shift
+     *
+     * Shifts binary strings $shift bits, essentially multiplying by 2**$shift.
+     *
+     * @param $x String
+     * @param $shift Integer
+     * @return String
+     * @access private
+     */
+    function _base256_lshift(&$x, $shift)
+    {
+        if ($shift == 0) {
+            return;
+        }
+
+        $num_bytes = $shift >> 3; // eg. floor($shift/8)
+        $shift &= 7; // eg. $shift % 8
+
+        $carry = 0;
+        for ($i = strlen($x) - 1; $i >= 0; --$i) {
+            $temp = ord($x[$i]) << $shift | $carry;
+            $x[$i] = chr($temp);
+            $carry = $temp >> 8;
+        }
+        $carry = ($carry != 0) ? chr($carry) : '';
+        $x = $carry . $x . str_repeat(chr(0), $num_bytes);
+    }
+
+    /**
+     * Logical Right Shift
+     *
+     * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder.
+     *
+     * @param $x String
+     * @param $shift Integer
+     * @return String
+     * @access private
+     */
+    function _base256_rshift(&$x, $shift)
+    {
+        if ($shift == 0) {
+            $x = ltrim($x, chr(0));
+            return '';
+        }
+
+        $num_bytes = $shift >> 3; // eg. floor($shift/8)
+        $shift &= 7; // eg. $shift % 8
+
+        $remainder = '';
+        if ($num_bytes) {
+            $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes;
+            $remainder = substr($x, $start);
+            $x = substr($x, 0, -$num_bytes);
+        }
+
+        $carry = 0;
+        $carry_shift = 8 - $shift;
+        for ($i = 0; $i < strlen($x); ++$i) {
+            $temp = (ord($x[$i]) >> $shift) | $carry;
+            $carry = (ord($x[$i]) << $carry_shift) & 0xFF;
+            $x[$i] = chr($temp);
+        }
+        $x = ltrim($x, chr(0));
+
+        $remainder = chr($carry >> $carry_shift) . $remainder;
+
+        return ltrim($remainder, chr(0));
+    }
+
+    // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long
+    // at 32-bits, while java's longs are 64-bits.
+
+    /**
+     * Converts 32-bit integers to bytes.
+     *
+     * @param Integer $x
+     * @return String
+     * @access private
+     */
+    function _int2bytes($x)
+    {
+        return ltrim(pack('N', $x), chr(0));
+    }
+
+    /**
+     * Converts bytes to 32-bit integers
+     *
+     * @param String $x
+     * @return Integer
+     * @access private
+     */
+    function _bytes2int($x)
+    {
+        $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT));
+        return $temp['int'];
+    }
+}
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/hkit/hcard.profile.php b/plugins/OStatus/extlib/hkit/hcard.profile.php
deleted file mode 100644 (file)
index 6ec0dc8..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-       // hcard profile for hkit
-       
-       $this->root_class = 'vcard';
-       
-       $this->classes = array( 
-               'fn', array('honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix'),
-               'n', array('honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix'),
-               'adr', array('post-office-box', 'extended-address', 'street-address', 'postal-code', 'country-name', 'type', 'region', 'locality'),
-               'label', 'bday', 'agent', 'nickname', 'photo', 'class', 
-               'email', array('type', 'value'), 
-               'category', 'key', 'logo', 'mailer', 'note',
-               'org', array('organization-name', 'organization-unit'),
-               'tel', array('type', 'value'),
-               'geo', array('latitude', 'longitude'),
-               'tz', 'uid', 'url', 'rev', 'role', 'sort-string', 'sound', 'title'              
-       );
-       
-       // classes that must only appear once per card
-       $this->singles = array(
-               'fn'
-       );
-       
-       // classes that are required (not strictly enforced - give at least one!)
-       $this->required = array(
-               'fn'
-       );
-
-       $this->att_map = array(
-               'fn'    => array('IMG|alt'),
-               'url'   => array('A|href', 'IMG|src', 'AREA|href'),
-               'photo' => array('IMG|src'),
-               'bday'  => array('ABBR|title'),
-               'logo'  => array('IMG|src'),
-               'email' => array('A|href'),
-               'geo'   => array('ABBR|title')
-       );
-
-       
-       $this->callbacks = array(
-               'url'   => array($this, 'resolvePath'),
-               'photo' => array($this, 'resolvePath'),
-               'logo'  => array($this, 'resolvePath'),
-               'email' => array($this, 'resolveEmail')
-       );
-
-
-
-       function hKit_hcard_post($a)
-       {
-               
-               foreach ($a as &$vcard){
-                       
-                       hKit_implied_n_optimization($vcard);
-                       hKit_implied_n_from_fn($vcard);
-                       
-               }
-               
-               return $a;
-       
-       }
-       
-       
-       function hKit_implied_n_optimization(&$vcard)
-       {
-               if (array_key_exists('fn', $vcard) && !is_array($vcard['fn']) && 
-                       !array_key_exists('n', $vcard) && (!array_key_exists('org', $vcard) || $vcard['fn'] != $vcard['org'])){
-                       
-                       if (sizeof(explode(' ', $vcard['fn'])) == 2){
-                               $patterns       = array();
-                               $patterns[] = array('/^(\S+),\s*(\S{1})$/', 2, 1);              // Lastname, Initial
-                               $patterns[] = array('/^(\S+)\s*(\S{1})\.*$/', 2, 1);    // Lastname Initial(.)
-                               $patterns[] = array('/^(\S+),\s*(\S+)$/', 2, 1);                // Lastname, Firstname
-                               $patterns[] = array('/^(\S+)\s*(\S+)$/', 1, 2);                 // Firstname Lastname
-                       
-                               foreach ($patterns as $pattern){
-                                       if (preg_match($pattern[0], $vcard['fn'], $matches) === 1){
-                                               $n                                      = array();
-                                               $n['given-name']        = $matches[$pattern[1]];
-                                               $n['family-name']       = $matches[$pattern[2]];
-                                               $vcard['n']                     = $n;
-                                               
-                                               
-                                               break;
-                                       }
-                               }
-                       }
-               }
-       }
-       
-       
-       function hKit_implied_n_from_fn(&$vcard)
-       {
-               if (array_key_exists('fn', $vcard) && is_array($vcard['fn']) 
-                       && !array_key_exists('n', $vcard) && (!array_key_exists('org', $vcard) || $vcard['fn'] != $vcard['org'])){
-                               
-                       $vcard['n']             = $vcard['fn'];
-               }
-
-               if (array_key_exists('fn', $vcard) && is_array($vcard['fn'])){
-                       $vcard['fn']    = $vcard['fn']['text'];
-               }
-       }
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/hkit/hkit.class.php b/plugins/OStatus/extlib/hkit/hkit.class.php
deleted file mode 100644 (file)
index c3a54cf..0000000
+++ /dev/null
@@ -1,475 +0,0 @@
-<?php
-
-       /* 
-       
-       hKit Library for PHP5 - a generic library for parsing Microformats
-       Copyright (C) 2006  Drew McLellan
-
-       This library is free software; you can redistribute it and/or
-       modify it under the terms of the GNU Lesser General Public
-       License as published by the Free Software Foundation; either
-       version 2.1 of the License, or (at your option) any later version.
-
-       This library is distributed in the hope that it will be useful,
-       but WITHOUT ANY WARRANTY; without even the implied warranty of
-       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-       Lesser General Public License for more details.
-
-       You should have received a copy of the GNU Lesser General Public
-       License along with this library; if not, write to the Free Software
-       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-       
-       Author  
-               Drew McLellan - http://allinthehead.com/
-               
-       Contributors:
-               Scott Reynen - http://www.randomchaos.com/
-               
-       Version 0.5, 22-Jul-2006
-               fixed by-ref issue cropping up in PHP 5.0.5
-               fixed a bug with a@title
-               added support for new fn=n optimisation
-               added support for new a.include include-pattern
-       Version 0.4, 23-Jun-2006
-               prevented nested includes from causing infinite loops
-               returns false if URL can't be fetched
-               added pre-flight check for base support level
-               added deduping of once-only classnames
-               prevented accumulation of multiple 'value' values
-               tuned whitespace handling and treatment of DEL elements
-       Version 0.3, 21-Jun-2006
-               added post-processor callback method into profiles
-               fixed minor problems raised by hcard testsuite
-               added support for include-pattern
-               added support for td@headers pattern
-               added implied-n optimization into default hcard profile
-       Version 0.2, 20-Jun-2006
-               added class callback mechanism
-               added resolvePath & resolveEmail
-               added basic BASE support
-       Version 0.1.1, 19-Jun-2006 (different timezone, no time machine)
-               added external Tidy option
-       Version 0.1, 20-Jun-2006
-               initial release
-               
-       
-       
-       
-       */
-
-       class hKit
-       {
-               
-               public $tidy_mode       = 'proxy'; // 'proxy', 'exec', 'php' or 'none'
-               public $tidy_proxy      = 'http://cgi.w3.org/cgi-bin/tidy?forceXML=on&docAddr='; // required only for tidy_mode=proxy
-               public $tmp_dir         = '/path/to/writable/dir/'; // required only for tidy_mode=exec
-               
-               private $root_class = '';
-               private $classes        = '';
-               private $singles        = '';
-               private $required       = '';
-               private $att_map        = '';
-               private $callbacks      = '';
-               private $processor      = '';
-               
-               private $url            = '';
-               private $base           = '';
-               private $doc            = '';
-               
-               
-               public function hKit()
-               {
-                       // pre-flight checks
-                       $pass           = true; 
-                       $required       = array('dom_import_simplexml', 'file_get_contents', 'simplexml_load_string');
-                       $missing        = array();
-                       
-                       foreach ($required as $f){
-                               if (!function_exists($f)){
-                                       $pass           = false;
-                                       $missing[]      = $f . '()';
-                               }
-                       }
-                       
-                       if (!$pass)
-                               die('hKit error: these required functions are not available: <strong>' . implode(', ', $missing) . '</strong>');
-                       
-               }
-               
-
-               public function getByURL($profile='', $url='')
-               {
-                       
-                       if ($profile=='' || $url == '') return false;
-                       
-                       $this->loadProfile($profile);
-                       
-                       $source         = $this->loadURL($url);
-                       
-                       if ($source){
-                               $tidy_xhtml     = $this->tidyThis($source);
-
-                               $fragment       = false;
-                       
-                               if (strrchr($url, '#'))
-                               $fragment       = array_pop(explode('#', $url));
-                       
-                               $doc            = $this->loadDoc($tidy_xhtml, $fragment);
-                               $s                      = $this->processNodes($doc, $this->classes);
-                               $s                      = $this->postProcess($profile, $s);
-                       
-                               return $s;
-                       }else{
-                               return false;
-                       }
-               }
-               
-               public function getByString($profile='', $input_xml='')
-               {
-                       if ($profile=='' || $input_xml == '') return false;
-                       
-                       $this->loadProfile($profile);
-
-                       $doc    = $this->loadDoc($input_xml);
-                       $s              = $this->processNodes($doc, $this->classes);
-                       $s              = $this->postProcess($profile, $s);
-                       
-                       return $s;
-                       
-               }
-               
-               private function processNodes($items, $classes, $allow_includes=true){
-
-                       $out    = array();
-
-                       foreach($items as $item){
-                               $data   = array();
-
-                               for ($i=0; $i<sizeof($classes); $i++){
-                                       
-                                       if (!is_array($classes[$i])){
-
-                                               $xpath                  = ".//*[contains(concat(' ',normalize-space(@class),' '),' " . $classes[$i] . " ')]";
-                                               $results                = $item->xpath($xpath);
-                                               
-                                               if ($results){
-                                                       foreach ($results as $result){ 
-                                                               if (isset($classes[$i+1]) && is_array($classes[$i+1])){
-                                                                       $nodes                          = $this->processNodes($results, $classes[$i+1]);
-                                                                       if (sizeof($nodes) > 0){
-                                                                               $nodes = array_merge(array('text'=>$this->getNodeValue($result, $classes[$i])), $nodes);
-                                                                               $data[$classes[$i]]     = $nodes;
-                                                                       }else{
-                                                                               $data[$classes[$i]]     = $this->getNodeValue($result, $classes[$i]);
-                                                                       }
-                                                                       
-                                                               }else{                                                          
-                                                                       if (isset($data[$classes[$i]])){
-                                                                               if (is_array($data[$classes[$i]])){
-                                                                                       // is already an array - append
-                                                                                       $data[$classes[$i]][]   = $this->getNodeValue($result, $classes[$i]);
-
-                                                                               }else{
-                                                                                       // make it an array
-                                                                                       if ($classes[$i] == 'value'){ // unless it's the 'value' of a type/value pattern
-                                                                                               $data[$classes[$i]] .= $this->getNodeValue($result, $classes[$i]);
-                                                                                       }else{
-                                                                                               $old_val                        = $data[$classes[$i]];
-                                                                                               $data[$classes[$i]]     = array($old_val, $this->getNodeValue($result, $classes[$i]));
-                                                                                               $old_val                        = false;
-                                                                                       }
-                                                                               }
-                                                                       }else{                                                                          
-                                                                               // set as normal value
-                                                                               $data[$classes[$i]]     = $this->getNodeValue($result, $classes[$i]);
-
-                                                                       }
-                                                               }
-                                                       
-                                                               // td@headers pattern
-                                                               if (strtoupper(dom_import_simplexml($result)->tagName)== "TD" && $result['headers']){
-                                                                       $include_ids    = explode(' ', $result['headers']);
-                                                                       $doc                    = $this->doc;
-                                                                       foreach ($include_ids as $id){
-                                                                               $xpath                  = "//*[@id='$id']/..";
-                                                                               $includes               = $doc->xpath($xpath);
-                                                                               foreach ($includes as $include){
-                                                                                       $tmp = $this->processNodes($include, $this->classes);
-                                                                                       if (is_array($tmp)) $data = array_merge($data, $tmp);
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }                                       
-                                               }                               
-                                       }
-                                       $result = false;
-                               }
-                               
-                               // include-pattern
-                               if ($allow_includes){
-                                       $xpath                  = ".//*[contains(concat(' ',normalize-space(@class),' '),' include ')]";
-                                       $results                = $item->xpath($xpath);
-                               
-                                       if ($results){
-                                               foreach ($results as $result){
-                                                       $tagName = strtoupper(dom_import_simplexml($result)->tagName);
-                                                       if ((($tagName == "OBJECT" && $result['data']) || ($tagName == "A" && $result['href'])) 
-                                                                       && preg_match('/\binclude\b/', $result['class'])){      
-                                                               $att            = ($tagName == "OBJECT" ? 'data' : 'href');                                             
-                                                               $id                     = str_replace('#', '', $result[$att]);
-                                                               $doc            = $this->doc;
-                                                               $xpath          = "//*[@id='$id']";
-                                                               $includes       = $doc->xpath($xpath);
-                                                               foreach ($includes as $include){
-                                                                       $include        = simplexml_load_string('<root1><root2>'.$include->asXML().'</root2></root1>'); // don't ask.
-                                                                       $tmp            = $this->processNodes($include, $this->classes, false);
-                                                                       if (is_array($tmp)) $data = array_merge($data, $tmp);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                               $out[]  = $data;
-                       }
-                       
-                       if (sizeof($out) > 1){
-                               return $out;
-                       }else if (isset($data)){
-                               return $data;
-                       }else{
-                               return array();
-                       }
-               }
-
-
-               private function getNodeValue($node, $className)
-               {
-
-                       $tag_name       = strtoupper(dom_import_simplexml($node)->tagName);
-                       $s                      = false;
-                       
-                       // ignore DEL tags
-                       if ($tag_name == 'DEL') return $s;
-                       
-                       // look up att map values
-                       if (array_key_exists($className, $this->att_map)){
-                               
-                               foreach ($this->att_map[$className] as $map){                                   
-                                       if (preg_match("/$tag_name\|/", $map)){
-                                               $s      = ''.$node[array_pop($foo = explode('|', $map))];
-                                       }
-                               }
-                       }
-                       
-                       // if nothing and OBJ, try data.
-                       if (!$s && $tag_name=='OBJECT' && $node['data'])        $s      = ''.$node['data'];
-                       
-                       // if nothing and IMG, try alt.
-                       if (!$s && $tag_name=='IMG' && $node['alt'])    $s      = ''.$node['alt'];
-                       
-                       // if nothing and AREA, try alt.
-                       if (!$s && $tag_name=='AREA' && $node['alt'])   $s      = ''.$node['alt'];
-                       
-                       //if nothing and not A, try title.
-                       if (!$s && $tag_name!='A' && $node['title'])    $s      = ''.$node['title'];
-                               
-                       
-                       // if nothing found, go with node text
-                       $s      = ($s ? $s : implode(array_filter($node->xpath('child::node()'), array(&$this, "filterBlankValues")), ' '));                    
-
-                       // callbacks                    
-                       if (array_key_exists($className, $this->callbacks)){
-                               $s      = preg_replace_callback('/.*/', $this->callbacks[$className], $s, 1);
-                       }
-                       
-                       // trim and remove line breaks
-                       if ($tag_name != 'PRE'){
-                               $s      = trim(preg_replace('/[\r\n\t]+/', '', $s));
-                               $s      = trim(preg_replace('/(\s{2})+/', ' ', $s));
-                       }
-                       
-                       return $s;
-               }
-
-               private function filterBlankValues($s){
-                       return preg_match("/\w+/", $s);
-               }
-               
-               
-               private function tidyThis($source)
-               {
-                       switch ( $this->tidy_mode )
-                       {
-                               case 'exec':
-                                       $tmp_file       = $this->tmp_dir.md5($source).'.txt';
-                                       file_put_contents($tmp_file, $source);
-                                       exec("tidy -utf8 -indent -asxhtml -numeric -bare -quiet $tmp_file", $tidy);
-                                       unlink($tmp_file);
-                                       return implode("\n", $tidy);
-                               break;
-                               
-                               case 'php':
-                                       $tidy   = tidy_parse_string($source);
-                                       return tidy_clean_repair($tidy);
-                               break;
-                                               
-                               default:
-                                       return $source;
-                               break;
-                       }
-                       
-               }
-               
-               
-               private function loadProfile($profile)
-               {
-                       require_once("$profile.profile.php");
-               }
-               
-               
-               private function loadDoc($input_xml, $fragment=false)
-               {
-                       $xml            = simplexml_load_string($input_xml);
-                       
-                       $this->doc      = $xml;
-                       
-                       if ($fragment){
-                               $doc    = $xml->xpath("//*[@id='$fragment']");
-                               $xml    = simplexml_load_string($doc[0]->asXML());
-                               $doc    = null;
-                       }
-                       
-                       // base tag
-                       if ($xml->head->base['href']) $this->base = $xml->head->base['href'];                   
-
-                       // xml:base attribute - PITA with SimpleXML
-                       preg_match('/xml:base="(.*)"/', $xml->asXML(), $matches);
-                       if (is_array($matches) && sizeof($matches)>1) $this->base = $matches[1];
-                                                               
-                       return  $xml->xpath("//*[contains(concat(' ',normalize-space(@class),' '),' $this->root_class ')]");
-                       
-               }
-               
-               
-               private function loadURL($url)
-               {
-                       $this->url      = $url;
-                       
-                       if ($this->tidy_mode == 'proxy' && $this->tidy_proxy != ''){
-                               $url    = $this->tidy_proxy . $url;
-                       }
-               
-                       return @file_get_contents($url);
-                       
-               }
-               
-               
-               private function postProcess($profile, $s)
-               {
-                       $required       = $this->required;
-                       
-                       if (is_array($s) && array_key_exists($required[0], $s)){
-                               $s      = array($s);
-                       }
-                       
-                       $s      = $this->dedupeSingles($s);
-                       
-                       if (function_exists('hKit_'.$profile.'_post')){
-                               $s              = call_user_func('hKit_'.$profile.'_post', $s);
-                       }
-                       
-                       $s      = $this->removeTextVals($s);
-                       
-                       return $s;
-               }
-               
-               
-               private function resolvePath($filepath)
-               {       // ugly code ahoy: needs a serious tidy up
-                                       
-                       $filepath       = $filepath[0];
-                       
-                       $base   = $this->base;
-                       $url    = $this->url;
-                       
-                       if ($base != '' &&  strpos($base, '://') !== false)
-                               $url    = $base;
-                       
-                       $r              = parse_url($url);
-                       $domain = $r['scheme'] . '://' . $r['host'];
-
-                       if (!isset($r['path'])) $r['path'] = '/';
-                       $path   = explode('/', $r['path']);
-                       $file   = explode('/', $filepath);
-                       $new    = array('');
-
-                       if (strpos($filepath, '://') !== false || strpos($filepath, 'data:') !== false){
-                               return $filepath;
-                       }
-
-                       if ($file[0] == ''){
-                               // absolute path
-                               return ''.$domain . implode('/', $file);
-                       }else{
-                               // relative path
-                               if ($path[sizeof($path)-1] == '') array_pop($path);
-                               if (strpos($path[sizeof($path)-1], '.') !== false) array_pop($path);
-
-                               foreach ($file as $segment){
-                                       if ($segment == '..'){
-                                               array_pop($path);
-                                       }else{
-                                               $new[]  = $segment;
-                                       }
-                               }
-                               return ''.$domain . implode('/', $path) . implode('/', $new);
-                       }       
-               }
-               
-               private function resolveEmail($v)
-               {
-                       $parts  = parse_url($v[0]);
-                       return ($parts['path']);
-               }
-               
-               
-               private function dedupeSingles($s)
-               {
-                       $singles        = $this->singles;
-                       
-                       foreach ($s as &$item){
-                               foreach ($singles as $classname){
-                                       if (array_key_exists($classname, $item) && is_array($item[$classname])){
-                                               if (isset($item[$classname][0])) $item[$classname]      = $item[$classname][0];
-                                       }
-                               }
-                       }
-                       
-                       return $s;
-               }
-               
-               private function removeTextVals($s)
-               {
-                       foreach ($s as $key => &$val){
-                               if ($key){
-                                       $k = $key;
-                               }else{
-                                       $k = '';
-                               }
-                               
-                               if (is_array($val)){
-                                       $val = $this->removeTextVals($val);
-                               }else{
-                                       if ($k == 'text'){
-                                               $val = '';
-                                       }
-                               }
-                       }
-                       
-                       return array_filter($s);
-               }
-
-       }
-
-
-?>
\ No newline at end of file
index f8449b309ec11bda481710af91b803118921f89c..7187c1f3e95ca122f704d52b4d92f6712e23dead 100644 (file)
@@ -40,7 +40,7 @@ class Discovery
     const PROFILEPAGE = 'http://webfinger.net/rel/profile-page';
     const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from';
     const HCARD = 'http://microformats.org/profile/hcard';
-    
+
     public $methods = array();
 
     public function __construct()
@@ -50,12 +50,11 @@ class Discovery
         $this->registerMethod('Discovery_LRDD_Link_HTML');
     }
 
-
     public function registerMethod($class)
     {
         $this->methods[] = $class;
     }
-    
+
     /**
      * Given a "user id" make sure it's normalized to either a webfinger
      * acct: uri or a profile HTTP URL.
@@ -78,7 +77,7 @@ class Discovery
     public static function isWebfinger($user_id)
     {
         $uri = Discovery::normalize($user_id);
-        
+
         return (substr($uri, 0, 5) == 'acct:');
     }
 
@@ -99,7 +98,7 @@ class Discovery
                 } else {
                     $xrd_uri = $link['href'];
                 }
-                
+
                 $xrd = $this->fetchXrd($xrd_uri);
                 if ($xrd) {
                     return $xrd;
@@ -114,14 +113,13 @@ class Discovery
         if (!is_array($links)) {
             return false;
         }
-        
+
         foreach ($links as $link) {
             if ($link['rel'] == $service) {
                 return $link;
             }
         }
     }
-    
 
     public static function applyTemplate($template, $id)
     {
@@ -130,7 +128,6 @@ class Discovery
         return $template;
     }
 
-    
     public static function fetchXrd($url)
     {
         try {
@@ -157,12 +154,13 @@ class Discovery_LRDD_Host_Meta implements Discovery_LRDD
 {
     public function discover($uri)
     {
-        if (!Discovery::isWebfinger($uri)) {
-            return false;
+        if (Discovery::isWebfinger($uri)) {
+            // We have a webfinger acct: - start with host-meta
+            list($name, $domain) = explode('@', $uri);
+        } else {
+            $domain = parse_url($uri, PHP_URL_HOST);
         }
-
-        // We have a webfinger acct: - start with host-meta
-        list($name, $domain) = explode('@', $uri);
+        
         $url = 'http://'. $domain .'/.well-known/host-meta';
 
         $xrd = Discovery::fetchXrd($url);
@@ -171,7 +169,7 @@ class Discovery_LRDD_Host_Meta implements Discovery_LRDD
             if ($xrd->host != $domain) {
                 return false;
             }
-            
+
             return $xrd->links;
         }
     }
@@ -187,7 +185,7 @@ class Discovery_LRDD_Link_Header implements Discovery_LRDD
         } catch (HTTP_Request2_Exception $e) {
             return false;
         }
-             
+
         if ($response->getStatus() != 200) {
             return false;
         }
@@ -196,51 +194,17 @@ class Discovery_LRDD_Link_Header implements Discovery_LRDD
         if (!$link_header) {
             //            return false;
         }
-        
-        return Discovery_LRDD_Link_Header::parseHeader($link_header);
+
+        return array(Discovery_LRDD_Link_Header::parseHeader($link_header));
     }
 
     protected static function parseHeader($header)
     {
-        preg_match('/^<[^>]+>/', $header, $uri_reference);
-        //if (empty($uri_reference)) return;
-
-        $links = array();
-        
-        $link_uri = trim($uri_reference[0], '<>');
-        $link_rel = array();
-        $link_type = null;
-        
-        // remove uri-reference from header
-        $header = substr($header, strlen($uri_reference[0]));
-        
-        // parse link-params
-        $params = explode(';', $header);
-        
-        foreach ($params as $param) {
-            if (empty($param)) continue;
-            list($param_name, $param_value) = explode('=', $param, 2);
-            $param_name = trim($param_name);
-            $param_value = preg_replace('(^"|"$)', '', trim($param_value));
-            
-            // for now we only care about 'rel' and 'type' link params
-            // TODO do something with the other links-params
-            switch ($param_name) {
-            case 'rel':
-                $link_rel = trim($param_value);
-                break;
-                
-            case 'type':
-                $link_type = trim($param_value);
-            }
-        }
-
-        $links[] =  array(
-            'href' => $link_uri,
-            'rel' => $link_rel,
-            'type' => $link_type);
+        $lh = new LinkHeader($header);
 
-        return $links;
+        return array('href' => $lh->href,
+                     'rel'  => $lh->rel,
+                     'type' => $lh->type);
     }
 }
 
@@ -262,49 +226,48 @@ class Discovery_LRDD_Link_HTML implements Discovery_LRDD
         return Discovery_LRDD_Link_HTML::parse($response->getBody());
     }
 
-
     public function parse($html)
     {
         $links = array();
-        
+
         preg_match('/<head(\s[^>]*)?>(.*?)<\/head>/is', $html, $head_matches);
         $head_html = $head_matches[2];
-        
+
         preg_match_all('/<link\s[^>]*>/i', $head_html, $link_matches);
-        
+
         foreach ($link_matches[0] as $link_html) {
             $link_url = null;
             $link_rel = null;
             $link_type = null;
-            
+
             preg_match('/\srel=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $rel_matches);
             if ( isset($rel_matches[3]) ) {
                 $link_rel = $rel_matches[3];
             } else if ( isset($rel_matches[1]) ) {
                 $link_rel = $rel_matches[1];
             }
-            
+
             preg_match('/\shref=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $href_matches);
             if ( isset($href_matches[3]) ) {
                 $link_uri = $href_matches[3];
             } else if ( isset($href_matches[1]) ) {
                 $link_uri = $href_matches[1];
             }
-            
+
             preg_match('/\stype=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $type_matches);
             if ( isset($type_matches[3]) ) {
                 $link_type = $type_matches[3];
             } else if ( isset($type_matches[1]) ) {
                 $link_type = $type_matches[1];
             }
-            
+
             $links[] = array(
                 'href' => $link_url,
                 'rel' => $link_rel,
                 'type' => $link_type,
             );
         }
-        
+
         return $links;
     }
 }
diff --git a/plugins/OStatus/lib/discoveryhints.php b/plugins/OStatus/lib/discoveryhints.php
new file mode 100644 (file)
index 0000000..80cfbbf
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Some utilities for generating hint data
+ *
+ * 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/>.
+ */
+
+class DiscoveryHints {
+
+    static function fromXRD($xrd)
+    {
+        $hints = array();
+
+        foreach ($xrd->links as $link) {
+            switch ($link['rel']) {
+            case Discovery::PROFILEPAGE:
+                $hints['profileurl'] = $link['href'];
+                break;
+            case Salmon::NS_REPLIES:
+                $hints['salmon'] = $link['href'];
+                break;
+            case Discovery::UPDATESFROM:
+                $hints['feedurl'] = $link['href'];
+                break;
+            case Discovery::HCARD:
+                $hints['hcardurl'] = $link['href'];
+                break;
+            default:
+                break;
+            }
+        }
+
+        return $hints;
+    }
+
+    static function fromHcardUrl($url)
+    {
+        $client = new HTTPClient();
+        $client->setHeader('Accept', 'text/html,application/xhtml+xml');
+        $response = $client->get($url);
+
+        if (!$response->isOk()) {
+            return null;
+        }
+
+        return self::hcardHints($response->getBody(),
+                                $response->getUrl());
+    }
+
+    static function hcardHints($body, $url)
+    {
+        $hcard = self::_hcard($body, $url);
+
+        if (empty($hcard)) {
+            return array();
+        }
+
+        $hints = array();
+
+        // XXX: don't copy stuff into an array and then copy it again
+
+        if (array_key_exists('nickname', $hcard)) {
+            $hints['nickname'] = $hcard['nickname'];
+        }
+
+        if (array_key_exists('fn', $hcard)) {
+            $hints['fullname'] = $hcard['fn'];
+        } else if (array_key_exists('n', $hcard)) {
+            $hints['fullname'] = implode(' ', $hcard['n']);
+        }
+
+        if (array_key_exists('photo', $hcard)) {
+            $hints['avatar'] = $hcard['photo'][0];
+        }
+
+        if (array_key_exists('note', $hcard)) {
+            $hints['bio'] = $hcard['note'];
+        }
+
+        if (array_key_exists('adr', $hcard)) {
+            if (is_string($hcard['adr'])) {
+                $hints['location'] = $hcard['adr'];
+            } else if (is_array($hcard['adr'])) {
+                $hints['location'] = implode(' ', $hcard['adr']);
+            }
+        }
+
+        if (array_key_exists('url', $hcard)) {
+            if (is_string($hcard['url'])) {
+                $hints['homepage'] = $hcard['url'];
+            } else if (is_array($hcard['url']) && !empty($hcard['url'])) {
+                // HACK get the last one; that's how our hcards look
+                $hints['homepage'] = $hcard['url'][count($hcard['url'])-1];
+            }
+        }
+
+        return $hints;
+    }
+
+    static function _hcard($body, $url)
+    {
+        // DOMDocument::loadHTML may throw warnings on unrecognized elements.
+
+        $old = error_reporting(error_reporting() & ~E_WARNING);
+
+        $doc = new DOMDocument();
+        $doc->loadHTML($body);
+
+        error_reporting($old);
+
+        $xp = new DOMXPath($doc);
+
+        $hcardNodes = self::_getChildrenByClass($doc->documentElement, 'vcard', $xp);
+
+        $hcards = array();
+
+        for ($i = 0; $i < $hcardNodes->length; $i++) {
+
+            $hcardNode = $hcardNodes->item($i);
+
+            $hcard = self::_hcardFromNode($hcardNode, $xp, $url);
+
+            $hcards[] = $hcard;
+        }
+
+        $repr = null;
+
+        foreach ($hcards as $hcard) {
+            if (in_array($url, $hcard['url'])) {
+                $repr = $hcard;
+                break;
+            }
+        }
+
+        if (!is_null($repr)) {
+            return $repr;
+        } else if (count($hcards) > 0) {
+            return $hcards[0];
+        } else {
+            return null;
+        }
+    }
+
+    function _getChildrenByClass($el, $cls, $xp)
+    {
+        // borrowed from hkit. Thanks dudes!
+
+        $qry = ".//*[contains(concat(' ',normalize-space(@class),' '),' $cls ')]";
+
+        $nodes = $xp->query($qry, $el);
+
+        return $nodes;
+    }
+
+    function _hcardFromNode($hcardNode, $xp, $base)
+    {
+        $hcard = array();
+
+        $hcard['url'] = array();
+
+        $urlNodes = self::_getChildrenByClass($hcardNode, 'url', $xp);
+
+        for ($j = 0; $j < $urlNodes->length; $j++) {
+
+            $urlNode = $urlNodes->item($j);
+
+            if ($urlNode->hasAttribute('href')) {
+                $url = $urlNode->getAttribute('href');
+            } else {
+                $url = $urlNode->textContent;
+            }
+
+            $hcard['url'][] = self::_rel2abs($url, $base);
+        }
+
+        $hcard['photo'] = array();
+
+        $photoNodes = self::_getChildrenByClass($hcardNode, 'photo', $xp);
+
+        for ($j = 0; $j < $photoNodes->length; $j++) {
+            $photoNode = $photoNodes->item($j);
+            if ($photoNode->hasAttribute('src')) {
+                $url = $photoNode->getAttribute('src');
+            } else if ($photoNode->hasAttribute('href')) {
+                $url = $photoNode->getAttribute('href');
+            } else {
+                $url = $photoNode->textContent;
+            }
+            $hcard['photo'][] = self::_rel2abs($url, $base);
+        }
+
+        $singles = array('nickname', 'note', 'fn', 'n', 'adr');
+
+        foreach ($singles as $single) {
+
+            $nodes = self::_getChildrenByClass($hcardNode, $single, $xp);
+
+            if ($nodes->length > 0) {
+                $node = $nodes->item(0);
+                $hcard[$single] = $node->textContent;
+            }
+        }
+
+        return $hcard;
+    }
+
+    // XXX: this is a first pass; we probably need
+    // to handle things like ../ and ./ and so on
+
+    static function _rel2abs($rel, $wrt)
+    {
+        $parts = parse_url($rel);
+
+        if ($parts === false) {
+            return false;
+        }
+
+        // If it's got a scheme, use it
+
+        if (!empty($parts['scheme'])) {
+            return $rel;
+        }
+
+        $w = parse_url($wrt);
+
+        $base = $w['scheme'].'://'.$w['host'];
+
+        if ($rel[0] == '/') {
+            return $base.$rel;
+        }
+
+        $wp = explode('/', $w['path']);
+
+        array_pop($wp);
+
+        return $base.implode('/', $wp).'/'.$rel;
+    }
+}
index ff76b229e76923030f0d56242bb4467024b93dbf..4809f9d35cafaaeeb1231ddfa21c043f9558b8f1 100644 (file)
@@ -73,6 +73,7 @@ class FeedDiscovery
     public $uri;
     public $type;
     public $feed;
+    public $root;
 
     /** Post-initialize query helper... */
     public function getLink($rel, $type=null)
@@ -83,7 +84,7 @@ class FeedDiscovery
 
     public function getAtomLink($rel, $type=null)
     {
-        return ActivityUtils::getLink($this->feed->documentElement, $rel, $type);
+        return ActivityUtils::getLink($this->root, $rel, $type);
     }
 
     /**
@@ -117,7 +118,7 @@ class FeedDiscovery
                 return $this->discoverFromURL($target, false);
             }
         }
-        
+
         return $this->initFromResponse($response);
     }
 
@@ -154,9 +155,27 @@ class FeedDiscovery
             $this->uri = $sourceurl;
             $this->type = $type;
             $this->feed = $feed;
+
+            $el = $this->feed->documentElement;
+
+            // Looking for the "root" element: RSS channel or Atom feed
+
+            if ($el->tagName == 'rss') {
+                $channels = $el->getElementsByTagName('channel');
+                if ($channels->length > 0) {
+                    $this->root = $channels->item(0);
+                } else {
+                    throw new FeedSubBadXmlException($sourceurl);
+                }
+            } else if ($el->tagName == 'feed') {
+                $this->root = $el;
+            } else {
+                throw new FeedSubBadXmlException($sourceurl);
+            }
+
             return $this->uri;
         } else {
-            throw new FeedSubBadXmlException($url);
+            throw new FeedSubBadXmlException($sourceurl);
         }
     }
 
@@ -202,7 +221,7 @@ class FeedDiscovery
             'application/atom+xml' => false,
             'application/rss+xml' => false,
         );
-        
+
         $nodes = $dom->getElementsByTagName('link');
         for ($i = 0; $i < $nodes->length; $i++) {
             $node = $nodes->item($i);
@@ -211,11 +230,11 @@ class FeedDiscovery
                 $type = $node->attributes->getNamedItem('type');
                 $href = $node->attributes->getNamedItem('href');
                 if ($rel && $type && $href) {
-                    $rel = trim($rel->value);
+                    $rel = array_filter(explode(" ", $rel->value));
                     $type = trim($type->value);
                     $href = trim($href->value);
 
-                    if (trim($rel) == 'alternate' && array_key_exists($type, $feeds) && empty($feeds[$type])) {
+                    if (in_array('alternate', $rel) && array_key_exists($type, $feeds) && empty($feeds[$type])) {
                         // Save the first feed found of each type...
                         $feeds[$type] = $this->resolveURI($href, $base);
                     }
diff --git a/plugins/OStatus/lib/linkheader.php b/plugins/OStatus/lib/linkheader.php
new file mode 100644 (file)
index 0000000..cd78d31
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+class LinkHeader
+{
+    var $href;
+    var $rel;
+    var $type;
+
+    function __construct($str)
+    {
+        preg_match('/^<[^>]+>/', $str, $uri_reference);
+        //if (empty($uri_reference)) return;
+
+        $this->href = trim($uri_reference[0], '<>');
+        $this->rel = array();
+        $this->type = null;
+
+        // remove uri-reference from header
+        $str = substr($str, strlen($uri_reference[0]));
+
+        // parse link-params
+        $params = explode(';', $str);
+
+        foreach ($params as $param) {
+            if (empty($param)) continue;
+            list($param_name, $param_value) = explode('=', $param, 2);
+            $param_name = trim($param_name);
+            $param_value = preg_replace('(^"|"$)', '', trim($param_value));
+
+            // for now we only care about 'rel' and 'type' link params
+            // TODO do something with the other links-params
+            switch ($param_name) {
+            case 'rel':
+                $this->rel = trim($param_value);
+                break;
+
+            case 'type':
+                $this->type = trim($param_value);
+            }
+        }
+    }
+
+    static function getLink($response, $rel=null, $type=null)
+    {
+        $headers = $response->getHeader('Link');
+        if ($headers) {
+            // Can get an array or string, so try to simplify the path
+            if (!is_array($headers)) {
+                $headers = array($headers);
+            }
+
+            foreach ($headers as $header) {
+                $lh = new LinkHeader($header);
+
+                if ((is_null($rel) || $lh->rel == $rel) &&
+                    (is_null($type) || $lh->type == $type)) {
+                    return $lh->href;
+                }
+            }
+        }
+        return null;
+    }
+}
index fb8c57c7183e6340c0ad7c404f5484e91c1e37b7..9266cab5cf40351de6f7949212fc10ec061a9645 100644 (file)
@@ -59,7 +59,11 @@ class MagicEnvelope
         }
         if ($xrd->links) {
             if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) {
-                list($type, $keypair) = explode(';', $link['href']);
+                list($type, $keypair) = explode(',', $link['href']);
+                if (empty($keypair)) {
+                    // Backwards compatibility check for separator bug in 0.9.0
+                    list($type, $keypair) = explode(';', $link['href']);
+                }
                 return $keypair;
             }
         }
@@ -70,7 +74,7 @@ class MagicEnvelope
     public function signMessage($text, $mimetype, $keypair)
     {
         $signature_alg = Magicsig::fromString($keypair);
-        $armored_text = base64_encode($text);
+        $armored_text = base64_url_encode($text);
 
         return array(
             'data' => $armored_text,
@@ -108,7 +112,7 @@ class MagicEnvelope
     public function unfold($env)
     {
         $dom = new DOMDocument();
-        $dom->loadXML(base64_decode($env['data']));
+        $dom->loadXML(base64_url_decode($env['data']));
 
         if ($dom->documentElement->tagName != 'entry') {
             return false;
@@ -165,7 +169,7 @@ class MagicEnvelope
             return false;
         }
 
-        $text = base64_decode($env['data']);
+        $text = base64_url_decode($env['data']);
         $signer_uri = $this->getAuthor($text);
 
         try {
@@ -193,11 +197,12 @@ class MagicEnvelope
 
     public function fromDom($dom)
     {
-        if ($dom->documentElement->tagName == 'entry') {
+        $env_element = $dom->getElementsByTagNameNS(MagicEnvelope::NS, 'env')->item(0);
+        if (!$env_element) {
             $env_element = $dom->getElementsByTagNameNS(MagicEnvelope::NS, 'provenance')->item(0);
-        } else if ($dom->documentElement->tagName == 'me:env') {
-            $env_element = $dom->documentElement;
-        } else {
+        }
+
+        if (!$env_element) {
             return false;
         }
 
diff --git a/plugins/OStatus/lib/safecrypt_rsa.php b/plugins/OStatus/lib/safecrypt_rsa.php
new file mode 100644 (file)
index 0000000..f3aa2c9
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+require_once 'Crypt/RSA.php';
+
+/**
+ * Crypt_RSA stores a Math_BigInteger with value 0, which triggers a bug
+ * in Math_BigInteger's wakeup function which spews notices to log or output.
+ * This wrapper replaces it with a version that survives serialization.
+ */
+class SafeCrypt_RSA extends Crypt_RSA
+{
+    function __construct()
+    {
+        parent::__construct();
+        $this->zero = new SafeMath_BigInteger();
+    }
+}
+
diff --git a/plugins/OStatus/lib/safemath_biginteger.php b/plugins/OStatus/lib/safemath_biginteger.php
new file mode 100644 (file)
index 0000000..c05e24d
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+require_once 'Math/BigInteger.php';
+
+/**
+ * Crypt_RSA stores a Math_BigInteger with value 0, which triggers a bug
+ * in Math_BigInteger's wakeup function which spews notices to log or output.
+ * This wrapper replaces it with a version that survives serialization.
+ */
+class SafeMath_BigInteger extends Math_BigInteger
+{
+    function __wakeup()
+    {
+        if ($this->hex == '') {
+            $this->hex = '0';
+        }
+        parent::__wakeup();
+    }
+}
+
index 6881292add2a3c58afaf0fed1487aa5252eaddf0..f1a56e0a84d3b3967b2595d32f2f3f82afd12ed2 100644 (file)
@@ -46,10 +46,10 @@ class XrdAction extends Action
         if (empty($xrd->subject)) {
             $xrd->subject = Discovery::normalize($this->uri);
         }
-        $xrd->alias[] = common_profile_url($nick);
+        $xrd->alias[] = $this->user->uri;
         $xrd->links[] = array('rel' => Discovery::PROFILEPAGE,
                               'type' => 'text/html',
-                              'href' => common_profile_url($nick));
+                              'href' => $this->user->uri);
 
         $xrd->links[] = array('rel' => Discovery::UPDATESFROM,
                               'href' => common_local_url('ApiTimelineUser',
@@ -65,7 +65,7 @@ class XrdAction extends Action
         // XFN
         $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11',
                               'type' => 'text/html',
-                              'href' => common_profile_url($nick));
+                              'href' => $this->user->uri);
         // FOAF
         $xrd->links[] = array('rel' => 'describedby',
                               'type' => 'application/rdf+xml',
@@ -91,7 +91,7 @@ class XrdAction extends Action
         }
 
         $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL,
-                              'href' => 'data:application/magic-public-key;'. $magickey->toString(false));
+                              'href' => 'data:application/magic-public-key,'. $magickey->toString(false));
 
         // TODO - finalize where the redirect should go on the publisher
         $url = common_local_url('ostatussub') . '?profile={uri}';
diff --git a/plugins/OStatus/scripts/testfeed.php b/plugins/OStatus/scripts/testfeed.php
new file mode 100644 (file)
index 0000000..5e3ccd4
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a 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/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
+
+$longoptions = array('skip=', 'count=');
+
+$helptext = <<<END_OF_HELP
+testfeed.php [options] http://example.com/atom-feed-url
+Pull an Atom feed and run items in it as though they were live PuSH updates.
+Mainly intended for testing funky feed formats.
+
+     --skip=N   Ignore the first N items in the feed.
+     --count=N  Only process up to N items from the feed, after skipping.
+
+
+END_OF_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+if (empty($args[0]) || !Validate::uri($args[0])) {
+    print "$helptext";
+    exit(1);
+}
+
+$feedurl = $args[0];
+$skip = have_option('skip') ? intval(get_option_value('skip')) : 0;
+$count = have_option('count') ? intval(get_option_value('count')) : 0;
+
+
+$sub = FeedSub::staticGet('topic', $feedurl);
+if (!$sub) {
+    print "Feed $feedurl is not subscribed.\n";
+    exit(1);
+}
+
+$xml = file_get_contents($feedurl);
+if ($xml === false) {
+    print "Bad fetch.\n";
+    exit(1);
+}
+
+$feed = new DOMDocument();
+if (!$feed->loadXML($xml)) {
+    print "Bad XML.\n";
+    exit(1);
+}
+
+if ($skip || $count) {
+    $entries = $feed->getElementsByTagNameNS(ActivityUtils::ATOM, 'entry');
+    $remove = array();
+    for ($i = 0; $i < $skip && $i < $entries->length; $i++) {
+        $item = $entries->item($i);
+        if ($item) {
+            $remove[] = $item;
+        }
+    }
+    if ($count) {
+        for ($i = $skip + $count; $i < $entries->length; $i++) {
+            $item = $entries->item($i);
+            if ($item) {
+                $remove[] = $item;
+            }
+        }
+    }
+    foreach ($remove as $item) {
+        $item->parentNode->removeChild($item);
+    }
+}
+
+Event::handle('StartFeedSubReceive', array($sub, $feed));
+
index 315b4927372f6fe842123be2f5b99ec051bcc65b..622ded56ab9044d9d708c97fa372f75d20d0c34f 100644 (file)
@@ -103,7 +103,7 @@ function updateOStatus($user)
                 echo "Checking {$rp->nickname}...";
             }
 
-            $op = Ostatus_profile::ensureProfile($rp->profileurl);
+            $op = Ostatus_profile::ensureProfileURL($rp->profileurl);
 
             if (empty($op)) {
                 echo "can't convert.\n";
diff --git a/plugins/OStatus/tests/remote-tests.php b/plugins/OStatus/tests/remote-tests.php
new file mode 100644 (file)
index 0000000..103ca06
--- /dev/null
@@ -0,0 +1,392 @@
+<?php
+
+if (php_sapi_name() != 'cli') {
+    die('not for web');
+}
+
+define('INSTALLDIR', dirname(dirname(dirname(dirname(__FILE__)))));
+set_include_path(INSTALLDIR . '/extlib' . PATH_SEPARATOR . get_include_path());
+
+require_once 'PEAR.php';
+require_once 'Net/URL2.php';
+require_once 'HTTP/Request2.php';
+
+
+// ostatus test script, client-side :)
+
+class TestBase
+{
+    function log($str)
+    {
+        $args = func_get_args();
+        array_shift($args);
+
+        $msg = vsprintf($str, $args);
+        print $msg . "\n";
+    }
+
+    function assertEqual($a, $b)
+    {
+        if ($a != $b) {
+            throw new Exception("Failed to assert equality: expected $a, got $b");
+        }
+        return true;
+    }
+
+    function assertNotEqual($a, $b)
+    {
+        if ($a == $b) {
+            throw new Exception("Failed to assert inequality: expected not $a, got $b");
+        }
+        return true;
+    }
+}
+
+class OStatusTester extends TestBase
+{
+    /**
+     * @param string $a base URL of test site A (eg http://localhost/mublog)
+     * @param string $b base URL of test site B (eg http://localhost/mublog2)
+     */
+    function __construct($a, $b) {
+        $this->a = $a;
+        $this->b = $b;
+
+        $base = 'test' . mt_rand(1, 1000000);
+        $this->pub = new SNTestClient($this->a, 'pub' . $base, 'pw-' . mt_rand(1, 1000000));
+        $this->sub = new SNTestClient($this->b, 'sub' . $base, 'pw-' . mt_rand(1, 1000000));
+    }
+
+    function run()
+    {
+        $this->setup();
+        $this->testLocalPost();
+        $this->testMentionUrl();
+        $this->log("DONE!");
+    }
+
+    function setup()
+    {
+        $this->pub->register();
+        $this->pub->assertRegistered();
+
+        $this->sub->register();
+        $this->sub->assertRegistered();
+    }
+
+    function testLocalPost()
+    {
+        $post = $this->pub->post("Local post, no subscribers yet.");
+        $this->assertNotEqual('', $post);
+
+        $post = $this->sub->post("Local post, no subscriptions yet.");
+        $this->assertNotEqual('', $post);
+    }
+
+    /**
+     * pub posts: @b/sub
+     */
+    function testMentionUrl()
+    {
+        $bits = parse_url($this->b);
+        $base = $bits['host'];
+        if (isset($bits['path'])) {
+            $base .= $bits['path'];
+        }
+        $name = $this->sub->username;
+
+        $post = $this->pub->post("@$base/$name should have this in home and replies");
+        $this->sub->assertReceived($post);
+    }
+}
+
+class SNTestClient extends TestBase
+{
+    function __construct($base, $username, $password)
+    {
+        $this->basepath = $base;
+        $this->username = $username;
+        $this->password = $password;
+
+        $this->fullname = ucfirst($username) . ' Smith';
+        $this->homepage = 'http://example.org/' . $username;
+        $this->bio = 'Stub account for OStatus tests.';
+        $this->location = 'Montreal, QC';
+    }
+
+    /**
+     * Make a low-level web hit to this site, with authentication.
+     * @param string $path URL fragment for something under the base path
+     * @param array $params POST parameters to send
+     * @param boolean $auth whether to include auth data
+     * @return string
+     * @throws Exception on low-level error conditions
+     */
+    protected function hit($path, $params=array(), $auth=false, $cookies=array())
+    {
+        $url = $this->basepath . '/' . $path;
+
+        $http = new HTTP_Request2($url, 'POST');
+        if ($auth) {
+            $http->setAuth($this->username, $this->password, HTTP_Request2::AUTH_BASIC);
+        }
+        foreach ($cookies as $name => $val) {
+            $http->addCookie($name, $val);
+        }
+        $http->addPostParameter($params);
+        $response = $http->send();
+
+        $code = $response->getStatus();
+        if ($code < '200' || $code >= '400') {
+            throw new Exception("Failed API hit to $url: $code\n" . $response->getBody());
+        }
+
+        return $response;
+    }
+
+    /**
+     * Make a hit to a web form, without authentication but with a session.
+     * @param string $path URL fragment relative to site base
+     * @param string $form id of web form to pull initial parameters from
+     * @param array $params POST parameters, will be merged with defaults in form
+     */
+    protected function web($path, $form, $params=array())
+    {
+        $url = $this->basepath . '/' . $path;
+        $http = new HTTP_Request2($url, 'GET');
+        $response = $http->send();
+
+        $dom = $this->checkWeb($url, 'GET', $response);
+        $cookies = array();
+        foreach ($response->getCookies() as $cookie) {
+            // @fixme check for expirations etc
+            $cookies[$cookie['name']] = $cookie['value'];
+        }
+
+        $form = $dom->getElementById($form);
+        if (!$form) {
+            throw new Exception("Form $form not found on $url");
+        }
+        $inputs = $form->getElementsByTagName('input');
+        foreach ($inputs as $item) {
+            $type = $item->getAttribute('type');
+            if ($type != 'check') {
+                $name = $item->getAttribute('name');
+                $val = $item->getAttribute('value');
+                if ($name && $val && !isset($params[$name])) {
+                    $params[$name] = $val;
+                }
+            }
+        }
+
+        $response = $this->hit($path, $params, false, $cookies);
+        $dom = $this->checkWeb($url, 'POST', $response);
+
+        return $dom;
+    }
+
+    protected function checkWeb($url, $method, $response)
+    {
+        $dom = new DOMDocument();
+        if (!$dom->loadHTML($response->getBody())) {
+            throw new Exception("Invalid HTML from $method to $url");
+        }
+
+        $xpath = new DOMXPath($dom);
+        $error = $xpath->query('//p[@class="error"]');
+        if ($error && $error->length) {
+            throw new Exception("Error on $method to $url: " .
+                                $error->item(0)->textContent);
+        }
+
+        return $dom;
+    }
+
+    /**
+     * Make an API hit to this site, with authentication.
+     * @param string $path URL fragment for something under 'api' folder
+     * @param string $style one of 'json', 'xml', or 'atom'
+     * @param array $params POST parameters to send
+     * @return mixed associative array for JSON, DOMDocument for XML/Atom
+     * @throws Exception on low-level error conditions
+     */
+    protected function api($path, $style, $params=array())
+    {
+        $response = $this->hit("api/$path.$style", $params, true);
+        $body = $response->getBody();
+        if ($style == 'json') {
+            $data = json_decode($body, true);
+            if ($data !== null) {
+                if (!empty($data['error'])) {
+                    throw new Exception("JSON API returned error: " . $data['error']);
+                }
+                return $data;
+            } else {
+                throw new Exception("Bogus JSON data from $path:\n$body");
+            }
+        } else if ($style == 'xml' || $style == 'atom') {
+            $dom = new DOMDocument();
+            if ($dom->loadXML($body)) {
+                return $dom;
+            } else {
+                throw new Exception("Bogus XML data from $path:\n$body");
+            }
+        } else {
+            throw new Exception("API needs to be JSON, XML, or Atom");
+        }
+    }
+
+    /**
+     * Register the account.
+     *
+     * Unfortunately there's not an API method for registering, so we fake it.
+     */
+    function register()
+    {
+        $this->log("Registering user %s on %s",
+                   $this->username,
+                   $this->basepath);
+        $ret = $this->web('main/register', 'form_register',
+            array('nickname' => $this->username,
+                  'password' => $this->password,
+                  'confirm' => $this->password,
+                  'fullname' => $this->fullname,
+                  'homepage' => $this->homepage,
+                  'bio' => $this->bio,
+                  'license' => 1,
+                  'submit' => 'Register'));
+    }
+
+    /**
+     * Check that the account has been registered and can be used.
+     * On failure, throws a test failure exception.
+     */
+    function assertRegistered()
+    {
+        $this->log("Confirming %s is registered on %s",
+                   $this->username,
+                   $this->basepath);
+        $data = $this->api('account/verify_credentials', 'json');
+        $this->assertEqual($this->username, $data['screen_name']);
+        $this->assertEqual($this->fullname, $data['name']);
+        $this->assertEqual($this->homepage, $data['url']);
+        $this->assertEqual($this->bio, $data['description']);
+    }
+
+    /**
+     * Post a given message from this account
+     * @param string $message
+     * @return string URL/URI of notice
+     * @todo reply, location options
+     */
+    function post($message)
+    {
+        $this->log("Posting notice as %s on %s: %s",
+                   $this->username,
+                   $this->basepath,
+                   $message);
+        $data = $this->api('statuses/update', 'json',
+            array('status' => $message));
+
+        $url = $this->basepath . '/notice/' . $data['id'];
+        return $url;
+    }
+
+    /**
+     * Check that this account has received the notice.
+     * @param string $notice_uri URI for the notice to check for
+     */
+    function assertReceived($notice_uri)
+    {
+        $timeout = 5;
+        $tries = 6;
+        while ($tries) {
+            $ok = $this->checkReceived($notice_uri);
+            if ($ok) {
+                return true;
+            }
+            $tries--;
+            if ($tries) {
+                $this->log("Didn't see it yet, waiting $timeout seconds");
+                sleep($timeout);
+            }
+        }
+        throw new Exception("Message $notice_uri not received by $this->username");
+    }
+
+    /**
+     * Pull the user's home timeline to check if a notice with the given
+     * source URL has been received recently.
+     * If we don't see it, we'll try a couple more times up to 10 seconds.
+     *
+     * @param string $notice_uri
+     */
+    function checkReceived($notice_uri)
+    {
+        $this->log("Checking if %s on %s received notice %s",
+                   $this->username,
+                   $this->basepath,
+                   $notice_uri);
+        $params = array();
+        $dom = $this->api('statuses/home_timeline', 'atom', $params);
+
+        $xml = simplexml_import_dom($dom);
+        if (!$xml->entry) {
+            return false;
+        }
+        if (is_array($xml->entry)) {
+            $entries = $xml->entry;
+        } else {
+            $entries = array($xml->entry);
+        }
+        foreach ($entries as $entry) {
+            if ($entry->id == $notice_uri) {
+                $this->log("found it $notice_uri");
+                return true;
+            }
+            //$this->log("nope... " . $entry->id);
+        }
+        return false;
+    }
+
+    /**
+     * Check that this account is subscribed to the given profile.
+     * @param string $profile_uri URI for the profile to check for
+     */
+    function assertHasSubscription($profile_uri)
+    {
+        throw new Exception('tbi');
+    }
+
+    /**
+     * Check that this account is subscribed to by the given profile.
+     * @param string $profile_uri URI for the profile to check for
+     */
+    function assertHasSubscriber($profile_uri)
+    {
+        throw new Exception('tbi');
+    }
+
+}
+
+$args = array_slice($_SERVER['argv'], 1);
+if (count($args) < 2) {
+    print <<<END_HELP
+remote-tests.php <url1> <url2>
+  url1: base URL of a StatusNet instance
+  url2: base URL of another StatusNet instance
+
+This will register user accounts on the two given StatusNet instances
+and run some tests to confirm that OStatus subscription and posting
+between the two sites works correctly.
+
+END_HELP;
+exit(1);
+}
+
+$a = $args[0];
+$b = $args[1];
+
+$tester = new OStatusTester($a, $b);
+$tester->run();
+
diff --git a/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php b/plugins/OpenExternalLinkTarget/OpenExternalLinkTargetPlugin.php
new file mode 100644 (file)
index 0000000..ebb0189
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Opens links with rel=external on a new window or tab
+ *
+ * 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  Action
+ * @package   StatusNet
+ * @author    Sarven Capadisli <csarven@status.net>
+ * @copyright 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/
+ */
+
+if (!defined('STATUSNET') && !defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Opens links with rel=external on a new window or tab
+ *
+ * @category Plugin
+ * @package  StatusNet
+ * @author   Sarven Capadisli <csarven@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class OpenExternalLinkTargetPlugin extends Plugin
+{
+    function onEndShowScripts($action)
+    {
+        $action->inlineScript('$("a[rel~=external]").click(function(){ window.open(this.href); return false; });');
+
+        return true;
+    }
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'OpenExternalLinkTarget',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Sarven Capadisli',
+                            'homepage' => 'http://status.net/wiki/Plugin:OpenExternalLinkTarget',
+                            'rawdescription' =>
+                            _m('Opens external links (i.e., with rel=external) on a new window or tab'));
+        return true;
+    }
+}
+
index 248afe3fa88e92e32c2782c5c907b45055345530..1724b5f7be769b01ce9fb9648d07837b172954b4 100644 (file)
@@ -59,6 +59,8 @@ class OpenIDPlugin extends Plugin
      *
      * Hook for RouterInitialized event.
      *
+     * @param Net_URL_Mapper $m URL mapper
+     *
      * @return boolean hook return
      */
 
@@ -67,54 +69,87 @@ class OpenIDPlugin extends Plugin
         $m->connect('main/openid', array('action' => 'openidlogin'));
         $m->connect('main/openidtrust', array('action' => 'openidtrust'));
         $m->connect('settings/openid', array('action' => 'openidsettings'));
-        $m->connect('index.php?action=finishopenidlogin', array('action' => 'finishopenidlogin'));
-        $m->connect('index.php?action=finishaddopenid', array('action' => 'finishaddopenid'));
+        $m->connect('index.php?action=finishopenidlogin',
+                    array('action' => 'finishopenidlogin'));
+        $m->connect('index.php?action=finishaddopenid',
+                    array('action' => 'finishaddopenid'));
         $m->connect('main/openidserver', array('action' => 'openidserver'));
 
         return true;
     }
 
+    /**
+     * Public XRDS output hook
+     *
+     * Puts the bits of code needed by some OpenID providers to show
+     * we're good citizens.
+     *
+     * @param Action       $action         Action being executed
+     * @param XMLOutputter &$xrdsOutputter Output channel
+     *
+     * @return boolean hook return
+     */
+
     function onEndPublicXRDS($action, &$xrdsOutputter)
     {
         $xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                          'version' => '2.0'));
+                                                  'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                                  'version' => '2.0'));
         $xrdsOutputter->element('Type', null, 'xri://$xrds*simple');
         //consumer
         foreach (array('finishopenidlogin', 'finishaddopenid') as $finish) {
             $xrdsOutputter->showXrdsService(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
-                                common_local_url($finish));
+                                            common_local_url($finish));
         }
         //provider
         $xrdsOutputter->showXrdsService('http://specs.openid.net/auth/2.0/server',
-                            common_local_url('openidserver'),
-                            null,
-                            null,
-                            'http://specs.openid.net/auth/2.0/identifier_select');
+                                        common_local_url('openidserver'),
+                                        null,
+                                        null,
+                                        'http://specs.openid.net/auth/2.0/identifier_select');
         $xrdsOutputter->elementEnd('XRD');
     }
 
+    /**
+     * User XRDS output hook
+     *
+     * Puts the bits of code needed to discover OpenID endpoints.
+     *
+     * @param Action       $action         Action being executed
+     * @param XMLOutputter &$xrdsOutputter Output channel
+     *
+     * @return boolean hook return
+     */
+
     function onEndUserXRDS($action, &$xrdsOutputter)
     {
         $xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                          'xml:id' => 'openid',
-                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                          'version' => '2.0'));
+                                                  'xml:id' => 'openid',
+                                                  'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                                  'version' => '2.0'));
         $xrdsOutputter->element('Type', null, 'xri://$xrds*simple');
 
         //consumer
         $xrdsOutputter->showXrdsService('http://specs.openid.net/auth/2.0/return_to',
-                            common_local_url('finishopenidlogin'));
+                                        common_local_url('finishopenidlogin'));
 
         //provider
         $xrdsOutputter->showXrdsService('http://specs.openid.net/auth/2.0/signon',
-                            common_local_url('openidserver'),
-                            null,
-                            null,
-                            common_profile_url($action->user->nickname));
+                                        common_local_url('openidserver'),
+                                        null,
+                                        null,
+                                        common_profile_url($action->user->nickname));
         $xrdsOutputter->elementEnd('XRD');
     }
 
+    /**
+     * Menu item for login
+     *
+     * @param Action &$action Action being executed
+     *
+     * @return boolean hook return
+     */
+
     function onEndLoginGroupNav(&$action)
     {
         $action_name = $action->trimmed('action');
@@ -127,6 +162,14 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Menu item for OpenID admin
+     *
+     * @param Action &$action Action being executed
+     *
+     * @return boolean hook return
+     */
+
     function onEndAccountSettingsNav(&$action)
     {
         $action_name = $action->trimmed('action');
@@ -139,68 +182,102 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Autoloader
+     *
+     * Loads our classes if they're requested.
+     *
+     * @param string $cls Class requested
+     *
+     * @return boolean hook return
+     */
+
     function onAutoload($cls)
     {
         switch ($cls)
         {
-         case 'OpenidloginAction':
-         case 'FinishopenidloginAction':
-         case 'FinishaddopenidAction':
-         case 'XrdsAction':
-         case 'PublicxrdsAction':
-         case 'OpenidsettingsAction':
-         case 'OpenidserverAction':
-         case 'OpenidtrustAction':
-            require_once(INSTALLDIR.'/plugins/OpenID/' . strtolower(mb_substr($cls, 0, -6)) . '.php');
+        case 'OpenidloginAction':
+        case 'FinishopenidloginAction':
+        case 'FinishaddopenidAction':
+        case 'XrdsAction':
+        case 'PublicxrdsAction':
+        case 'OpenidsettingsAction':
+        case 'OpenidserverAction':
+        case 'OpenidtrustAction':
+            require_once INSTALLDIR.'/plugins/OpenID/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
-         case 'User_openid':
-            require_once(INSTALLDIR.'/plugins/OpenID/User_openid.php');
+        case 'User_openid':
+            require_once INSTALLDIR.'/plugins/OpenID/User_openid.php';
             return false;
-         case 'User_openid_trustroot':
-            require_once(INSTALLDIR.'/plugins/OpenID/User_openid_trustroot.php');
+        case 'User_openid_trustroot':
+            require_once INSTALLDIR.'/plugins/OpenID/User_openid_trustroot.php';
             return false;
-         default:
+        default:
             return true;
         }
     }
 
+    /**
+     * Sensitive actions
+     *
+     * These actions should use https when SSL support is 'sometimes'
+     *
+     * @param Action  $action Action to form an URL for
+     * @param boolean &$ssl   Whether to mark it for SSL
+     *
+     * @return boolean hook return
+     */
+
     function onSensitiveAction($action, &$ssl)
     {
         switch ($action)
         {
-         case 'finishopenidlogin':
-         case 'finishaddopenid':
+        case 'finishopenidlogin':
+        case 'finishaddopenid':
             $ssl = true;
             return false;
-         default:
+        default:
             return true;
         }
     }
 
+    /**
+     * Login actions
+     *
+     * These actions should be visible even when the site is marked private
+     *
+     * @param Action  $action Action to show
+     * @param boolean &$login Whether it's a login action
+     *
+     * @return boolean hook return
+     */
+
     function onLoginAction($action, &$login)
     {
         switch ($action)
         {
-         case 'openidlogin':
-         case 'finishopenidlogin':
-         case 'openidserver':
+        case 'openidlogin':
+        case 'finishopenidlogin':
+        case 'openidserver':
             $login = true;
             return false;
-         default:
+        default:
             return true;
         }
     }
 
     /**
-     * We include a <meta> element linking to the publicxrds page, for OpenID
+     * We include a <meta> element linking to the userxrds page, for OpenID
      * client-side authentication.
      *
+     * @param Action $action Action being shown
+     *
      * @return void
      */
 
     function onEndShowHeadElements($action)
     {
-        if($action instanceof ShowstreamAction){
+        if ($action instanceof ShowstreamAction) {
             $action->element('link', array('rel' => 'openid2.provider',
                                            'href' => common_local_url('openidserver')));
             $action->element('link', array('rel' => 'openid2.local_id',
@@ -216,6 +293,9 @@ class OpenIDPlugin extends Plugin
     /**
      * Redirect to OpenID login if they have an OpenID
      *
+     * @param Action $action Action being executed
+     * @param User   $user   User doing the action
+     *
      * @return boolean whether to continue
      */
 
@@ -228,23 +308,36 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Show some extra instructions for using OpenID
+     *
+     * @param Action $action Action being executed
+     *
+     * @return boolean hook value
+     */
+
     function onEndShowPageNotice($action)
     {
         $name = $action->trimmed('action');
 
         switch ($name)
         {
-         case 'register':
-            $instr = '(Have an [OpenID](http://openid.net/)? ' .
-              'Try our [OpenID registration]'.
-              '(%%action.openidlogin%%)!)';
+        case 'register':
+            if (common_logged_in()) {
+                $instr = '(Have an [OpenID](http://openid.net/)? ' .
+                  '[Add an OpenID to your account](%%action.openidsettings%%)!';
+            } else {
+                $instr = '(Have an [OpenID](http://openid.net/)? ' .
+                  'Try our [OpenID registration]'.
+                  '(%%action.openidlogin%%)!)';
+            }
             break;
-         case 'login':
+        case 'login':
             $instr = '(Have an [OpenID](http://openid.net/)? ' .
               'Try our [OpenID login]'.
               '(%%action.openidlogin%%)!)';
             break;
-         default:
+        default:
             return true;
         }
 
@@ -253,13 +346,21 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Load our document if requested
+     *
+     * @param string &$title  Title to fetch
+     * @param string &$output HTML to output
+     *
+     * @return boolean hook value
+     */
+
     function onStartLoadDoc(&$title, &$output)
     {
-        if ($title == 'openid')
-        {
+        if ($title == 'openid') {
             $filename = INSTALLDIR.'/plugins/OpenID/doc-src/openid';
 
-            $c = file_get_contents($filename);
+            $c      = file_get_contents($filename);
             $output = common_markup_to_html($c);
             return false; // success!
         }
@@ -267,10 +368,18 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Add our document to the global menu
+     *
+     * @param string $title   Title being fetched
+     * @param string &$output HTML being output
+     *
+     * @return boolean hook value
+     */
+
     function onEndLoadDoc($title, &$output)
     {
-        if ($title == 'help')
-        {
+        if ($title == 'help') {
             $menuitem = '* [OpenID](%%doc.openid%%) - what OpenID is and how to use it with this service';
 
             $output .= common_markup_to_html($menuitem);
@@ -279,7 +388,16 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
-    function onCheckSchema() {
+    /**
+     * Data definitions
+     *
+     * Assure that our data objects are available in the DB
+     *
+     * @return boolean hook value
+     */
+
+    function onCheckSchema()
+    {
         $schema = Schema::get();
         $schema->ensureTable('user_openid',
                              array(new ColumnDef('canonical', 'varchar',
@@ -302,6 +420,15 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Add our tables to be deleted when a user is deleted
+     *
+     * @param User  $user    User being deleted
+     * @param array &$tables Array of table names
+     *
+     * @return boolean hook value
+     */
+
     function onUserDeleteRelated($user, &$tables)
     {
         $tables[] = 'User_openid';
@@ -309,6 +436,14 @@ class OpenIDPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Add our version information to output
+     *
+     * @param array &$versions Array of version-data arrays
+     *
+     * @return boolean hook value
+     */
+
     function onPluginVersion(&$versions)
     {
         $versions[] = array('name' => 'OpenID',
index 5ef05b4c774220af6ed4b416cc22ae2d286dc59f..1beff9ea304afebbeeec5c1391137ae0c802c2df 100644 (file)
@@ -44,6 +44,11 @@ class User_openid extends Memcached_DataObject
      * Unique keys used for lookup *MUST* be listed to ensure proper caching.
      */
     function keys()
+    {
+        return array_keys($this->keyTypes());
+    }
+
+    function keyTypes()
     {
         return array('canonical' => 'K', 'display' => 'U', 'user_id' => 'U');
     }
index 0b411b8f7f11ba9e10cfa932cb58407809dc0f18..17c03afb02aee3dd707ac88c7fe077408e490b7c 100644 (file)
@@ -42,6 +42,11 @@ class User_openid_trustroot extends Memcached_DataObject
     }
 
     function keys()
+    {
+        return array_keys($this->keyTypes());
+    }
+
+    function keyTypes()
     {
         return array('trustroot' => 'K', 'user_id' => 'K');
     }
index 8f949c9c5dce26f111edc8875e862f1f5a939230..9e02c7a8834566bd8ec852c90ae84dbc4573dde0 100644 (file)
@@ -225,11 +225,11 @@ function oid_update_user(&$user, &$sreg)
 
     $orig_profile = clone($profile);
 
-    if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+    if (!empty($sreg['fullname']) && strlen($sreg['fullname']) <= 255) {
         $profile->fullname = $sreg['fullname'];
     }
 
-    if ($sreg['country']) {
+    if (!empty($sreg['country'])) {
         if ($sreg['postcode']) {
             # XXX: use postcode to get city and region
             # XXX: also, store postcode somewhere -- it's valuable!
@@ -249,7 +249,7 @@ function oid_update_user(&$user, &$sreg)
 
     $orig_user = clone($user);
 
-    if ($sreg['email'] && Validate::email($sreg['email'], common_config('email', 'check_domain'))) {
+    if (!empty($sreg['email']) && Validate::email($sreg['email'], common_config('email', 'check_domain'))) {
         $user->email = $sreg['email'];
     }
 
index 3fc3d61289bc5f9164b3e05bf981d7469a7fe9f6..16142cf48c36267a9e14a26ef7bbd35a01b1704b 100644 (file)
@@ -176,6 +176,43 @@ class OpenidsettingsAction extends AccountSettingsAction
                 }
             }
         }
+
+        $this->elementStart('form', array('method' => 'post',
+                                          'id' => 'form_settings_openid_trustroots',
+                                          'class' => 'form_settings',
+                                          'action' =>
+                                          common_local_url('openidsettings')));
+        $this->elementStart('fieldset', array('id' => 'settings_openid_trustroots'));
+        $this->element('legend', null, _m('OpenID Trusted Sites'));
+        $this->hidden('token', common_session_token());
+        $this->element('p', 'form_guide',
+                       _m('The following sites are allowed to access your ' .
+                       'identity and log you in. You can remove a site from ' .
+                       'this list to deny it access to your OpenID.'));
+        $this->elementStart('ul', 'form_data');
+        $user_openid_trustroot = new User_openid_trustroot();
+        $user_openid_trustroot->user_id=$user->id;
+        if($user_openid_trustroot->find()) {
+            while($user_openid_trustroot->fetch()) {
+                $this->elementStart('li');
+                $this->element('input', array('name' => 'openid_trustroot[]',
+                                              'type' => 'checkbox',
+                                              'class' => 'checkbox',
+                                              'value' => $user_openid_trustroot->trustroot,
+                                              'id' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)));
+                $this->element('label', array('class'=>'checkbox', 'for' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)),
+                               $user_openid_trustroot->trustroot);
+                $this->elementEnd('li');
+            }
+        }
+        $this->elementEnd('ul');
+        $this->element('input', array('type' => 'submit',
+                                      'id' => 'settings_openid_trustroots_action-submit',
+                                      'name' => 'remove_trustroots',
+                                      'class' => 'submit',
+                                      'value' => _m('Remove')));
+        $this->elementEnd('fieldset');
+        $this->elementEnd('form');
     }
 
     /**
@@ -204,11 +241,44 @@ class OpenidsettingsAction extends AccountSettingsAction
             }
         } else if ($this->arg('remove')) {
             $this->removeOpenid();
+        } else if($this->arg('remove_trustroots')) {
+            $this->removeTrustroots();
         } else {
             $this->showForm(_m('Something weird happened.'));
         }
     }
 
+    /**
+     * Handles a request to remove OpenID trustroots from the user's account
+     *
+     * Validates input and, if everything is OK, deletes the trustroots.
+     * Reloads the form with a success or error notification.
+     *
+     * @return void
+     */
+
+    function removeTrustroots()
+    {
+        $user = common_current_user();
+        $trustroots = $this->arg('openid_trustroot');
+        if($trustroots) {
+            foreach($trustroots as $trustroot) {
+                $user_openid_trustroot = User_openid_trustroot::pkeyGet(
+                                                array('user_id'=>$user->id, 'trustroot'=>$trustroot));
+                if($user_openid_trustroot) {
+                    $user_openid_trustroot->delete();
+                } else {
+                    $this->showForm(_m('No such OpenID trustroot.'));
+                    return;
+                }
+            }
+            $this->showForm(_m('Trustroots removed'), true);
+        } else {
+            $this->showForm();
+        }
+        return;
+    }
+
     /**
      * Handles a request to remove an OpenID from the user's account
      *
index ba87b266a03b2588cb62988531838dce483693c0..8af71af747246419595971f272d756128673d795 100644 (file)
@@ -77,9 +77,9 @@ class OrbitedPlugin extends RealtimePlugin
         $root = 'http://'.$server.(($port == 80) ? '':':'.$port);
 
         $scripts[] = $root.'/static/Orbited.js';
-        $scripts[] = common_path('plugins/Orbited/orbitedextra.js');
+        $scripts[] = 'plugins/Orbited/orbitedextra.js';
         $scripts[] = $root.'/static/protocols/stomp/stomp.js';
-        $scripts[] = common_path('plugins/Orbited/orbitedupdater.js');
+        $scripts[] = 'plugins/Orbited/orbitedupdater.js';
 
         return $scripts;
     }
diff --git a/plugins/README-plugins b/plugins/README-plugins
new file mode 100644 (file)
index 0000000..cdce7eb
--- /dev/null
@@ -0,0 +1,21 @@
+Several example plugins are included in the plugins/ directory. You
+can enable a plugin with the following line in config.php:
+
+    addPlugin('Example', array('param1' => 'value1',
+                               'param2' => 'value2'));
+
+This will look for and load files named 'ExamplePlugin.php' or
+'Example/ExamplePlugin.php' either in the plugins/ directory (for
+plugins that ship with StatusNet) or in the local/ directory (for
+plugins you write yourself or that you get from somewhere else) or
+local/plugins/.
+
+Plugins are documented in their own directories.
+
+
+Additional information on using and developing plugins can be found
+on the StatusNet wiki:
+
+http://status.net/wiki/Plugins
+http://status.net/wiki/Plugin_development
+
index 2b3cb35f1d370dcc8b3b6c5421b3129956bcd032..b559d80c605a540aa333299fb3e25deb998a0f35 100644 (file)
@@ -117,7 +117,7 @@ class RealtimePlugin extends Plugin
 
     function onEndShowStatusNetStyles($action)
     {
-        $action->cssLink(common_path('plugins/Realtime/realtimeupdate.css'),
+        $action->cssLink('plugins/Realtime/realtimeupdate.css',
                          null, 'screen, projection, tv');
         return true;
     }
@@ -305,7 +305,7 @@ class RealtimePlugin extends Plugin
 
     function _getScripts()
     {
-        return array(common_path('plugins/Realtime/realtimeupdate.js'));
+        return array('plugins/Realtime/realtimeupdate.js');
     }
 
     function _updateInitialize($timeline, $user_id)
index 2e5851ae531e539dc07f85a0d0eab80915a87fc8..0f7a680d73c8e41d9aa6e509cb0188765abe5c60 100644 (file)
@@ -130,7 +130,7 @@ RealtimeUpdate = {
           user = data['user'];
           html = data['html'].replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&amp;/g,'&');
           source = data['source'].replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&amp;/g,'&');
-
+console.log(data);
           ni = "<li class=\"hentry notice\" id=\"notice-"+unique+"\">"+
                "<div class=\"entry-title\">"+
                "<span class=\"vcard author\">"+
index 3665214f85710c603f811763c78e08a7e7afe5e1..c585da43c4eceefbee2db7039c1babc36480d971 100644 (file)
@@ -31,8 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-define('RECAPTCHA', '0.2');
-
 require_once(INSTALLDIR.'/plugins/Recaptcha/recaptchalib.php');
 
 class RecaptchaPlugin extends Plugin
@@ -88,4 +86,16 @@ class RecaptchaPlugin extends Plugin
             return false;
         }
     }
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'Recaptcha',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Eric Helgeson',
+                            'homepage' => 'http://status.net/wiki/Plugin:Recaptcha',
+                            'rawdescription' =>
+                            _m('Uses <a href="http://recaptcha.org/">Recaptcha</a> service to add a  '.
+                               'captcha to the registration page.'));
+        return true;
+    }
 }
index e9160ed9b98582e40ceeea6eb3384db47fe0f89c..57b53219e9848562d41b66a7d7dbc75ce988fa0e 100644 (file)
@@ -8,7 +8,10 @@ add "addPlugin('reverseUsernameAuthentication', array('setting'=>'value', 'setti
 
 Settings
 ========
-provider_name*: a unique name for this authentication provider.
+provider_name*: This is a identifier designated to the connection.
+    It's how StatusNet will refer to the authentication source.
+    For the most part, any name can be used, so long as each authentication source has a different identifier.
+    In most cases there will be only one authentication source used.
 password_changeable*: must be set to false. This plugin does not support changing passwords.
 authoritative (false): Set to true if this plugin's responses are authoritative (meaning if this fails, do check any other plugins or the internal password database).
 autoregistration (false): Set to true if users should be automatically created when they attempt to login.
index d9d2137f827dded3ade0f7ee6b2de6160a3f2679..dac5a158841a77a483fdd488f852b39dd6a1567a 100644 (file)
@@ -47,10 +47,13 @@ class ReverseUsernameAuthenticationPlugin extends AuthenticationPlugin
         return $username == strrev($password);
     }
 
-    function autoRegister($username)
+    function autoRegister($username, $nickname)
     {
+        if(is_null($nickname)){
+            $nickname = $username;
+        }
         $registration_data = array();
-        $registration_data['nickname'] = $username ;
+        $registration_data['nickname'] = $nickname ;
         return User::register($registration_data);
     }
 
diff --git a/plugins/TabFocus/TabFocusPlugin.php b/plugins/TabFocus/TabFocusPlugin.php
new file mode 100644 (file)
index 0000000..bf89c47
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Plugin to enable Twitter-like "tab-space" pattern for a user to submit a notice
+ *
+ * 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    Paul Irish <paul.irish@isobar.net>
+ * @copyright 2009 Craig Andrews http://candrews.integralblue.com
+ * @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);
+}
+
+class TabFocusPlugin extends Plugin
+{
+    function __construct()
+    {
+        parent::__construct();
+    }
+
+    function onEndShowScripts($action)
+    {
+        $action->script('plugins/TabFocus/tabfocus.js');
+    }
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'TabFocus',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Craig Andrews and Paul Irish',
+                            'homepage' => 'http://status.net/wiki/Plugin:TabFocus',
+                            'rawdescription' =>
+                            _m('TabFocus changes the notice form behavior so that, while in the text area, pressing the tab key focuses the "Send" button, matching the behavor of Twitter.'));
+        return true;
+    }
+}
diff --git a/plugins/TabFocus/tabfocus.js b/plugins/TabFocus/tabfocus.js
new file mode 100644 (file)
index 0000000..e2c1c65
--- /dev/null
@@ -0,0 +1,7 @@
+jQuery(function($){
+  $('#notice_data-text').bind('keydown',function(e){
+    if (e.which==9) {
+      setTimeout(function(){  $('#notice_action-submit').focus();  },15);
+    }
+  });
+});
index d0d34b7ef2ffabb47294aadf9a646f7fb7c133a7..d7dfe20de5922e5ce4f88c06c1b81f0fada20972 100644 (file)
@@ -59,8 +59,8 @@ unless you configure it with a consumer key and secret.)
    secret.  The Twitter bridge will fall back on the global key pair if
    it can't find a local pair, e.g.:
 
-   $config['twitter']['global_consumer_key']    = 'YOUR_CONSUMER_KEY'
-   $config['twitter']['global_consumer_secret'] = 'YOUR_CONSUMER_SECRET'
+   $config['twitter']['global_consumer_key']    = 'YOUR_CONSUMER_KEY';
+   $config['twitter']['global_consumer_secret'] = 'YOUR_CONSUMER_SECRET';
 
 Administration panel
 --------------------
index 671e3c7afa35cb721a8195aadcc2953fd414dbca..df7da0943d1d68d102a2ad4a431e7f173ffcf71c 100755 (executable)
@@ -221,7 +221,7 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon
             // Twitter friend
 
             if (!save_twitter_user($friend_id, $friend_name)) {
-                common_log(LOG_WARNING, $this-name() .
+                common_log(LOG_WARNING, $this->name() .
                            " - Couldn't save $screen_name's friend, $friend_name.");
                 continue;
             }
index 5086999394257fe0089b46407b3ec8140059a279..2805b3ab565d99e2c68caf9f49310119e9b3f054 100644 (file)
@@ -252,8 +252,17 @@ function format_status($notice)
     $statustxt = preg_replace('/^@/', ' @', $notice->content);
 
     // Convert !groups to #hashes
+
+    // XXX: Make this an optional setting?
+
     $statustxt = preg_replace('/(^|\s)!([A-Za-z0-9]{1,64})/', "\\1#\\2", $statustxt);
 
+    if (mb_strlen($statustxt) > 140) {
+        $noticeUrl = common_shorten_url($notice->uri);
+        $urlLen = mb_strlen($noticeUrl);
+        $statustxt = mb_substr($statustxt, 0, 140 - ($urlLen + 3)) . ' … ' . $noticeUrl;
+    }
+
     return $statustxt;
 }
 
index 30befadfd4aced4786a0d9f50501e78a84a4892a..2af6f9cb047643e838116d293d5c1a57cdb70e04 100755 (executable)
@@ -249,7 +249,7 @@ class UTF8FixerUpper
         $sql = 'SELECT id, fullname, location, description FROM user_group ' .
           'WHERE LENGTH(fullname) != CHAR_LENGTH(fullname) '.
           'OR LENGTH(location) != CHAR_LENGTH(location) '.
-          'OR LENGTH(description) != CHAR_LENGTH(description) ';
+          'OR LENGTH(description) != CHAR_LENGTH(description) '.
           'AND modified < "'.$this->max_date.'" '.
           'ORDER BY modified DESC';
 
index 7316f21080c18bde893e4120d2f349ca5cb10760..c12e3b91a8f3a920ce9fc9c4f21e08fded44b83d 100644 (file)
@@ -102,7 +102,7 @@ function importActivityStream($user, $doc)
     for ($i = $entries->length - 1; $i >= 0; $i--) {
         $entry = $entries->item($i);
         $activity = new Activity($entry, $feed);
-        $object = $activity->object;
+        $object = $activity->objects[0];
         if (!have_option('q', 'quiet')) {
             print $activity->content . "\n";
         }
index 6676a87c803d5edfccd8bb05a94e27277adf25ce..0a59d36f83fbcad75d1bb0f9ed22042a65c2c6ac 100755 (executable)
@@ -53,7 +53,17 @@ if (have_option('i', 'id')) {
 
 if (!empty($user)) {
     if (empty($user->email)) {
-        print "No email registered for user '$user->nickname'\n";
+        # Check for unconfirmed emails
+        $unconfirmed_email = new Confirm_address();
+        $unconfirmed_email->user_id = $user->id;
+        $unconfirmed_email->address_type = 'email';
+        $unconfirmed_email->find(true);
+
+        if (empty($unconfirmed_email->address)) {
+            print "No email registered for user '$user->nickname'\n";
+        } else {
+            print "Unconfirmed Adress: $unconfirmed_email->address\n";
+        }
     } else {
         print "$user->email\n";
     }
@@ -65,7 +75,18 @@ if (have_option('e', 'email')) {
     $user->email = get_option_value('e', 'email');
     $user->find(false);
     if (!$user->fetch()) {
-        print "No users with email $user->email\n";
+        # Check unconfirmed emails
+        $unconfirmed_email = new Confirm_address();
+        $unconfirmed_email->address = $user->email;
+        $unconfirmed_email->address_type = 'email';
+        $unconfirmed_email->find(true);
+
+        if (empty($unconfirmed_email->user_id)) {
+            print "No users with email $user->email\n";
+        } else {
+            $user=User::staticGet('id', $unconfirmed_email->user_id);
+            print "Unconfirmed Address: $user->id $user->nickname\n";
+        }
         exit(0);
     }
     do {
index 26c7991b885f43013decf5401302e29c119a64b7..abd7cc22b46bdad867b7317f7bfa2e7b24d49c04 100755 (executable)
@@ -98,7 +98,15 @@ class XmppMaster extends IoMaster
 // don't have to find an XMPP site to start up when using --all mode.
 if (common_config('xmpp','enabled')==false) {
     print "Aborting daemon - xmpp is disabled\n";
-    exit();
+    exit(1);
+}
+
+if (version_compare(PHP_VERSION, '5.2.6', '<')) {
+    $arch = php_uname('m');
+    if ($arch == 'x86_64' || $arch == 'amd64') {
+        print "Aborting daemon - 64-bit PHP prior to 5.2.6 has known bugs in stream_select; you are running " . PHP_VERSION . " on $arch.\n";
+        exit(1);
+    }
 }
 
 if (have_option('i', 'id')) {
index 7bf9cec7c453d57e048b15ec2671ba31c602faf2..fec8829ebad4ca60080b7e7a738aacfdcc8b73e5 100644 (file)
@@ -25,11 +25,11 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
         $this->assertEquals($act->time, 1243860840);
         $this->assertEquals($act->verb, ActivityVerb::POST);
 
-        $this->assertFalse(empty($act->object));
-        $this->assertEquals($act->object->title, 'Punctuation Changeset');
-        $this->assertEquals($act->object->type, 'http://versioncentral.example.org/activity/changeset');
-        $this->assertEquals($act->object->summary, 'Fixing punctuation because it makes it more readable.');
-        $this->assertEquals($act->object->id, 'tag:versioncentral.example.org,2009:/change/1643245');
+        $this->assertFalse(empty($act->objects[0]));
+        $this->assertEquals($act->objects[0]->title, 'Punctuation Changeset');
+        $this->assertEquals($act->objects[0]->type, 'http://versioncentral.example.org/activity/changeset');
+        $this->assertEquals($act->objects[0]->summary, 'Fixing punctuation because it makes it more readable.');
+        $this->assertEquals($act->objects[0]->id, 'tag:versioncentral.example.org,2009:/change/1643245');
     }
 
     public function testExample3()
@@ -56,12 +56,12 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
         $this->assertEquals($act->actor->title, 'John Doe');
         $this->assertEquals($act->actor->id, 'mailto:johndoe@example.com');
 
-        $this->assertFalse(empty($act->object));
-        $this->assertEquals($act->object->type, ActivityObject::NOTE);
-        $this->assertEquals($act->object->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a');
-        $this->assertEquals($act->object->title, 'Atom-Powered Robots Run Amok');
-        $this->assertEquals($act->object->summary, 'Some text.');
-        $this->assertEquals($act->object->link, 'http://example.org/2003/12/13/atom03.html');
+        $this->assertFalse(empty($act->objects[0]));
+        $this->assertEquals($act->objects[0]->type, ActivityObject::NOTE);
+        $this->assertEquals($act->objects[0]->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a');
+        $this->assertEquals($act->objects[0]->title, 'Atom-Powered Robots Run Amok');
+        $this->assertEquals($act->objects[0]->summary, 'Some text.');
+        $this->assertEquals($act->objects[0]->link, 'http://example.org/2003/12/13/atom03.html');
 
         $this->assertFalse(empty($act->context));
 
@@ -90,8 +90,8 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
         $this->assertEquals('http://example.net/conversation/11', $act->context->conversation);
         $this->assertEquals(array('http://example.net/user/1'), $act->context->attention);
 
-        $this->assertFalse(empty($act->object));
-        $this->assertEquals($act->object->content,
+        $this->assertFalse(empty($act->objects[0]));
+        $this->assertEquals($act->objects[0]->content,
                             '@<span class="vcard"><a href="http://example.net/user/1" class="url"><span class="fn nickname">evan</span></a></span> now is the time for all good men to come to the aid of their country. #<span class="tag"><a href="http://example.net/tag/thetime" rel="tag">thetime</a></span>');
 
         $this->assertFalse(empty($act->actor));
@@ -138,6 +138,170 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
         $this->assertEquals($poco->urls[0]->value, 'http://example.com/blog.html');
         $this->assertEquals($poco->urls[0]->primary, 'true');
         $this->assertEquals($act->actor->geopoint, '37.7749295 -122.4194155');
+    }
+
+    public function testExample6()
+    {
+        global $_example6;
+
+        $dom = DOMDocument::loadXML($_example6);
+
+        $rss = $dom->documentElement;
+
+        $channels = $dom->getElementsByTagName('channel');
+
+        $channel = $channels->item(0);
+
+        $items = $channel->getElementsByTagName('item');
+
+        $item = $items->item(0);
+
+        $act = new Activity($item, $channel);
+
+        $this->assertEquals($act->verb, ActivityVerb::POST);
+
+        $this->assertEquals($act->id, 'http://en.blog.wordpress.com/?p=3857');
+        $this->assertEquals($act->link, 'http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/');
+        $this->assertEquals($act->title, 'Rub-a-Dub-Dub in the PubSubHubbub');
+        $this->assertEquals($act->time, 1267634892);
+
+        $actor = $act->actor;
+
+        $this->assertFalse(empty($actor));
+        $this->assertEquals($actor->title, "Joseph Scott");
+    }
+
+    public function testExample7()
+    {
+        global $_example7;
+
+        $dom = DOMDocument::loadXML($_example7);
+
+        $rss = $dom->documentElement;
+
+        $channels = $dom->getElementsByTagName('channel');
+
+        $channel = $channels->item(0);
+
+        $items = $channel->getElementsByTagName('item');
+
+        $item = $items->item(0);
+
+        $act = new Activity($item, $channel);
+
+        $this->assertEquals(ActivityVerb::POST, $act->verb);
+        $this->assertEquals('http://evanpro.posterous.com/checking-out-captain-bones', $act->link);
+        $this->assertEquals('http://evanpro.posterous.com/checking-out-captain-bones', $act->id);
+        $this->assertEquals('Checking out captain bones', $act->title);
+        $this->assertEquals(1269095551, $act->time);
+
+        $actor = $act->actor;
+
+        $this->assertEquals(ActivityObject::PERSON, $actor->type);
+        $this->assertEquals('http://posterous.com/people/3sDslhaepotz', $actor->id);
+        $this->assertEquals('Evan Prodromou', $actor->title);
+        $this->assertNull($actor->summary);
+        $this->assertNull($actor->content);
+        $this->assertEquals('http://posterous.com/people/3sDslhaepotz', $actor->link);
+        $this->assertNull($actor->source);
+        $this->assertTrue(is_array($actor->avatarLinks));
+        $this->assertEquals(1, count($actor->avatarLinks));
+        $this->assertEquals('http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg',
+                            $actor->avatarLinks[0]->url);
+        $this->assertNotNull($actor->poco);
+        $this->assertEquals('evanpro', $actor->poco->preferredUsername);
+        $this->assertEquals('Evan Prodromou', $actor->poco->displayName);
+        $this->assertNull($actor->poco->note);
+        $this->assertNull($actor->poco->address);
+        $this->assertEquals(0, count($actor->poco->urls));
+    }
+
+    // Media test - cliqset
+    public function testExample8()
+    {
+        global $_example8;
+        $dom = DOMDocument::loadXML($_example8);
+
+        $feed = $dom->documentElement;
+
+        $entries = $feed->getElementsByTagName('entry');
+
+        $entry = $entries->item(0);
+
+        $act = new Activity($entry, $feed);
+
+        $this->assertFalse(empty($act));
+        $this->assertEquals($act->time, 1269221753);
+        $this->assertEquals($act->verb, ActivityVerb::POST);
+        $this->assertEquals($act->summary, 'zcopley posted 5 photos on Flickr');
+
+        $this->assertFalse(empty($act->objects));
+        $this->assertEquals(sizeof($act->objects), 5);
+
+        $this->assertEquals($act->objects[0]->type, ActivityObject::PHOTO);
+        $this->assertEquals($act->objects[0]->title, 'IMG_1368');
+        $this->assertNull($act->objects[0]->description);
+        $this->assertEquals(
+            $act->objects[0]->thumbnail,
+            'http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg'
+        );
+        $this->assertEquals(
+            $act->objects[0]->link,
+            'http://www.flickr.com/photos/zcopley/4452933806/'
+        );
+
+        $this->assertEquals($act->objects[1]->type, ActivityObject::PHOTO);
+        $this->assertEquals($act->objects[1]->title, 'IMG_1365');
+        $this->assertNull($act->objects[1]->description);
+        $this->assertEquals(
+            $act->objects[1]->thumbnail,
+            'http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg'
+        );
+        $this->assertEquals(
+            $act->objects[1]->link,
+            'http://www.flickr.com/photos/zcopley/4442630390/'
+        );
+
+        $this->assertEquals($act->objects[2]->type, ActivityObject::PHOTO);
+        $this->assertEquals($act->objects[2]->title, 'Classic');
+        $this->assertEquals(
+            $act->objects[2]->description,
+            '-Powered by pikchur.com/n0u'
+        );
+        $this->assertEquals(
+            $act->objects[2]->thumbnail,
+            'http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg'
+        );
+        $this->assertEquals(
+            $act->objects[2]->link,
+            'http://www.flickr.com/photos/zcopley/4430754103/'
+        );
+
+        $this->assertEquals($act->objects[3]->type, ActivityObject::PHOTO);
+        $this->assertEquals($act->objects[3]->title, 'IMG_1363');
+        $this->assertNull($act->objects[3]->description);
+
+        $this->assertEquals(
+            $act->objects[3]->thumbnail,
+            'http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg'
+        );
+        $this->assertEquals(
+            $act->objects[3]->link,
+            'http://www.flickr.com/photos/zcopley/4416969717/'
+        );
+
+        $this->assertEquals($act->objects[4]->type, ActivityObject::PHOTO);
+        $this->assertEquals($act->objects[4]->title, 'IMG_1361');
+        $this->assertNull($act->objects[4]->description);
+
+        $this->assertEquals(
+            $act->objects[4]->thumbnail,
+            'http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg'
+        );
+        $this->assertEquals(
+            $act->objects[4]->link,
+            'http://www.flickr.com/photos/zcopley/4417734232/'
+        );
 
     }
 
@@ -330,3 +494,224 @@ $_example5 = <<<EXAMPLE5
 </entry>
 </feed>
 EXAMPLE5;
+
+$_example6 = <<<EXAMPLE6
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0"
+       xmlns:content="http://purl.org/rss/1.0/modules/content/"
+       xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+       xmlns:dc="http://purl.org/dc/elements/1.1/"
+       xmlns:atom="http://www.w3.org/2005/Atom"
+       xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
+       xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
+       xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
+       >
+
+       <channel>
+               <title>WordPress.com News</title>
+               <atom:link href="http://en.blog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
+               <link>http://en.blog.wordpress.com</link>
+               <description>The latest news on WordPress.com and the WordPress community.</description>
+               <lastBuildDate>Thu, 18 Mar 2010 23:25:35 +0000</lastBuildDate>
+
+               <generator>http://wordpress.com/</generator>
+               <language>en</language>
+               <sy:updatePeriod>hourly</sy:updatePeriod>
+               <sy:updateFrequency>1</sy:updateFrequency>
+               <cloud domain='en.blog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
+               <image>
+                       <url>http://www.gravatar.com/blavatar/e6392390e3bcfadff3671c5a5653d95b?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
+                       <title>WordPress.com News</title>
+                       <link>http://en.blog.wordpress.com</link>
+               </image>
+               <atom:link rel="search" type="application/opensearchdescription+xml" href="http://en.blog.wordpress.com/osd.xml" title="WordPress.com News" />
+               <atom:link rel='hub' href='http://en.blog.wordpress.com/?pushpress=hub'/>
+
+               <item>
+                       <title>Rub-a-Dub-Dub in the PubSubHubbub</title>
+                       <link>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/</link>
+                       <comments>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/#comments</comments>
+                       <pubDate>Wed, 03 Mar 2010 16:48:12 +0000</pubDate>
+                       <dc:creator>Joseph Scott</dc:creator>
+
+                       <category><![CDATA[Feeds]]></category>
+                       <category><![CDATA[atom]]></category>
+                       <category><![CDATA[pubsubhubbub]]></category>
+                       <category><![CDATA[rss]]></category>
+
+                       <guid isPermaLink="false">http://en.blog.wordpress.com/?p=3857</guid>
+                       <description><![CDATA[From the tongue twisting name department we welcome PubSubHubbub, or as some people have shortened it to: PuSH.  Like rssCloud, PuSH is a way for services that subscribe to updates from your blog (think Google Reader, Bloglines or Netvibes) to get updates even faster.  In a nutshell, instead of having to periodically ask [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=en.blog.wordpress.com&blog=3584907&post=3857&subd=en.blog&ref=&feed=1" />]]></description>
+                               <content:encoded><![CDATA[<p>From the tongue twisting name department we welcome <a href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub</a>, or as some people have shortened it to: PuSH.  Like <a href="http://en.blog.wordpress.com/2009/09/07/rss-in-the-clouds/">rssCloud</a>, PuSH is a way for services that subscribe to updates from your blog (think Google Reader, Bloglines or Netvibes) to get updates even faster.  In a nutshell, instead of having to periodically ask your blog if there are any updates they can now register to automatically receive updates each time you publish new content.  In most cases these updates are sent out within a second or two of when you hit the publish button.</p>
+       <p>Today we&#8217;ve turned on PuSH support for the more than 10.5 million blogs on WordPress.com.  There&#8217;s nothing to configure, it&#8217;s working right now behind the scenes to help others keep up to date with your posts.</p>
+       <p>For those using the WordPress.org software we are releasing a new PuSH plugin: <a href="http://wordpress.org/extend/plugins/pushpress/">PuSHPress</a>.  This plugin differs from the current PuSH related plugins by including a built-in hub.</p>
+       <p>For more PuSH related reading check out the <a href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub project site</a> and <a href="http://groups.google.com/group/pubsubhubbub?pli=1">Google Group</a>.  And if you really want to geek out there&#8217;s always the <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html">PubSubHubbub Spec</a> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
+       <br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/en.blog.wordpress.com/3857/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/en.blog.wordpress.com/3857/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/en.blog.wordpress.com/3857/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=en.blog.wordpress.com&blog=3584907&post=3857&subd=en.blog&ref=&feed=1" />]]></content:encoded>
+                               <wfw:commentRss>http://en.blog.wordpress.com/2010/03/03/rub-a-dub-dub-in-the-pubsubhubbub/feed/</wfw:commentRss>
+
+                       <slash:comments>96</slash:comments>
+
+                       <media:content url="http://1.gravatar.com/avatar/582b66ad5ae1b69c7601a990cb9a661a?s=96&#38;d=identicon" medium="image">
+                               <media:title type="html">josephscott</media:title>
+                       </media:content>
+               </item>
+       </channel>
+</rss>
+EXAMPLE6;
+
+$_example7 = <<<EXAMPLE7
+<?xml version="1.0" encoding="UTF-8"?>
+       <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
+         <channel>
+           <title>evanpro's posterous</title>
+           <link>http://evanpro.posterous.com</link>
+           <description>Most recent posts at evanpro's posterous</description>
+           <generator>posterous.com</generator>
+           <link type="application/json" xmlns="http://www.w3.org/2005/Atom" rel="http://api.friendfeed.com/2008/03#sup" href="http://posterous.com/api/sup_update#56bcc5eb7"/>
+           <atom:link rel="self" href="http://evanpro.posterous.com/rss.xml"/>
+           <atom:link rel="hub" href="http://posterous.superfeedr.com"/>
+           <item>
+             <pubDate>Sat, 20 Mar 2010 07:32:31 -0700</pubDate>
+             <title>Checking out captain bones</title>
+             <link>http://evanpro.posterous.com/checking-out-captain-bones</link>
+             <guid>http://evanpro.posterous.com/checking-out-captain-bones</guid>
+             <description>
+               <![CDATA[<p>
+               <p>Bones!</p>
+
+       </p>
+
+       <p><a href="http://evanpro.posterous.com/checking-out-captain-bones">Permalink</a>
+
+               | <a href="http://evanpro.posterous.com/checking-out-captain-bones#comment">Leave a comment&nbsp;&nbsp;&raquo;</a>
+
+       </p>]]>
+             </description>
+             <posterous:author>
+               <posterous:userImage>http://files.posterous.com/user_profile_pics/480326/2009-08-05-142447.jpg</posterous:userImage>
+               <posterous:profileUrl>http://posterous.com/people/3sDslhaepotz</posterous:profileUrl>
+               <posterous:firstName>Evan</posterous:firstName>
+               <posterous:lastnNme>Prodromou</posterous:lastnNme>
+               <posterous:nickName>evanpro</posterous:nickName>
+               <posterous:displayName>Evan Prodromou</posterous:displayName>
+             </posterous:author>
+           </item>
+       </channel>
+</rss>
+EXAMPLE7;
+
+$_example8 = <<<EXAMPLE8
+<?xml version="1.0"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+    <link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
+    <title type="text">Activity Stream for: zcopley</title>
+    <id>http://cliqset.com/feed/atom?uid=zcopley</id>
+    <entry xmlns:service="http://activitystrea.ms/service-provider" xmlns:activity="http://activitystrea.ms/spec/1.0/">
+        <thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total>
+        <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+        <published>2010-03-22T01:35:53.000Z</published>
+        <service:provider>
+            <name>flickr</name>
+            <uri>http://flickr.com</uri>
+            <icon>http://cliqset-services.s3.amazonaws.com/flickr.png</icon>
+        </service:provider>
+        <activity:object>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <title type="text">IMG_1368</title>
+            <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg"/>
+            <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4452933806/"/>
+        </activity:object>
+        <activity:object>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <title type="text">IMG_1365</title>
+            <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg"/>
+            <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4442630390/"/>
+        </activity:object>
+        <activity:object xmlns:media="http://purl.org/syndication/atommedia">
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <title type="text">Classic</title>
+            <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg"/>
+            <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4430754103/"/>
+            <media:description type="text">-Powered by pikchur.com/n0u</media:description>
+        </activity:object>
+        <activity:object>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <title type="text">IMG_1363</title>
+            <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg"/>
+            <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4416969717/"/>
+        </activity:object>
+        <activity:object>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <title type="text">IMG_1361</title>
+            <link type="image/jpeg" rel="preview" href="http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg"/>
+            <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/zcopley/4417734232/"/>
+        </activity:object>
+        <title type="text">zcopley posted some photos on Flickr</title>
+        <summary type="text">zcopley posted 5 photos on Flickr</summary>
+        <category scheme="http://schemas.cliqset.com/activity/categories/1.0" term="PhotoPosted" label="Photo Posted"/>
+        <updated>2010-03-22T20:46:42.778Z</updated>
+        <id>tag:cliqset.com,2010-03-22:/user/zcopley/SVgAZubGhtAnSAee</id>
+        <link href="http://cliqset.com/user/zcopley/SVgAZubGhtAnSAee" type="text/xhtml" rel="alternate" title="zcopley posted some photos on Flickr"/>
+        <author>
+            <name>zcopley</name>
+            <uri>http://cliqset.com/user/zcopley</uri>
+        </author>
+        <activity:actor xmlns:poco="http://portablecontacts.net/spec/1.0">
+            <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+            <id>zcopley</id>
+            <poco:name>
+                <poco:givenName>Zach</poco:givenName>
+                <poco:familyName>Copley</poco:familyName>
+            </poco:name>
+            <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=80" media:height="80" media:width="80"/>
+            <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=120" media:height="120" media:width="120"/>
+            <link xmlns:media="http://purl.org/syndication/atommedia" type="image/png" rel="avatar" href="http://dynamic.cliqset.com/avatar/zcopley?s=200" media:height="200" media:width="200"/>
+        </activity:actor>
+    </entry>
+</feed>
+EXAMPLE8;
+
+$_example9 = <<<EXAMPLE9
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss" xmlns:activity="http://activitystrea.ms/spec/1.0/">
+    <link rel="self" type="application/atom+xml" href="http://buzz.googleapis.com/feeds/117848251937215158042/public/posted"/>
+    <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
+    <title type="text">Google Buzz</title>
+    <updated>2010-03-22T01:55:53.596Z</updated>
+    <id>tag:google.com,2009:buzz-feed/public/posted/117848251937215158042</id>
+    <generator>Google - Google Buzz</generator>
+    <entry>
+        <title type="html">Buzz by Zach Copley from Flickr</title>
+        <summary type="text">IMG_1366</summary>
+        <published>2010-03-18T04:29:23.000Z</published>
+        <updated>2010-03-18T05:14:03.325Z</updated>
+        <id>tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0</id>
+        <link rel="alternate" type="text/html" href="http://www.google.com/buzz/117848251937215158042/ZU7b6mHJEmC/IMG-1366"/>
+        <author>
+            <name>Zach Copley</name>
+            <uri>http://www.google.com/profiles/zcopley</uri>
+        </author>
+        <content type="html">&lt;div&gt;IMG_1366&lt;/div&gt;</content>
+        <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" title="IMG_1366"/>
+        <media:content url="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" medium="image">
+            <media:title>IMG_1366</media:title>
+            <media:player url="http://farm5.static.flickr.com/4053/4442630700_980b19a1a6_o.jpg" height="1600" width="1200"/>
+        </media:content>
+        <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" title="IMG_1365"/>
+        <media:content url="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" medium="image">
+            <media:title>IMG_1365</media:title>
+            <media:player url="http://farm5.static.flickr.com/4043/4442630390_62da5560ae_o.jpg" height="1200" width="1600"/>
+        </media:content>
+        <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+        <activity:object>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/photo</activity:object-type>
+            <id>tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0</id>
+            <title>Buzz by Zach Copley from Flickr</title>
+            <content type="html">&lt;div&gt;IMG_1366&lt;/div&gt;</content>
+            <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630700" type="image/jpeg" title="IMG_1366"/>
+            <link rel="enclosure" href="http://www.flickr.com/photos/22823034@N00/4442630390" type="image/jpeg" title="IMG_1365"/>
+        </activity:object>
+        <link rel="replies" type="application/atom+xml" href="http://buzz.googleapis.com/feeds/117848251937215158042/comments/z12zwdhxowq2d13q204cjr04kzu0cns5gh0" thr:count="0"/>
+        <thr:total>0</thr:total>
+    </entry>
+</feed>
+EXAMPLE9;
index b3f9a64171f2a8d30972c983c31a832792d1e02b..208e71be69af40276ea197529ff8ea010aa30483 100644 (file)
@@ -66,11 +66,11 @@ class UserFeedParseTests extends PHPUnit_Framework_TestCase
         // test the post
 
         //var_export($act1);
-        $this->assertEquals($act1->object->type, 'http://activitystrea.ms/schema/1.0/note');
-        $this->assertEquals($act1->object->title, 'And now for something completely insane...');
+        $this->assertEquals($act1->objects[0]->type, 'http://activitystrea.ms/schema/1.0/note');
+        $this->assertEquals($act1->objects[0]->title, 'And now for something completely insane...');
 
-        $this->assertEquals($act1->object->content, 'And now for something completely insane...');
-        $this->assertEquals($act1->object->id, 'http://localhost/statusnet/notice/3');
+        $this->assertEquals($act1->objects[0]->content, 'And now for something completely insane...');
+        $this->assertEquals($act1->objects[0]->id, 'http://localhost/statusnet/notice/3');
 
     }
 
index 0246065a7fd2e53a178741e40aa8d40a663f4866..782d3dc714d5493116142cc36a23f03427aa7968 100644 (file)
@@ -1,8 +1,8 @@
 /** theme: base
  *
  * @package   StatusNet
- * @author Sarven Capadisli <csarven@status.net>
- * @copyright 2009 StatusNet, Inc.
+ * @author    Sarven Capadisli <csarven@status.net>
+ * @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/
  */
index edc49478f56ace9340f791b5fe448af7d181d8a5..6df5e01cee7207e702e0596b701340c8297c4cff 100644 (file)
@@ -12,11 +12,11 @@ margin:0 auto;
 }
 
 #content {
-width:69%;
+width:66%;
 }
 #aside_primary {
-padding:5%;
-width:29.5%;
+padding:1.8%;
+width:24%;
 }
 .entity_profile .entity_nickname,
 .entity_profile .entity_location,
@@ -32,9 +32,9 @@ margin-bottom:123px;
 width:20%;
 }
 .notice div.entry-content {
-width:50%;
+width:65%;
 margin-left:30px;
 }
 .notice-options a {
 width:16px;
-}
\ No newline at end of file
+}
index be341813a52d602c44518f335758ef086083a444..d92a53965b223ac16d272dd378cf89b112262d41 100644 (file)
@@ -2,7 +2,7 @@
  *
  * @package   StatusNet
  * @author    Sarven Capadisli <csarven@status.net>
- * @copyright 2009 StatusNet, Inc.
+ * @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/
  */
index db85408ebdbe9e698d7643de0692b05b847b59b5..59cb3c38a0afedbe82bbd5f3913efa935e46fc69 100644 (file)
@@ -2,7 +2,7 @@
  *
  * @package   StatusNet
  * @author    Sarven Capadisli <csarven@status.net>
- * @copyright 2009 StatusNet, Inc.
+ * @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/
  */