]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' of git@gitorious.org:statusnet/mainline into 0.9.x
authorBrion Vibber <brion@pobox.com>
Tue, 2 Mar 2010 23:16:48 +0000 (15:16 -0800)
committerBrion Vibber <brion@pobox.com>
Tue, 2 Mar 2010 23:16:48 +0000 (15:16 -0800)
294 files changed:
EVENTS.txt
actions/accessadminpanel.php
actions/all.php
actions/apidirectmessage.php
actions/apifriendshipsdestroy.php
actions/apigroupcreate.php
actions/apigrouplist.php
actions/apigrouplistall.php
actions/apigroupmembership.php
actions/apistatusnetconfig.php
actions/apitimelinefavorites.php
actions/apitimelinefriends.php
actions/apitimelinegroup.php
actions/apitimelinehome.php
actions/apitimelinementions.php
actions/apitimelinepublic.php
actions/apitimelineretweetedtome.php
actions/apitimelineretweetsofme.php
actions/apitimelinetag.php
actions/apitimelineuser.php
actions/blockedfromgroup.php
actions/deleteuser.php
actions/doc.php
actions/editgroup.php
actions/favor.php
actions/foafgroup.php
actions/groupdesignsettings.php
actions/grouplogo.php
actions/groupmembers.php
actions/grouprss.php
actions/groups.php
actions/hcard.php [new file with mode: 0644]
actions/invite.php
actions/joingroup.php
actions/leavegroup.php
actions/newgroup.php
actions/newnotice.php
actions/postnotice.php
actions/profilesettings.php
actions/public.php
actions/replies.php
actions/showfavorites.php
actions/showgroup.php
actions/subscribe.php
actions/subscriptions.php
actions/sup.php
actions/tag.php
actions/twitapisearchatom.php
actions/twitapisearchjson.php
actions/twitapitrends.php
actions/updateprofile.php
actions/useradminpanel.php
classes/Fave.php
classes/File.php
classes/Inbox.php
classes/Local_group.php [new file with mode: 0644]
classes/Memcached_DataObject.php
classes/Notice.php
classes/Notice_inbox.php
classes/Notice_tag.php
classes/Profile.php
classes/Reply.php
classes/Subscription.php
classes/User.php
classes/User_group.php
classes/statusnet.ini
config.php.sample
db/08to09.sql
db/beta5tobeta6.sql [new file with mode: 0644]
db/statusnet.sql
index.php
js/jquery.form.js
js/jquery.js
js/jquery.min.js
js/util.js
lib/action.php
lib/activity.php [new file with mode: 0644]
lib/adminpanelaction.php
lib/api.php [deleted file]
lib/apiaction.php [new file with mode: 0644]
lib/apiauth.php
lib/atom10entry.php
lib/atom10feed.php
lib/atomnoticefeed.php
lib/atomusernoticefeed.php
lib/authenticationplugin.php
lib/authorizationplugin.php
lib/command.php
lib/commandinterpreter.php
lib/common.php
lib/default.php
lib/distribqueuehandler.php
lib/imagefile.php
lib/joinform.php
lib/leaveform.php
lib/mediafile.php
lib/messageform.php
lib/noticeform.php
lib/noticelist.php
lib/oauthstore.php
lib/omb.php
lib/profilelist.php
lib/profilequeuehandler.php [new file with mode: 0644]
lib/queuemanager.php
lib/router.php
lib/subs.php
lib/taguri.php [new file with mode: 0644]
lib/util.php
locale/ar/LC_MESSAGES/statusnet.po
locale/arz/LC_MESSAGES/statusnet.po
locale/bg/LC_MESSAGES/statusnet.po
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/Blacklist/BlacklistPlugin.php
plugins/Blacklist/blacklistadminpanel.php [new file with mode: 0644]
plugins/BlogspamNetPlugin.php
plugins/CasAuthentication/CasAuthenticationPlugin.php
plugins/CasAuthentication/caslogin.php
plugins/Facebook/FacebookPlugin.php
plugins/Facebook/README
plugins/Facebook/facebookadminpanel.php [new file with mode: 0644]
plugins/Facebook/locale/Facebook.po
plugins/Gravatar/locale/Gravatar.po
plugins/LdapAuthentication/LdapAuthenticationPlugin.php
plugins/LdapAuthentication/README
plugins/LdapAuthorization/LdapAuthorizationPlugin.php
plugins/LdapAuthorization/README
plugins/Mapstraction/locale/Mapstraction.po
plugins/Mapstraction/map.php
plugins/MobileProfile/MobileProfilePlugin.php
plugins/OStatus/OStatusPlugin.php
plugins/OStatus/README
plugins/OStatus/actions/feedsubsettings.php [deleted file]
plugins/OStatus/actions/groupsalmon.php [new file with mode: 0644]
plugins/OStatus/actions/hostmeta.php
plugins/OStatus/actions/ostatusinit.php
plugins/OStatus/actions/ostatussub.php
plugins/OStatus/actions/pushcallback.php
plugins/OStatus/actions/pushhub.php
plugins/OStatus/actions/salmon.php [deleted file]
plugins/OStatus/actions/usersalmon.php [new file with mode: 0644]
plugins/OStatus/actions/webfinger.php [deleted file]
plugins/OStatus/actions/xrd.php [new file with mode: 0644]
plugins/OStatus/classes/FeedSub.php [new file with mode: 0644]
plugins/OStatus/classes/HubSub.php
plugins/OStatus/classes/Magicsig.php [new file with mode: 0644]
plugins/OStatus/classes/Ostatus_profile.php
plugins/OStatus/classes/Ostatus_source.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/Key.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/KeyPair.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php [new file with mode: 0644]
plugins/OStatus/extlib/Crypt/RSA/MathLoader.php [new file with mode: 0644]
plugins/OStatus/extlib/README [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/Atom.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/Exception.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php [deleted file]
plugins/OStatus/extlib/XML/Feed/Parser/Type.php [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/delicious.feed [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/flickr.feed [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/hoder.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml [deleted file]
plugins/OStatus/extlib/XML/Feed/samples/technorati.feed [deleted file]
plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc [deleted file]
plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc [deleted file]
plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc [deleted file]
plugins/OStatus/extlib/hkit/hcard.profile.php [new file with mode: 0644]
plugins/OStatus/extlib/hkit/hkit.class.php [new file with mode: 0644]
plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch [deleted file]
plugins/OStatus/js/ostatus.js
plugins/OStatus/lib/activity.php [deleted file]
plugins/OStatus/lib/discovery.php [new file with mode: 0644]
plugins/OStatus/lib/feeddiscovery.php
plugins/OStatus/lib/feedmunger.php [deleted file]
plugins/OStatus/lib/hubconfqueuehandler.php [new file with mode: 0644]
plugins/OStatus/lib/hubdistribqueuehandler.php [deleted file]
plugins/OStatus/lib/huboutqueuehandler.php
plugins/OStatus/lib/hubverifyqueuehandler.php [deleted file]
plugins/OStatus/lib/magicenvelope.php [new file with mode: 0644]
plugins/OStatus/lib/ostatusqueuehandler.php [new file with mode: 0644]
plugins/OStatus/lib/pushinqueuehandler.php [new file with mode: 0644]
plugins/OStatus/lib/salmon.php
plugins/OStatus/lib/salmonaction.php [new file with mode: 0644]
plugins/OStatus/lib/salmonqueuehandler.php [new file with mode: 0644]
plugins/OStatus/lib/webfinger.php [deleted file]
plugins/OStatus/lib/xrd.php
plugins/OStatus/locale/OStatus.po
plugins/OStatus/scripts/updateostatus.php [new file with mode: 0644]
plugins/OStatus/tests/ActivityParseTests.php [deleted file]
plugins/OStatus/tests/FeedMungerTest.php [deleted file]
plugins/OStatus/theme/base/css/ostatus.css
plugins/OpenID/OpenIDPlugin.php
plugins/OpenID/doc-src/openid
plugins/OpenID/locale/OpenID.po
plugins/PoweredByStatusNet/locale/PoweredByStatusNet.po
plugins/Realtime/RealtimePlugin.php
plugins/Realtime/icon_external.gif [deleted file]
plugins/Realtime/icon_pause.gif [deleted file]
plugins/Realtime/icon_play.gif [deleted file]
plugins/Realtime/realtimeupdate.css
plugins/RegisterThrottle/RegisterThrottlePlugin.php [new file with mode: 0644]
plugins/RegisterThrottle/Registration_ip.php [new file with mode: 0644]
plugins/ReverseUsernameAuthentication/README
plugins/Sample/hello.php
plugins/Sample/locale/Sample.po [new file with mode: 0644]
plugins/SphinxSearch/sphinxsearch.php
plugins/TabFocus/TabFocusPlugin.php [new file with mode: 0644]
plugins/TabFocus/tabfocus.js [new file with mode: 0644]
plugins/TwitterBridge/README
plugins/TwitterBridge/TwitterBridgePlugin.php
plugins/TwitterBridge/locale/TwitterBridge.po
plugins/TwitterBridge/twitteradminpanel.php [new file with mode: 0644]
plugins/TwitterBridge/twitterauthorization.php
scripts/createsim.php
scripts/init_conversation.php [new file with mode: 0755]
scripts/update_po_templates.php
scripts/updateavatarurl.php
scripts/updateavatarurl_group.php [new file with mode: 0644]
tests/ActivityParseTests.php [new file with mode: 0644]
tests/TagURITest.php [new file with mode: 0644]
theme/base/css/display.css
theme/base/images/icons/README [new file with mode: 0644]
theme/base/images/icons/icon_geo.png [deleted file]
theme/base/images/icons/icons-01.gif
theme/cloudy/css/display.css
theme/default/css/display.css
theme/identica/css/display.css
theme/otalk/css/base.css [deleted file]
theme/otalk/css/display.css [deleted file]
theme/otalk/css/ie.css [deleted file]
theme/otalk/default-avatar-mini.png [deleted file]
theme/otalk/default-avatar-profile.png [deleted file]
theme/otalk/default-avatar-stream.png [deleted file]
theme/otalk/images/illustrations/illu_arrow-left-01.gif [deleted file]
theme/otalk/images/illustrations/illu_pattern-01.png [deleted file]
theme/otalk/logo.png [deleted file]
theme/pigeonthoughts/css/base.css
theme/pigeonthoughts/css/display.css
theme/pigeonthoughts/logo.png

index 90242fa133ca203f2e11da19742b0db28e2e3e4d..bb4936b354b6f58c927b41993d0802656533fcbb 100644 (file)
@@ -729,3 +729,66 @@ StartGetProfileUri: When determining the canonical URI for a given profile
 EndGetProfileUri: After determining the canonical URI for a given profile
 - $profile: the current profile
 - &$uri: the URI
+
+StartFavorNotice: Saving a notice as a favorite
+- $profile: profile of the person faving (can be remote!)
+- $notice: notice being faved
+- &$fave: Favor object; null to start off with, but feel free to override.
+
+EndFavorNotice: After saving a notice as a favorite
+- $profile: profile of the person faving (can be remote!)
+- $notice: notice being faved
+
+StartDisfavorNotice: Saving a notice as a favorite
+- $profile: profile of the person faving (can be remote!)
+- $notice: notice being faved
+- &$result: result of the disfavoring (if you override)
+
+EndDisfavorNotice: After saving a notice as a favorite
+- $profile: profile of the person faving (can be remote!)
+- $notice: notice being faved
+
+StartFindMentions: start finding mentions in a block of text
+- $sender: sender profile
+- $text: plain text version of the notice
+- &$mentions: mentions found so far. Array of arrays; each array
+  has 'mentioned' (array of mentioned profiles), 'url' (url to link as),
+  'title' (title of the link), 'position' (position of the text to
+  replace), 'text' (text to replace)
+
+EndFindMentions: end finding mentions in a block of text
+- $sender: sender profile
+- $text: plain text version of the notice
+- &$mentions: mentions found so far. Array of arrays; each array
+  has 'mentioned' (array of mentioned profiles), 'url' (url to link as),
+  'title' (title of the link), 'position' (position of the text to
+  replace), 'text' (text to replace)
+
+StartShowSubscriptionsContent: before showing the subscriptions content
+- $action: the current action
+
+EndShowSubscriptionsContent: after showing the subscriptions content
+- $action: the current action
+
+StartShowAllContent: before showing the all (you and friends) content
+- $action: the current action
+
+EndShowAllContent: after showing the all (you and friends) content
+- $action: the current action
+
+StartDeleteUserForm: starting the data in the form for deleting a user
+- $action: action being shown
+- $user: user being deleted
+
+EndDeleteUserForm: Ending the data in the form for deleting a user
+- $action: action being shown
+- $user: user being deleted
+
+StartDeleteUser: handling the post for deleting a user
+- $action: action being shown
+- $user: user being deleted
+
+EndDeleteUser: handling the post for deleting a user
+- $action: action being shown
+- $user: user being deleted
+
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 3eb1852147f4b8467f27fd2f41b6dbd850101a90..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 {
@@ -144,26 +152,32 @@ class AllAction extends ProfileAction
 
     function showContent()
     {
-        $nl = new NoticeList($this->notice, $this);
+        if (Event::handle('StartShowAllContent', array($this))) {
+            $nl = new NoticeList($this->notice, $this);
 
-        $cnt = $nl->show();
+            $cnt = $nl->show();
 
-        if (0 == $cnt) {
-            $this->showEmptyListMessage();
-        }
+            if (0 == $cnt) {
+                $this->showEmptyListMessage();
+            }
 
-        $this->pagination(
-            $this->page > 1, $cnt > NOTICES_PER_PAGE,
-            $this->page, 'all', array('nickname' => $this->user->nickname)
-        );
+            $this->pagination(
+                $this->page > 1, $cnt > NOTICES_PER_PAGE,
+                $this->page, 'all', array('nickname' => $this->user->nickname)
+            );
+
+            Event::handle('EndShowAllContent', array($this));
+        }
     }
 
     function showPageTitle()
     {
         $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 5fbc46518b2f5ec884d2bad3b81c01a52ac25a15..53da9e0c68a297195c74c6b33eee1c8a5648539a 100644 (file)
@@ -79,7 +79,7 @@ class ApiDirectMessageAction extends ApiAuthAction
         }
 
         $server   = common_root_url();
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
 
         if ($this->arg('sent')) {
 
@@ -182,11 +182,6 @@ class ApiDirectMessageAction extends ApiAuthAction
             $message->whereAdd('id > ' . $this->since_id);
         }
 
-        if (!empty($since)) {
-            $d = date('Y-m-d H:i:s', $this->since);
-            $message->whereAdd("created > '$d'");
-        }
-
         $message->orderBy('created DESC, id DESC');
         $message->limit((($this->page - 1) * $this->count), $this->count);
         $message->find();
index 91c6fd032439e7bdc68c621fec5bcb64458ec4c1..d48a577562af968e259899c56e5a32edb8a79933 100644 (file)
@@ -124,12 +124,9 @@ class ApiFriendshipsDestroyAction extends ApiAuthAction
             return;
         }
 
-        $result = subs_unsubscribe_user($this->user, $this->other->nickname);
-
-        if (is_string($result)) {
-            $this->clientError($result, 403, $this->format);
-            return;
-        }
+        // throws an exception on error
+        Subscription::cancel($this->user->getProfile(),
+                             $this->other->getProfile());
 
         $this->initDocument($this->format);
         $this->showProfile($this->other, $this->format);
index 028d76a7822a99c5bf2f3b6a46d9743280a4054a..145806356c77d2b74224635ed19cc854e92d9629 100644 (file)
@@ -123,7 +123,9 @@ class ApiGroupCreateAction extends ApiAuthAction
                                             'description' => $this->description,
                                             'location' => $this->location,
                                             'aliases'  => $this->aliases,
-                                            'userid'   => $this->user->id));
+                                            'userid'   => $this->user->id,
+                                            'local'    => true));
+
         switch($this->format) {
         case 'xml':
             $this->showSingleXmlGroup($group);
@@ -306,9 +308,9 @@ class ApiGroupCreateAction extends ApiAuthAction
 
     function groupNicknameExists($nickname)
     {
-        $group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
 
-        if (!empty($group)) {
+        if (!empty($local)) {
             return true;
         }
 
index 66b67a030e0899bf3aceb60e6ae568d748d6af59..98fdb0497a3c3bb5e59194d254d25d04abc0e901 100644 (file)
@@ -93,7 +93,7 @@ class ApiGroupListAction extends ApiBareAuthAction
 
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s's groups"), $this->user->nickname);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:Groups";
         $link       = common_local_url(
             'usergroups',
@@ -152,8 +152,7 @@ class ApiGroupListAction extends ApiBareAuthAction
             ($this->page - 1) * $this->count,
             $this->count,
             $this->since_id,
-            $this->max_id,
-            $this->since
+            $this->max_id
         );
 
         while ($group->fetch()) {
index 1921c1f193f3396e4c5d42c2007515487b649280..e1b54a83229ae1bcf985444d8ceebde0b572ace1 100644 (file)
@@ -88,7 +88,7 @@ class ApiGroupListAllAction extends ApiPrivateAuthAction
 
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s groups"), $sitename);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:Groups";
         $link       = common_local_url('groups');
         $subtitle   = sprintf(_("groups on %s"), $sitename);
@@ -134,13 +134,13 @@ class ApiGroupListAllAction extends ApiPrivateAuthAction
 
     function getGroups()
     {
-        $groups = array();
-
-        // XXX: Use the $page, $count, $max_id, $since_id, and $since parameters
+        $qry = 'SELECT user_group.* '.
+          'from user_group join local_group on user_group.id = local_group.group_id '.
+          'order by created desc ';
 
         $group = new User_group();
-        $group->orderBy('created DESC');
-        $group->find();
+
+        $group->query($qry);
 
         while ($group->fetch()) {
             $groups[] = clone($group);
index 3c7c8e88350de063c5adc051947997ed554c34cc..9f72b527cfd7a43601fcf84de764cf330bc82e63 100644 (file)
@@ -125,8 +125,7 @@ class ApiGroupMembershipAction extends ApiPrivateAuthAction
             ($this->page - 1) * $this->count,
             $this->count,
             $this->since_id,
-            $this->max_id,
-            $this->since
+            $this->max_id
         );
 
         while ($profile->fetch()) {
index 0345a9bc0781e7cb986d8ac9207cb1eda53672d4..bff8313b5c55e993165ee7a798f015ae8e6fb90f 100644 (file)
@@ -32,8 +32,6 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/lib/api.php';
-
 /**
  * Gives a full dump of configuration variables for this instance
  * of StatusNet, minus variables that may be security-sensitive (like
index f7f900ddfb5d6382f70c4a1752de799f2473038d..c89d02247acda2edbfcff97d87d5bb9f9c2e860b 100644 (file)
@@ -110,7 +110,7 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
             $this->user->nickname
         );
 
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:Favorites:" . $this->user->id;
 
         $subtitle = sprintf(
index 0af04fe4fb2cef71c07b1ce90528e4016806a349..9ef3ace607eb5b9ef22ad96bd495ca887c413b1c 100644 (file)
@@ -112,7 +112,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
         $avatar     = $profile->getAvatar(AVATAR_PROFILE_SIZE);
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s and friends"), $this->user->nickname);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:FriendsTimeline:" . $this->user->id;
 
         $subtitle = sprintf(
@@ -202,11 +202,11 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
         if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) {
             $notice = $this->user->ownFriendsTimeline(($this->page-1) * $this->count,
                                                       $this->count, $this->since_id,
-                                                      $this->max_id, $this->since);
+                                                      $this->max_id);
         } else {
             $notice = $this->user->friendsTimeline(($this->page-1) * $this->count,
                                                    $this->count, $this->since_id,
-                                                   $this->max_id, $this->since);
+                                                   $this->max_id);
         }
 
         while ($notice->fetch()) {
index 3c74e36b566ec0c964d16c7a1d5127a0bc6a71cf..d0af49844c64957dadd3cc0902d192051b9e8088 100644 (file)
@@ -107,8 +107,6 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
         $sitename   = common_config('site', 'name');
         $avatar     = $this->group->homepage_logo;
         $title      = sprintf(_("%s timeline"), $this->group->nickname);
-        $taguribase = common_config('integration', 'taguri');
-        $id         = "tag:$taguribase:GroupTimeline:" . $this->group->id;
 
         $subtitle   = sprintf(
             _('Updates from %1$s on %2$s!'),
@@ -138,19 +136,9 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
 
             try {
 
-                // If this was called using an integer ID, i.e.: using the canonical
-                // URL for this group's feed, then pass the Group object into the feed, 
-                // so the OStatus plugin, and possibly other plugins, can access it. 
-                // Feels sorta hacky. -- Z
+                $atom = new AtomGroupNoticeFeed($this->group);
 
-                $atom = null;
-                $id = $this->arg('id');
-
-                if (strval(intval($id)) === strval($id)) {
-                    $atom = new AtomGroupNoticeFeed($this->group);
-                } else {
-                    $atom = new AtomGroupNoticeFeed();
-                }
+                // @todo set all this Atom junk up inside the feed class
 
                 $atom->setId($id);
                 $atom->setTitle($title);
@@ -169,6 +157,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
                     $aargs['id'] = $id;
                 }
 
+                $atom->setId($this->getSelfUri('ApiTimelineGroup', $aargs));
+
                 $atom->addLink(
                     $this->getSelfUri('ApiTimelineGroup', $aargs),
                     array('rel' => 'self', 'type' => 'application/atom+xml')
@@ -176,7 +166,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
 
                 $atom->addEntryFromNotices($this->notices);
 
-                $this->raw($atom->getString());
+                //$this->raw($atom->getString());
+                print $atom->getString(); // temp hack until PuSH feeds are redone cleanly
 
             } catch (Atom10FeedException $e) {
                 $this->serverError(
@@ -213,8 +204,7 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
             ($this->page-1) * $this->count,
             $this->count,
             $this->since_id,
-            $this->max_id,
-            $this->since
+            $this->max_id
         );
 
         while ($notice->fetch()) {
index ae41680702fd6484349eba4ff178edd589abdc1d..abd3877860371cd152b7cb7e34266948e5776a1e 100644 (file)
@@ -113,7 +113,7 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
         $avatar     = $profile->getAvatar(AVATAR_PROFILE_SIZE);
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s and friends"), $this->user->nickname);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:HomeTimeline:" . $this->user->id;
 
         $subtitle   = sprintf(
@@ -200,13 +200,13 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
             $notice = $this->user->noticeInbox(
                 ($this->page-1) * $this->count,
                 $this->count, $this->since_id,
-                $this->max_id, $this->since
+                $this->max_id
             );
         } else {
             $notice = $this->user->noticesWithFriends(
                 ($this->page-1) * $this->count,
                 $this->count, $this->since_id,
-                $this->max_id, $this->since
+                $this->max_id
             );
         }
 
index d2e31d0bdd095fe40e592b98647dd14ee50a5689..31627ab7bf36424ea6fa09539388265bb61f96b1 100644 (file)
@@ -117,7 +117,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
             _('%1$s / Updates mentioning %2$s'),
             $sitename, $this->user->nickname
         );
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:Mentions:" . $this->user->id;
         $link       = common_local_url(
             'replies',
@@ -189,7 +189,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
 
         $notice = $this->user->getReplies(
             ($this->page - 1) * $this->count, $this->count,
-            $this->since_id, $this->max_id, $this->since
+            $this->since_id, $this->max_id
         );
 
         while ($notice->fetch()) {
index c1fa72a3ee372f72e944931f86c6480bff17aabc..3e4dad690e83ee80684ef39544ca49b3f5b01e66 100644 (file)
@@ -75,10 +75,6 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
 
         $this->notices = $this->getNotices();
 
-        if ($this->since) {
-            throw new ServerException("since parameter is disabled for performance; use since_id", 403);
-        }
-
         return true;
     }
 
@@ -109,7 +105,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
         $sitename   = common_config('site', 'name');
         $sitelogo   = (common_config('site', 'logo')) ? common_config('site', 'logo') : Theme::path('logo.png');
         $title      = sprintf(_("%s public timeline"), $sitename);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:PublicTimeline";
         $link       = common_root_url();
         $subtitle   = sprintf(_("%s updates from everyone!"), $sitename);
index e47bc30b854cb9a93e69cd2d229186668a5964e4..73e35c86bf81a2ecb8c7d88b661760f1891dcb2c 100644 (file)
@@ -109,7 +109,7 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
             $profile    = $this->auth_user->getProfile();
 
             $title      = sprintf(_("Repeated to %s"), $this->auth_user->nickname);
-            $taguribase = common_config('integration', 'taguri');
+            $taguribase = TagURI::base();
             $id         = "tag:$taguribase:RepeatedToMe:" . $this->auth_user->id;
             $link       = common_local_url('all',
                                            array('nickname' => $this->auth_user->nickname));
index 26706a75e7650c1c65717bd79237676e635d36b5..c77912fd0f24e209bed482232be7110eb7dd45be 100644 (file)
@@ -112,7 +112,7 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
             $profile    = $this->auth_user->getProfile();
 
             $title      = sprintf(_("Repeats of %s"), $this->auth_user->nickname);
-            $taguribase = common_config('integration', 'taguri');
+            $taguribase = TagURI::base();
             $id         = "tag:$taguribase:RepeatsOfMe:" . $this->auth_user->id;
 
             header('Content-Type: application/atom+xml; charset=utf-8');
index 5b6ded4c048d6b08fe77838b2ced98b674484e51..a29061fccfcbc50d35eef9c27ee3e79ad94ea3c1 100644 (file)
@@ -105,7 +105,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
             $this->tag,
             $sitename
         );
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:TagTimeline:".$tag;
 
         switch($this->format) {
index 9f7ec4c2363ab7bdac8490f7796c3fd04c377327..94491946c21b5943f61a7c40bfafef2818c70cd8 100644 (file)
@@ -116,8 +116,6 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s timeline"), $this->user->nickname);
-        $taguribase = common_config('integration', 'taguri');
-        $id         = "tag:$taguribase:UserTimeline:" . $this->user->id;
         $link       = common_local_url(
             'showstream',
             array('nickname' => $this->user->nickname)
@@ -148,21 +146,10 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 
             header('Content-Type: application/atom+xml; charset=utf-8');
 
-            // If this was called using an integer ID, i.e.: using the canonical
-            // URL for this user's feed, then pass the User object into the feed,
-            // so the OStatus plugin, and possibly other plugins, can access it.
-            // Feels sorta hacky. -- Z
+            // @todo set all this Atom junk up inside the feed class
 
-            $atom = null;
-            $id = $this->arg('id');
-
-            if (strval(intval($id)) === strval($id)) {
-                $atom = new AtomUserNoticeFeed($this->user);
-            } else {
-                $atom = new AtomUserNoticeFeed();
-            }
+            $atom = new AtomUserNoticeFeed($this->user);
 
-            $atom->setId($id);
             $atom->setTitle($title);
             $atom->setSubtitle($subtitle);
             $atom->setLogo($logo);
@@ -181,6 +168,8 @@ class ApiTimelineUserAction extends ApiBareAuthAction
                 $aargs['id'] = $id;
             }
 
+            $atom->setId($this->getSelfUri('ApiTimelineUser', $aargs));
+
             $atom->addLink(
                 $this->getSelfUri('ApiTimelineUser', $aargs),
                 array('rel' => 'self', 'type' => 'application/atom+xml')
@@ -222,7 +211,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 
         $notice = $this->user->getNotices(
             ($this->page-1) * $this->count, $this->count,
-            $this->since_id, $this->max_id, $this->since
+            $this->since_id, $this->max_id
         );
 
         while ($notice->fetch()) {
index 0b4caf5bf34e742928bba6aed4e3651a271e2a43..a0598db270e64767f3432fd3ff5e18cf1d4601fe 100644 (file)
@@ -74,7 +74,14 @@ class BlockedfromgroupAction extends GroupDesignAction
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
+
+        if (!$local) {
+            $this->clientError(_('No such group.'), 404);
+            return false;
+        }
+
+        $this->group = User_group::staticGet('id', $local->group_id);
 
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
index 32b703aa7f099fe3e79bf067b184ea1c52339183..c4f84fad2d82d03711b703891bd1045c8862b8ff 100644 (file)
@@ -131,18 +131,21 @@ class DeleteuserAction extends ProfileFormAction
         $this->elementStart('fieldset');
         $this->hidden('token', common_session_token());
         $this->element('legend', _('Delete user'));
-        $this->element('p', null,
-                       _('Are you sure you want to delete this user? '.
-                         'This will clear all data about the user from the '.
-                         'database, without a backup.'));
-        $this->element('input', array('id' => 'deleteuserto-' . $id,
-                                      'name' => 'profileid',
-                                      'type' => 'hidden',
-                                      'value' => $id));
-        foreach ($this->args as $k => $v) {
-            if (substr($k, 0, 9) == 'returnto-') {
-                $this->hidden($k, $v);
+        if (Event::handle('StartDeleteUserForm', array($this, $this->user))) {
+            $this->element('p', null,
+                           _('Are you sure you want to delete this user? '.
+                             'This will clear all data about the user from the '.
+                             'database, without a backup.'));
+            $this->element('input', array('id' => 'deleteuserto-' . $id,
+                                          'name' => 'profileid',
+                                          'type' => 'hidden',
+                                          'value' => $id));
+            foreach ($this->args as $k => $v) {
+                if (substr($k, 0, 9) == 'returnto-') {
+                    $this->hidden($k, $v);
+                }
             }
+            Event::handle('EndDeleteUserForm', array($this, $this->user));
         }
         $this->submit('form_action-no', _('No'), 'submit form_action-primary', 'no', _("Do not block this user"));
         $this->submit('form_action-yes', _('Yes'), 'submit form_action-secondary', 'yes', _('Delete this user'));
@@ -158,7 +161,9 @@ class DeleteuserAction extends ProfileFormAction
 
     function handlePost()
     {
-        $this->user->delete();
+        if (Event::handle('StartDeleteUser', array($this, $this->user))) {
+            $this->user->delete();
+            Event::handle('EndDeleteUser', array($this, $this->user));
+        }
     }
 }
-
index eaf4b7df2d8f0b62365b718cca266ffe572ac1f8..459f5f09683ca013af2ffa7335fd06b4fb7a9f4c 100644 (file)
@@ -173,6 +173,10 @@ class DocAction extends Action
         }
 
         $local = glob(INSTALLDIR.'/local/doc-src/'.$this->title.'.*');
+        if ($local === false) {
+            // Some systems return false, others array(), if dir didn't exist.
+            $local = array();
+        }
 
         if (count($local) || isset($localDef)) {
             return $this->negotiateLanguage($local, $localDef);
@@ -183,6 +187,9 @@ class DocAction extends Action
         }
 
         $dist = glob(INSTALLDIR.'/doc-src/'.$this->title.'.*');
+        if ($dist === false) {
+            $dist = array();
+        }
 
         if (count($dist) || isset($distDef)) {
             return $this->negotiateLanguage($dist, $distDef);
index ad0b6e185dcfe97c801a0787e382a4982bb21be6..4b596cade95cb22871904d1b0ed34781fea56f30 100644 (file)
@@ -86,10 +86,14 @@ class EditgroupAction extends GroupDesignAction
         }
 
         $groupid = $this->trimmed('groupid');
+
         if ($groupid) {
             $this->group = User_group::staticGet('id', $groupid);
         } else {
-            $this->group = User_group::staticGet('nickname', $nickname);
+            $local = Local_group::staticGet('nickname', $nickname);
+            if ($local) {
+                $this->group = User_group::staticGet('id', $local->group_id);
+            }
         }
 
         if (!$this->group) {
@@ -245,6 +249,7 @@ class EditgroupAction extends GroupDesignAction
         $this->group->homepage    = $homepage;
         $this->group->description = $description;
         $this->group->location    = $location;
+        $this->group->mainpage    = common_local_url('showgroup', array('nickname' => $nickname));
 
         $result = $this->group->update($orig);
 
@@ -259,6 +264,12 @@ class EditgroupAction extends GroupDesignAction
             $this->serverError(_('Could not create aliases.'));
         }
 
+        if ($nickname != $orig->nickname) {
+            common_log(LOG_INFO, "Saving local group info.");
+            $local = Local_group::staticGet('group_id', $this->group->id);
+            $local->setNickname($nickname);
+        }
+
         $this->group->query('COMMIT');
 
         if ($this->group->nickname != $orig->nickname) {
@@ -272,10 +283,10 @@ class EditgroupAction extends GroupDesignAction
 
     function nicknameExists($nickname)
     {
-        $group = User_group::staticGet('nickname', $nickname);
+        $group = Local_group::staticGet('nickname', $nickname);
 
         if (!empty($group) &&
-            $group->id != $this->group->id) {
+            $group->group_id != $this->group->id) {
             return true;
         }
 
index 2aeb1da6134df6ff19a1d7bce8150c89262a7c18..afca9768ae0c4c69c57065101f21f8b6dab6b8ea 100644 (file)
@@ -79,7 +79,7 @@ class FavorAction extends Action
             $this->clientError(_('This notice is already a favorite!'));
             return;
         }
-        $fave = Fave::addNew($user, $notice);
+        $fave = Fave::addNew($user->getProfile(), $notice);
         if (!$fave) {
             $this->serverError(_('Could not create favorite.'));
             return;
index f5fd7fe885e993adb4e2fa1fe64b468a3d6bdb81..ebdf1cee2567555748fe04e9423203f4f1a7131b 100644 (file)
@@ -56,7 +56,14 @@ class FoafGroupAction extends Action
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $this->nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
+
+        if (!$local) {
+            $this->clientError(_('No such group.'), 404);
+            return false;
+        }
+
+        $this->group = User_group::staticGet('id', $local->group_id);
 
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
@@ -113,7 +120,7 @@ class FoafGroupAction extends Action
         if ($this->group->homepage_logo) {
             $this->element('depiction', array('rdf:resource' => $this->group->homepage_logo));
         }
-        
+
         $members = $this->group->getMembers();
         $member_details = array();
         while ($members->fetch()) {
@@ -123,7 +130,7 @@ class FoafGroupAction extends Action
                                         );
             $this->element('member', array('rdf:resource' => $member_uri));
         }
-        
+
         $admins = $this->group->getAdmins();
         while ($admins->fetch()) {
             $admin_uri = common_local_url('userbyid', array('id'=>$admins->id));
@@ -132,7 +139,7 @@ class FoafGroupAction extends Action
         }
 
         $this->elementEnd('Group');
-        
+
         ksort($member_details);
         foreach ($member_details as $uri => $details) {
             if ($details['is_admin'])
@@ -158,7 +165,7 @@ class FoafGroupAction extends Action
                                         ));
             }
         }
-        
+
         $this->elementEnd('rdf:RDF');
         $this->endXML();
     }
index e290ba5141e270ac8d4295bba1eb88872f0d53fd..526226a285715914486ffc3eb0905f60c4ebf13c 100644 (file)
@@ -90,7 +90,10 @@ class GroupDesignSettingsAction extends DesignSettingsAction
         if ($groupid) {
             $this->group = User_group::staticGet('id', $groupid);
         } else {
-            $this->group = User_group::staticGet('nickname', $nickname);
+            $local = Local_group::staticGet('nickname', $nickname);
+            if ($local) {
+                $this->group = User_group::staticGet('id', $local->group_id);
+            }
         }
 
         if (!$this->group) {
index 3c9b562962e34944ab7864b8f96157de90d114b7..f414a23cc31369665abd68eb0b69e8b899c95b07 100644 (file)
@@ -92,7 +92,10 @@ class GrouplogoAction extends GroupDesignAction
         if ($groupid) {
             $this->group = User_group::staticGet('id', $groupid);
         } else {
-            $this->group = User_group::staticGet('nickname', $nickname);
+            $local = Local_group::staticGet('nickname', $nickname);
+            if ($local) {
+                $this->group = User_group::staticGet('id', $local->group_id);
+            }
         }
 
         if (!$this->group) {
index f16e972a4194a6eee1a0fd60e2c4fad70881b36d..a16debd7b068ecd4e69deec35d61e42475f83752 100644 (file)
@@ -77,7 +77,14 @@ class GroupmembersAction extends GroupDesignAction
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
+
+        if (!$local) {
+            $this->clientError(_('No such group.'), 404);
+            return false;
+        }
+
+        $this->group = User_group::staticGet('id', $local->group_id);
 
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
index 866fc66eb117685ef60c8ee6b21563d594097e63..490f6f945cac57b509f968b3f771aea5b3f3c5c5 100644 (file)
@@ -92,7 +92,14 @@ class groupRssAction extends Rss10Action
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
+
+        if (!$local) {
+            $this->clientError(_('No such group.'), 404);
+            return false;
+        }
+
+        $this->group = User_group::staticGet('id', $local->group_id);
 
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
index 10a1d5964d374ac2d18118223b3f297ca5211ed5..8aacff8b0ecd1cd2efe86de5b35a6a7b90312f03 100644 (file)
@@ -109,17 +109,21 @@ class GroupsAction extends Action
         }
 
         $offset = ($this->page-1) * GROUPS_PER_PAGE;
-        $limit =  GROUPS_PER_PAGE + 1;
+        $limit  = GROUPS_PER_PAGE + 1;
+
+        $qry = 'SELECT user_group.* '.
+          'from user_group join local_group on user_group.id = local_group.group_id '.
+          'order by user_group.created desc '.
+          'limit ' . $limit . ' offset ' . $offset;
 
         $groups = new User_group();
-        $groups->orderBy('created DESC');
-        $groups->limit($offset, $limit);
 
         $cnt = 0;
-        if ($groups->find()) {
-            $gl = new GroupList($groups, null, $this);
-            $cnt = $gl->show();
-        }
+
+        $groups->query($qry);
+
+        $gl = new GroupList($groups, null, $this);
+        $cnt = $gl->show();
 
         $this->pagination($this->page > 1, $cnt > GROUPS_PER_PAGE,
                           $this->page, 'groups');
diff --git a/actions/hcard.php b/actions/hcard.php
new file mode 100644 (file)
index 0000000..55d0f65
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Show the user's hcard
+ *
+ * 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  Personal
+ * @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/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * User profile page
+ *
+ * @category Personal
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class HcardAction extends Action
+{
+    var $user;
+    var $profile;
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $nickname_arg = $this->arg('nickname');
+        $nickname     = common_canonical_nickname($nickname_arg);
+
+        // Permanent redirect on non-canonical nickname
+
+        if ($nickname_arg != $nickname) {
+            $args = array('nickname' => $nickname);
+            common_redirect(common_local_url('hcard', $args), 301);
+            return false;
+        }
+
+        $this->user = User::staticGet('nickname', $nickname);
+
+        if (!$this->user) {
+            $this->clientError(_('No such user.'), 404);
+            return false;
+        }
+
+        $this->profile = $this->user->getProfile();
+
+        if (!$this->profile) {
+            $this->serverError(_('User has no profile.'));
+            return false;
+        }
+
+        return true;
+    }
+
+    function handle($args)
+    {
+        parent::handle($args);
+        $this->showPage();
+    }
+
+    function title()
+    {
+        return $this->profile->getBestName();
+    }
+
+    function showContent()
+    {
+        $up = new ShortUserProfile($this, $this->user, $this->profile);
+        $up->show();
+    }
+
+    function showHeader()
+    {
+        return;
+    }
+
+    function showAside()
+    {
+        return;
+    }
+
+    function showSecondaryNav()
+    {
+        return;
+    }
+}
+
+class ShortUserProfile extends UserProfile
+{
+    function showEntityActions()
+    {
+        return;
+    }
+}
\ 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 235e5ab4c2c8ea792de834ce745079bd7c7dc45c..f87e5dae294a281480fbd626026ce0a1a9f75f93 100644 (file)
@@ -62,23 +62,33 @@ class JoingroupAction extends Action
         }
 
         $nickname_arg = $this->trimmed('nickname');
-        $nickname = common_canonical_nickname($nickname_arg);
+        $id = intval($this->arg('id'));
+        if ($id) {
+            $this->group = User_group::staticGet('id', $id);
+        } else if ($nickname_arg) {
+            $nickname = common_canonical_nickname($nickname_arg);
+
+            // Permanent redirect on non-canonical nickname
+
+            if ($nickname_arg != $nickname) {
+                $args = array('nickname' => $nickname);
+                common_redirect(common_local_url('leavegroup', $args), 301);
+                return false;
+            }
 
-        // Permanent redirect on non-canonical nickname
+            $local = Local_group::staticGet('nickname', $nickname);
 
-        if ($nickname_arg != $nickname) {
-            $args = array('nickname' => $nickname);
-            common_redirect(common_local_url('joingroup', $args), 301);
-            return false;
-        }
+            if (!$local) {
+                $this->clientError(_('No such group.'), 404);
+                return false;
+            }
 
-        if (!$nickname) {
-            $this->clientError(_('No nickname.'), 404);
+            $this->group = User_group::staticGet('id', $local->group_id);
+        } else {
+            $this->clientError(_('No nickname or ID.'), 404);
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
-
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
             return false;
index 9b9d83b6caae243befbd9e43a43eb6b137be53f5..329b5aafe1e87a306b515c889b52d906155b2aec 100644 (file)
@@ -62,23 +62,33 @@ class LeavegroupAction extends Action
         }
 
         $nickname_arg = $this->trimmed('nickname');
-        $nickname = common_canonical_nickname($nickname_arg);
+        $id = intval($this->arg('id'));
+        if ($id) {
+            $this->group = User_group::staticGet('id', $id);
+        } else if ($nickname_arg) {
+            $nickname = common_canonical_nickname($nickname_arg);
+
+            // Permanent redirect on non-canonical nickname
+
+            if ($nickname_arg != $nickname) {
+                $args = array('nickname' => $nickname);
+                common_redirect(common_local_url('leavegroup', $args), 301);
+                return false;
+            }
 
-        // Permanent redirect on non-canonical nickname
+            $local = Local_group::staticGet('nickname', $nickname);
 
-        if ($nickname_arg != $nickname) {
-            $args = array('nickname' => $nickname);
-            common_redirect(common_local_url('leavegroup', $args), 301);
-            return false;
-        }
+            if (!$local) {
+                $this->clientError(_('No such group.'), 404);
+                return false;
+            }
 
-        if (!$nickname) {
-            $this->clientError(_('No nickname.'), 404);
+            $this->group = User_group::staticGet('id', $local->group_id);
+        } else {
+            $this->clientError(_('No nickname or ID.'), 404);
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
-
         if (!$this->group) {
             $this->clientError(_('No such group.'), 404);
             return false;
index 25da7f8fc75ebcf679c88bb83bd4d8e9f94571fe..75bc293ec63e15e4df92af789e115e8a997b2cc2 100644 (file)
@@ -180,6 +180,8 @@ class NewgroupAction extends Action
             }
         }
 
+        $mainpage = common_local_url('showgroup', array('nickname' => $nickname));
+
         $cur = common_current_user();
 
         // Checked in prepare() above
@@ -192,16 +194,18 @@ class NewgroupAction extends Action
                                             'description' => $description,
                                             'location' => $location,
                                             'aliases'  => $aliases,
-                                            'userid'   => $cur->id));
+                                            'userid'   => $cur->id,
+                                            'mainpage' => $mainpage,
+                                            'local'    => true));
 
         common_redirect($group->homeUrl(), 303);
     }
 
     function nicknameExists($nickname)
     {
-        $group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
 
-        if (!empty($group)) {
+        if (!empty($local)) {
             return true;
         }
 
index 78480ababb069849508550141ee4c5df9862b78c..ed0fa1b2b5768026e486196d0112a2c46af3f54e 100644 (file)
@@ -294,6 +294,9 @@ class NewnoticeAction extends Action
             if ($profile) {
                 $content = '@' . $profile->nickname . ' ';
             }
+        } else {
+            // @fixme most of these bits above aren't being passed on above
+            $inreplyto = null;
         }
 
         $notice_form = new NoticeForm($this, '', $content, null, $inreplyto);
index fb0670376651ed145b0ea8ea7673eb3f7e07d30a..b2f6f1bb95debe9a57e441bbdc07a96c8a37447e 100644 (file)
@@ -54,7 +54,10 @@ class PostnoticeAction extends Action
      */
     function prepare($argarray)
     {
+        StatusNet::setApi(true); // Send smaller error pages
+
         parent::prepare($argarray);
+
         try {
             $this->checkNotice();
         } catch (Exception $e) {
@@ -71,6 +74,14 @@ class PostnoticeAction extends Action
             $srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
                                             omb_oauth_server());
             $srv->handlePostNotice();
+        } catch (OMB_RemoteServiceException $rse) {
+            $msg = $rse->getMessage();
+            if (preg_match('/Revoked accesstoken/', $msg) ||
+                preg_match('/No subscriber/', $msg)) {
+                $this->clientError($msg, 403);
+            } else {
+                $this->clientError($msg);
+            }
         } catch (Exception $e) {
             $this->serverError($e->getMessage());
             return;
index 0d6777879193af2e9d66e662a3737ebd396fc062..161e35b111f450ed7ce14ef5d3e94f79bac9e0f3 100644 (file)
@@ -285,6 +285,10 @@ class ProfilesettingsAction extends AccountSettingsAction
                 } else {
                     // Re-initialize language environment if it changed
                     common_init_language();
+                    // Clear the site owner, in case nickname changed
+                    if ($user->hasRole(Profile_role::OWNER)) {
+                        User::blow('user:site_owner');
+                    }
                 }
             }
 
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 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 eb12389029a096dd0373ae7ed523ddc517092d62..4e1fcb6c7b1cb86b253870a3d50c1fb998054ea6 100644 (file)
@@ -122,9 +122,9 @@ class ShowgroupAction extends GroupDesignAction
             return false;
         }
 
-        $this->group = User_group::staticGet('nickname', $nickname);
+        $local = Local_group::staticGet('nickname', $nickname);
 
-        if (!$this->group) {
+        if (!$local) {
             $alias = Group_alias::staticGet('alias', $nickname);
             if ($alias) {
                 $args = array('id' => $alias->group_id);
@@ -134,11 +134,19 @@ class ShowgroupAction extends GroupDesignAction
                 common_redirect(common_local_url('groupbyid', $args), 301);
                 return false;
             } else {
+                common_log(LOG_NOTICE, "Couldn't find local group for nickname '$nickname'");
                 $this->clientError(_('No such group.'), 404);
                 return false;
             }
         }
 
+        $this->group = User_group::staticGet('id', $local->group_id);
+
+        if (!$this->group) {
+            $this->clientError(_('No such group.'), 404);
+            return false;
+        }
+
         common_set_returnto($this->selfUrl());
 
         return true;
index a90d7facdfaca15e60c16d03c376833af228d448..b1243f393333fdea7245bead2c7c1bda9738e982 100644 (file)
@@ -1,7 +1,9 @@
 <?php
-/*
+/**
  * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
+ * Copyright (C) 2008-2010, StatusNet, Inc.
+ *
+ * Subscription action.
  *
  * 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
  *
  * 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/>.
+ *
+ * PHP version 5
+ *
+ * @category  Action
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Subscription action
+ *
+ * Subscribing to a profile. Does not work for OMB 0.1 remote subscriptions,
+ * but may work for other remote subscription protocols, like OStatus.
+ *
+ * Takes parameters:
+ *
+ *    - subscribeto: a profile ID
+ *    - token: session token to prevent CSRF attacks
+ *    - ajax: boolean; whether to return Ajax or full-browser results
+ *
+ * Only works if the current user is logged in.
+ *
+ * @category  Action
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://status.net/
+ */
 
 class SubscribeAction extends Action
 {
+    var $user;
+    var $other;
 
-    function handle($args)
-    {
-        parent::handle($args);
+    /**
+     * Check pre-requisites and instantiate attributes
+     *
+     * @param Array $args array of arguments (URL, GET, POST)
+     *
+     * @return boolean success flag
+     */
 
-        if (!common_logged_in()) {
-            $this->clientError(_('Not logged in.'));
-            return;
-        }
+    function prepare($args)
+    {
+        parent::prepare($args);
 
-        $user = common_current_user();
+        // Only allow POST requests
 
         if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
-            return;
+            $this->clientError(_('This action only accepts POST requests.'));
+            return false;
         }
 
-        # CSRF protection
+        // CSRF protection
 
         $token = $this->trimmed('token');
 
         if (!$token || $token != common_session_token()) {
-            $this->clientError(_('There was a problem with your session token. Try again, please.'));
-            return;
+            $this->clientError(_('There was a problem with your session token.'.
+                                 ' Try again, please.'));
+            return false;
+        }
+
+        // Only for logged-in users
+
+        $this->user = common_current_user();
+
+        if (empty($this->user)) {
+            $this->clientError(_('Not logged in.'));
+            return false;
         }
 
+        // Profile to subscribe to
+
         $other_id = $this->arg('subscribeto');
 
-        $other = User::staticGet('id', $other_id);
+        $this->other = Profile::staticGet('id', $other_id);
 
-        if (!$other) {
-            $this->clientError(_('Not a local user.'));
-            return;
+        if (empty($this->other)) {
+            $this->clientError(_('No such profile.'));
+            return false;
         }
 
-        $result = subs_subscribe_to($user, $other);
+        // OMB 0.1 doesn't have a mechanism for local-server-
+        // originated subscription.
+
+        $omb01 = Remote_profile::staticGet('id', $other_id);
 
-        if (is_string($result)) {
-            $this->clientError($result);
-            return;
+        if (!empty($omb01)) {
+            $this->clientError(_('You cannot subscribe to an OMB 0.1'.
+                                 ' remote profile with this action.'));
+            return false;
         }
 
+        return true;
+    }
+
+    /**
+     * Handle request
+     *
+     * Does the subscription and returns results.
+     *
+     * @param Array $args unused.
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        // Throws exception on error
+
+        Subscription::start($this->user->getProfile(),
+                            $this->other);
+
         if ($this->boolean('ajax')) {
             $this->startHTML('text/xml;charset=utf-8');
             $this->elementStart('head');
             $this->element('title', null, _('Subscribed'));
             $this->elementEnd('head');
             $this->elementStart('body');
-            $unsubscribe = new UnsubscribeForm($this, $other->getProfile());
+            $unsubscribe = new UnsubscribeForm($this, $this->other);
             $unsubscribe->show();
             $this->elementEnd('body');
             $this->elementEnd('html');
         } else {
-            common_redirect(common_local_url('subscriptions', array('nickname' =>
-                                                                $user->nickname)),
-                            303);
+            $url = common_local_url('subscriptions',
+                                    array('nickname' => $this->user->nickname));
+            common_redirect($url, 303);
         }
     }
 }
index 0ef31aa9f1d7124b24017f60398ed1e926381db7..ba6171ef4ccc596abc16376f039414db6eb32875 100644 (file)
@@ -79,32 +79,37 @@ class SubscriptionsAction extends GalleryAction
 
     function showContent()
     {
-        parent::showContent();
+        if (Event::handle('StartShowSubscriptionsContent', array($this))) {
+            parent::showContent();
 
-        $offset = ($this->page-1) * PROFILES_PER_PAGE;
-        $limit =  PROFILES_PER_PAGE + 1;
+            $offset = ($this->page-1) * PROFILES_PER_PAGE;
+            $limit =  PROFILES_PER_PAGE + 1;
 
-        $cnt = 0;
+            $cnt = 0;
 
-        if ($this->tag) {
-            $subscriptions = $this->user->getTaggedSubscriptions($this->tag, $offset, $limit);
-        } else {
-            $subscriptions = $this->user->getSubscriptions($offset, $limit);
-        }
+            if ($this->tag) {
+                $subscriptions = $this->user->getTaggedSubscriptions($this->tag, $offset, $limit);
+            } else {
+                $subscriptions = $this->user->getSubscriptions($offset, $limit);
+            }
 
-        if ($subscriptions) {
-            $subscriptions_list = new SubscriptionsList($subscriptions, $this->user, $this);
-            $cnt = $subscriptions_list->show();
-            if (0 == $cnt) {
-                $this->showEmptyListMessage();
+            if ($subscriptions) {
+                $subscriptions_list = new SubscriptionsList($subscriptions, $this->user, $this);
+                $cnt = $subscriptions_list->show();
+                if (0 == $cnt) {
+                    $this->showEmptyListMessage();
+                }
             }
-        }
 
-        $subscriptions->free();
+            $subscriptions->free();
+
+            $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
+                              $this->page, 'subscriptions',
+                              array('nickname' => $this->user->nickname));
 
-        $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
-                          $this->page, 'subscriptions',
-                          array('nickname' => $this->user->nickname));
+
+            Event::handle('EndShowSubscriptionsContent', array($this));
+        }
     }
 
     function showScripts()
index 5daf0a1c1ddaf53f083d42213b90950f3c7976dd..4e428dfa580ef5b70481a37894fb6448766683dd 100644 (file)
@@ -66,10 +66,12 @@ class SupAction extends Action
         $divider = common_sql_date(time() - $seconds);
 
         $notice->query('SELECT profile_id, max(id) AS max_id ' .
-                       'FROM notice ' .
+                       'FROM ( ' .
+                       'SELECT profile_id, id FROM notice ' .
                         ((common_config('db','type') == 'pgsql') ?
                        'WHERE extract(epoch from created) > (extract(epoch from now()) - ' . $seconds . ') ' :
                        'WHERE created > "'.$divider.'" ' ) .
+                       ') AS latest ' .
                        'GROUP BY profile_id');
 
         $updates = array();
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 baed2a0c7c24107cb15731489fc312974ea267c6..24aa619bd71ff00abe81b9b7c6fba1f87763e04e 100644 (file)
@@ -31,8 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR.'/lib/api.php';
-
 /**
  * Action for outputting search results in Twitter compatible Atom
  * format.
@@ -245,7 +243,7 @@ class TwitapisearchatomAction extends ApiAction
                              'xmlns:twitter' => 'http://api.twitter.com/',
                              'xml:lang' => 'en-US')); // XXX Other locales ?
 
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $this->element('id', null, "tag:$taguribase:search/$server");
 
         $site_uri = common_path(false);
@@ -329,7 +327,7 @@ class TwitapisearchatomAction extends ApiAction
 
         $this->elementStart('entry');
 
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
 
         $this->element('id', null, "tag:$taguribase:$notice->id");
         $this->element('published', null, common_date_w3dtf($notice->created));
index 741ed78d6388cc19ccfa98979cc5d6a9e601341e..b5c006aa7b9f85f86463b30e9cb61dbcbccc54f6 100644 (file)
@@ -31,7 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR.'/lib/api.php';
 require_once INSTALLDIR.'/lib/jsonsearchresultslist.php';
 
 /**
index 779405e6d64c7a41d2e88f77e9a0915691ca5350..5a04569a22d8d8fbb3d474ee83bbd378678912cc 100644 (file)
@@ -31,8 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR.'/lib/api.php';
-
 /**
  *  Returns the top ten queries that are currently trending
  *
index e416a6fa93dbd881ab152249d1abed50dfd2ff52..bae6108cced4e0647982e4b579705ff48ba938c1 100644 (file)
@@ -55,6 +55,8 @@ class UpdateprofileAction extends Action
      */
     function prepare($argarray)
     {
+        StatusNet::setApi(true); // Send smaller error pages
+
         parent::prepare($argarray);
         $license      = $_POST['omb_listenee_license'];
         $site_license = common_config('license', 'url');
@@ -75,6 +77,14 @@ class UpdateprofileAction extends Action
             $srv = new OMB_Service_Provider(null, omb_oauth_datastore(),
                                             omb_oauth_server());
             $srv->handleUpdateProfile();
+        } catch (OMB_RemoteServiceException $rse) {
+            $msg = $rse->getMessage();
+            if (preg_match('/Revoked accesstoken/', $msg) ||
+                preg_match('/No subscriber/', $msg)) {
+                $this->clientError($msg, 403);
+            } else {
+                $this->clientError($msg);
+            }
         } catch (Exception $e) {
             $this->serverError($e->getMessage());
             return;
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 8113c8e1668a508251323f117468da25d119f7f6..a04f15e9c4e63cb1ddc0a0dc606eaa00dc355ccc 100644 (file)
@@ -21,17 +21,47 @@ class Fave extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-    static function addNew($user, $notice) {
-        $fave = new Fave();
-        $fave->user_id = $user->id;
-        $fave->notice_id = $notice->id;
-        if (!$fave->insert()) {
-            common_log_db_error($fave, 'INSERT', __FILE__);
-            return false;
+    static function addNew($profile, $notice) {
+
+        $fave = null;
+
+        if (Event::handle('StartFavorNotice', array($profile, $notice, &$fave))) {
+
+            $fave = new Fave();
+
+            $fave->user_id   = $profile->id;
+            $fave->notice_id = $notice->id;
+
+            if (!$fave->insert()) {
+                common_log_db_error($fave, 'INSERT', __FILE__);
+                return false;
+            }
+
+            Event::handle('EndFavorNotice', array($profile, $notice));
         }
+
         return $fave;
     }
 
+    function delete()
+    {
+        $profile = Profile::staticGet('id', $this->user_id);
+        $notice  = Notice::staticGet('id', $this->notice_id);
+
+        $result = null;
+
+        if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) {
+
+            $result = parent::delete();
+
+            if ($result) {
+                Event::handle('EndDisfavorNotice', array($profile, $notice));
+            }
+        }
+
+        return $result;
+    }
+
     function pkeyGet($kv)
     {
         return Memcached_DataObject::pkeyGet('Fave', $kv);
@@ -47,7 +77,7 @@ class Fave extends Memcached_DataObject
         return $ids;
     }
 
-    function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id, $since)
+    function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id)
     {
         $fav = new Fave();
         $qry = null;
@@ -70,10 +100,6 @@ class Fave extends Memcached_DataObject
             $qry .= 'AND notice_id <= ' . $max_id . ' ';
         }
 
-        if (!is_null($since)) {
-            $qry .= 'AND modified > \'' . date('Y-m-d H:i:s', $since) . '\' ';
-        }
-
         // NOTE: we sort by fave time, not by notice time!
 
         $qry .= 'ORDER BY modified DESC ';
index 189e04ce021d77dc74a29ee14dbb64df118b4c2e..79a7d6681334e881144a3194fe567ea8a2ae3201 100644 (file)
@@ -169,7 +169,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));
index be62611a16504416675d474e6d1920d6d6080273..014ba3d82923efb70d07fe0b70137fba726ee99c 100644 (file)
@@ -137,7 +137,7 @@ class Inbox extends Memcached_DataObject
         }
     }
 
-    function stream($user_id, $offset, $limit, $since_id, $max_id, $since, $own=false)
+    function stream($user_id, $offset, $limit, $since_id, $max_id, $own=false)
     {
         $inbox = Inbox::staticGet('user_id', $user_id);
 
@@ -195,15 +195,15 @@ class Inbox extends Memcached_DataObject
      * @param int $limit
      * @param mixed $since_id return only notices after but not including this id
      * @param mixed $max_id return only notices up to and including this id
-     * @param mixed $since obsolete/ignored
      * @param mixed $own ignored?
      * @return array of Notice objects
      *
      * @todo consider repacking the inbox when this happens?
+     * @fixme reimplement $own if we need it?
      */
-    function streamNotices($user_id, $offset, $limit, $since_id, $max_id, $since, $own=false)
+    function streamNotices($user_id, $offset, $limit, $since_id, $max_id, $own=false)
     {
-        $ids = self::stream($user_id, $offset, self::MAX_NOTICES, $since_id, $max_id, $since, $own);
+        $ids = self::stream($user_id, $offset, self::MAX_NOTICES, $since_id, $max_id, $own);
 
         // Do a bulk lookup for the first $limit items
         // Fast path when nothing's deleted.
diff --git a/classes/Local_group.php b/classes/Local_group.php
new file mode 100644 (file)
index 0000000..42312ec
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Table Definition for local_group
+ */
+
+class Local_group extends Memcached_DataObject
+{
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'local_group';                     // table name
+    public $group_id;                        // int(4)  primary_key not_null
+    public $nickname;                        // varchar(64)  unique_key
+    public $created;                         // datetime   not_null default_0000-00-00%2000%3A00%3A00
+    public $modified;                        // timestamp   not_null default_CURRENT_TIMESTAMP
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Local_group',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    function sequenceKey()
+    {
+        return array(false, false, false);
+    }
+
+    function setNickname($nickname)
+    {
+        $this->decache();
+        $qry = 'UPDATE local_group set nickname = "'.$nickname.'" where group_id = ' . $this->group_id;
+
+        $result = $this->query($qry);
+
+        if ($result) {
+            $this->nickname = $nickname;
+            $this->fixupTimestamps();
+            $this->encache();
+        } else {
+            common_log_db_error($local, 'UPDATE', __FILE__);
+            throw new ServerException(_('Could not update local group.'));
+        }
+
+        return $result;
+    }
+}
index 40576dc71783aedda343e8ea25414b11f777e70e..bc4c3a000ce11a732bc495e878fc018854dcd79d 100644 (file)
@@ -501,7 +501,11 @@ class Memcached_DataObject extends Safe_DataObject
 
     function raiseError($message, $type = null, $behaviour = null)
     {
-        throw new ServerException("DB_DataObject error [$type]: $message");
+        $id = get_class($this);
+        if ($this->id) {
+            $id .= ':' . $this->id;
+        }
+        throw new ServerException("[$id] DB_DataObject error [$type]: $message");
     }
 
     static function cacheGet($keyPart)
index b0edb6de60053500ec34c01fbf686a4f8da64cf4..63dc9689727cdc41920c3f45fae26434d90884e0 100644 (file)
@@ -121,6 +121,9 @@ class Notice extends Memcached_DataObject
         $result = parent::delete();
     }
 
+    /**
+     * Extract #hashtags from this notice's content and save them to the database.
+     */
     function saveTags()
     {
         /* extract all #hastags */
@@ -129,14 +132,22 @@ class Notice extends Memcached_DataObject
             return true;
         }
 
+        /* Add them to the database */
+        return $this->saveKnownTags($match[1]);
+    }
+
+    /**
+     * Record the given set of hash tags in the db for this notice.
+     * Given tag strings will be normalized and checked for dupes.
+     */
+    function saveKnownTags($hashtags)
+    {
         //turn each into their canonical tag
         //this is needed to remove dupes before saving e.g. #hash.tag = #hashtag
-        $hashtags = array();
-        for($i=0; $i<count($match[1]); $i++) {
-            $hashtags[] = common_canonical_tag($match[1][$i]);
+        for($i=0; $i<count($hashtags); $i++) {
+            $hashtags[$i] = common_canonical_tag($hashtags[$i]);
         }
 
-        /* Add them to the database */
         foreach(array_unique($hashtags) as $hashtag) {
             /* elide characters we don't want in the tag */
             $this->saveTag($hashtag);
@@ -145,6 +156,10 @@ class Notice extends Memcached_DataObject
         return true;
     }
 
+    /**
+     * Record a single hash tag as associated with this notice.
+     * Tag format and uniqueness must be validated by caller.
+     */
     function saveTag($hashtag)
     {
         $tag = new Notice_tag();
@@ -187,13 +202,23 @@ class Notice extends Memcached_DataObject
      *              int 'location_ns' geoname namespace to interpret location_id
      *              int 'reply_to'; notice ID this is a reply to
      *              int 'repeat_of'; notice ID this is a repeat of
-     *              string 'uri' permalink to notice; defaults to local notice URL
+     *              string 'uri' unique ID for notice; defaults to local notice URL
+     *              string 'url' permalink to notice; defaults to local notice URL
+     *              string 'rendered' rendered HTML version of content
+     *              array 'replies' list of profile URIs for reply delivery in
+     *                              place of extracting @-replies from content.
+     *              array 'groups' list of group IDs to deliver to, in place of
+     *                              extracting ! tags from content
+     *              array 'tags' list of hashtag strings to save with the notice
+     *                           in place of extracting # tags from content
+     * @fixme tag override
      *
      * @return Notice
      * @throws ClientException
      */
     static function saveNew($profile_id, $content, $source, $options=null) {
         $defaults = array('uri' => null,
+                          'url' => null,
                           'reply_to' => null,
                           'repeat_of' => null);
 
@@ -256,9 +281,10 @@ class Notice extends Memcached_DataObject
         }
 
         $notice->content = $final;
-        $notice->rendered = common_render_content($final, $notice);
+
         $notice->source = $source;
         $notice->uri = $uri;
+        $notice->url = $url;
 
         // Handle repeat case
 
@@ -283,6 +309,12 @@ class Notice extends Memcached_DataObject
             $notice->location_ns = $location_ns;
         }
 
+        if (!empty($rendered)) {
+            $notice->rendered = $rendered;
+        } else {
+            $notice->rendered = common_render_content($final, $notice);
+        }
+
         if (Event::handle('StartNoticeSave', array(&$notice))) {
 
             // XXX: some of these functions write to the DB
@@ -325,8 +357,33 @@ class Notice extends Memcached_DataObject
 
         # Clear the cache for subscribed users, so they'll update at next request
         # XXX: someone clever could prepend instead of clearing the cache
+
         $notice->blowOnInsert();
 
+        // Save per-notice metadata...
+
+        if (isset($replies)) {
+            $notice->saveKnownReplies($replies);
+        } else {
+            $notice->saveReplies();
+        }
+
+        if (isset($groups)) {
+            $notice->saveKnownGroups($groups);
+        } else {
+            $notice->saveGroups();
+        }
+
+        if (isset($tags)) {
+            $notice->saveKnownTags($tags);
+        } else {
+            $notice->saveTags();
+        }
+
+        // @fixme pass in data for URLs too?
+        $notice->saveUrls();
+
+        // Prepare inbox delivery, may be queued to background.
         $notice->distribute();
 
         return $notice;
@@ -502,17 +559,17 @@ class Notice extends Memcached_DataObject
         }
     }
 
-    function publicStream($offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
+    function publicStream($offset=0, $limit=20, $since_id=0, $max_id=0)
     {
         $ids = Notice::stream(array('Notice', '_publicStreamDirect'),
                               array(),
                               'public',
-                              $offset, $limit, $since_id, $max_id, $since);
+                              $offset, $limit, $since_id, $max_id);
 
         return Notice::getStreamByIds($ids);
     }
 
-    function _publicStreamDirect($offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
+    function _publicStreamDirect($offset=0, $limit=20, $since_id=0, $max_id=0)
     {
         $notice = new Notice();
 
@@ -541,10 +598,6 @@ class Notice extends Memcached_DataObject
             $notice->whereAdd('id <= ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $ids = array();
 
         if ($notice->find()) {
@@ -559,17 +612,17 @@ class Notice extends Memcached_DataObject
         return $ids;
     }
 
-    function conversationStream($id, $offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
+    function conversationStream($id, $offset=0, $limit=20, $since_id=0, $max_id=0)
     {
         $ids = Notice::stream(array('Notice', '_conversationStreamDirect'),
                               array($id),
                               'notice:conversation_ids:'.$id,
-                              $offset, $limit, $since_id, $max_id, $since);
+                              $offset, $limit, $since_id, $max_id);
 
         return Notice::getStreamByIds($ids);
     }
 
-    function _conversationStreamDirect($id, $offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
+    function _conversationStreamDirect($id, $offset=0, $limit=20, $since_id=0, $max_id=0)
     {
         $notice = new Notice();
 
@@ -592,10 +645,6 @@ class Notice extends Memcached_DataObject
             $notice->whereAdd('id <= ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $ids = array();
 
         if ($notice->find()) {
@@ -677,11 +726,39 @@ class Notice extends Memcached_DataObject
         return $ni;
     }
 
-    function addToInboxes($groups, $recipients)
+    /**
+     * Adds this notice to the inboxes of each local user who should receive
+     * it, based on author subscriptions, group memberships, and @-replies.
+     *
+     * Warning: running a second time currently will make items appear
+     * multiple times in users' inboxes.
+     *
+     * @fixme make more robust against errors
+     * @fixme break up massive deliveries to smaller background tasks
+     *
+     * @param array $groups optional list of Group objects;
+     *              if left empty, will be loaded from group_inbox records
+     * @param array $recipient optional list of reply profile ids
+     *              if left empty, will be loaded from reply records
+     */
+    function addToInboxes($groups=null, $recipients=null)
     {
         $ni = $this->whoGets($groups, $recipients);
 
-        Inbox::bulkInsert($this->id, array_keys($ni));
+        $ids = array_keys($ni);
+
+        // We remove the author (if they're a local user),
+        // since we'll have already done this in distribute()
+
+        $i = array_search($this->profile_id, $ids);
+
+        if ($i !== false) {
+            unset($ids[$i]);
+        }
+
+        // Bulk insert
+
+        Inbox::bulkInsert($this->id, $ids);
 
         return;
     }
@@ -714,6 +791,42 @@ class Notice extends Memcached_DataObject
     }
 
     /**
+     * Record this notice to the given group inboxes for delivery.
+     * Overrides the regular parsing of !group markup.
+     *
+     * @param string $group_ids
+     * @fixme might prefer URIs as identifiers, as for replies?
+     *        best with generalizations on user_group to support
+     *        remote groups better.
+     */
+    function saveKnownGroups($group_ids)
+    {
+        if (!is_array($group_ids)) {
+            throw new ServerException("Bad type provided to saveKnownGroups");
+        }
+
+        $groups = array();
+        foreach ($group_ids as $id) {
+            $group = User_group::staticGet('id', $id);
+            if ($group) {
+                common_log(LOG_ERR, "Local delivery to group id $id, $group->nickname");
+                $result = $this->addToGroupInbox($group);
+                if (!$result) {
+                    common_log_db_error($gi, 'INSERT', __FILE__);
+                }
+
+                // @fixme should we save the tags here or not?
+                $groups[] = clone($group);
+            } else {
+                common_log(LOG_ERR, "Local delivery to group id $id skipped, doesn't exist");
+            }
+        }
+
+        return $groups;
+    }
+
+    /**
+     * Parse !group delivery and record targets into group_inbox.
      * @return array of Group objects
      */
     function saveGroups()
@@ -797,8 +910,51 @@ class Notice extends Memcached_DataObject
     }
 
     /**
+     * Save reply records indicating that this notice needs to be
+     * delivered to the local users with the given URIs.
+     *
+     * Since this is expected to be used when saving foreign-sourced
+     * messages, we won't deliver to any remote targets as that's the
+     * source service's responsibility.
+     *
+     * @fixme Unlike saveReplies() there's no mail notification here.
+     *        Move that to distrib queue handler?
+     *
+     * @param array of unique identifier URIs for recipients
+     */
+    function saveKnownReplies($uris)
+    {
+        foreach ($uris as $uri) {
+
+            $user = User::staticGet('uri', $uri);
+
+            if (!empty($user)) {
+
+                $reply = new Reply();
+
+                $reply->notice_id  = $this->id;
+                $reply->profile_id = $user->id;
+
+                $id = $reply->insert();
+
+                self::blow('reply:stream:%d', $user->id);
+            }
+        }
+
+        return;
+    }
+
+    /**
+     * Pull @-replies from this message's content in StatusNet markup format
+     * and save reply records indicating that this message needs to be
+     * delivered to those users.
+     *
+     * Side effect: local recipients get e-mail notifications here.
+     * @fixme move mail notifications to distrib?
+     *
      * @return array of integer profile IDs
      */
+
     function saveReplies()
     {
         // Don't save reply data for repeats
@@ -807,76 +963,47 @@ class Notice extends Memcached_DataObject
             return array();
         }
 
-        // Alternative reply format
-        $tname = false;
-        if (preg_match('/^T ([A-Z0-9]{1,64}) /', $this->content, $match)) {
-            $tname = $match[1];
-        }
-        // extract all @messages
-        $cnt = preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $this->content, $match);
+        $sender = Profile::staticGet($this->profile_id);
 
-        $names = array();
+        // @todo ideally this parser information would only
+        // be calculated once.
 
-        if ($cnt || $tname) {
-            // XXX: is there another way to make an array copy?
-            $names = ($tname) ? array_unique(array_merge(array(strtolower($tname)), $match[1])) : array_unique($match[1]);
-        }
-
-        $sender = Profile::staticGet($this->profile_id);
+        $mentions = common_find_mentions($this->content, $this);
 
         $replied = array();
 
         // store replied only for first @ (what user/notice what the reply directed,
         // we assume first @ is it)
 
-        for ($i=0; $i<count($names); $i++) {
-            $nickname = $names[$i];
-            $recipient = common_relative_profile($sender, $nickname, $this->created);
-            if (empty($recipient)) {
-                continue;
-            }
-            // Don't save replies from blocked profile to local user
-            $recipient_user = User::staticGet('id', $recipient->id);
-            if (!empty($recipient_user) && $recipient_user->hasBlocked($sender)) {
-                continue;
-            }
-            $reply = new Reply();
-            $reply->notice_id = $this->id;
-            $reply->profile_id = $recipient->id;
-            $id = $reply->insert();
-            if (!$id) {
-                $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-                common_log(LOG_ERR, 'DB error inserting reply: ' . $last_error->message);
-                common_server_error(sprintf(_('DB error inserting reply: %s'), $last_error->message));
-                return array();
-            } else {
-                $replied[$recipient->id] = 1;
-            }
-        }
+        foreach ($mentions as $mention) {
 
-        // Hash format replies, too
-        $cnt = preg_match_all('/(?:^|\s)@#([a-z0-9]{1,64})/', $this->content, $match);
-        if ($cnt) {
-            foreach ($match[1] as $tag) {
-                $tagged = Profile_tag::getTagged($sender->id, $tag);
-                foreach ($tagged as $t) {
-                    if (!$replied[$t->id]) {
-                        // Don't save replies from blocked profile to local user
-                        $t_user = User::staticGet('id', $t->id);
-                        if ($t_user && $t_user->hasBlocked($sender)) {
-                            continue;
-                        }
-                        $reply = new Reply();
-                        $reply->notice_id = $this->id;
-                        $reply->profile_id = $t->id;
-                        $id = $reply->insert();
-                        if (!$id) {
-                            common_log_db_error($reply, 'INSERT', __FILE__);
-                            return array();
-                        } else {
-                            $replied[$recipient->id] = 1;
-                        }
-                    }
+            foreach ($mention['mentioned'] as $mentioned) {
+
+                // skip if they're already covered
+
+                if (!empty($replied[$mentioned->id])) {
+                    continue;
+                }
+
+                // Don't save replies from blocked profile to local user
+
+                $mentioned_user = User::staticGet('id', $mentioned->id);
+                if (!empty($mentioned_user) && $mentioned_user->hasBlocked($sender)) {
+                    continue;
+                }
+
+                $reply = new Reply();
+
+                $reply->notice_id  = $this->id;
+                $reply->profile_id = $mentioned->id;
+
+                $id = $reply->insert();
+
+                if (!$id) {
+                    common_log_db_error($reply, 'INSERT', __FILE__);
+                    throw new ServerException("Couldn't save reply for {$this->id}, {$mentioned->id}");
+                } else {
+                    $replied[$mentioned->id] = 1;
                 }
             }
         }
@@ -917,9 +1044,10 @@ class Notice extends Memcached_DataObject
     }
 
     /**
-     * Same calculation as saveGroups but without the saving
-     * @fixme merge the functions
-     * @return array of Group_inbox objects
+     * Pull list of groups this notice needs to be delivered to,
+     * as previously recorded by saveGroups() or saveKnownGroups().
+     *
+     * @return array of Group objects
      */
     function getGroups()
     {
@@ -942,7 +1070,10 @@ class Notice extends Memcached_DataObject
 
         if ($gi->find()) {
             while ($gi->fetch()) {
-                $groups[] = clone($gi);
+                $group = User_group::staticGet('id', $gi->group_id);
+                if ($group) {
+                    $groups[] = $group;
+                }
             }
         }
 
@@ -962,6 +1093,8 @@ class Notice extends Memcached_DataObject
                            'xmlns:thr' => 'http://purl.org/syndication/thread/1.0',
                            'xmlns:georss' => 'http://www.georss.org/georss',
                            'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/',
+                           'xmlns:media' => 'http://purl.org/syndication/atommedia',
+                           'xmlns:poco' => 'http://portablecontacts.net/spec/1.0',
                            'xmlns:ostatus' => 'http://ostatus.org/schema/1.0');
         } else {
             $attrs = array();
@@ -993,12 +1126,12 @@ class Notice extends Memcached_DataObject
         }
 
         $xs->element('title', null, $this->content);
-        $xs->element('summary', null, $this->content);
 
         $xs->raw($profile->asAtomAuthor());
         $xs->raw($profile->asActivityActor());
 
         $xs->element('link', array('rel' => 'alternate',
+                                   'type' => 'text/html',
                                    'href' => $this->bestUrl()));
 
         $xs->element('id', null, $this->uri);
@@ -1045,6 +1178,17 @@ class Notice extends Memcached_DataObject
             }
         }
 
+        $groups = $this->getGroups();
+
+        foreach ($groups as $group) {
+            $xs->element(
+                'link', array(
+                    'rel' => 'ostatus:attention',
+                    'href' => $group->permalink()
+                )
+            );
+        }
+
         if (!empty($this->repeat_of)) {
             $repeat = Notice::staticGet('id', $this->repeat_of);
             if (!empty($repeat)) {
@@ -1090,6 +1234,21 @@ class Notice extends Memcached_DataObject
         return $xs->getString();
     }
 
+    /**
+     * Returns an XML string fragment with a reference to a notice as an
+     * Activity Streams noun object with the given element type.
+     *
+     * Assumes that 'activity' namespace has been previously defined.
+     *
+     * @param string $element one of 'subject', 'object', 'target'
+     * @return string
+     */
+    function asActivityNoun($element)
+    {
+        $noun = ActivityObject::fromNotice($this);
+        return $noun->asString('activity:' . $element);
+    }
+
     function bestUrl()
     {
         if (!empty($this->url)) {
@@ -1102,16 +1261,16 @@ class Notice extends Memcached_DataObject
         }
     }
 
-    function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
+    function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $max_id=0)
     {
         $cache = common_memcache();
 
         if (empty($cache) ||
-            $since_id != 0 || $max_id != 0 || (!is_null($since) && $since > 0) ||
+            $since_id != 0 || $max_id != 0 ||
             is_null($limit) ||
             ($offset + $limit) > NOTICE_CACHE_WINDOW) {
             return call_user_func_array($fn, array_merge($args, array($offset, $limit, $since_id,
-                                                                      $max_id, $since)));
+                                                                      $max_id)));
         }
 
         $idkey = common_cache_key($cachekey);
@@ -1487,6 +1646,14 @@ class Notice extends Memcached_DataObject
 
     function distribute()
     {
+        // We always insert for the author so they don't
+        // have to wait
+
+        $user = User::staticGet('id', $this->profile_id);
+        if (!empty($user)) {
+            Inbox::insertNotice($user->id, $this->id);
+        }
+
         if (common_config('queue', 'inboxes')) {
             // If there's a failure, we want to _force_
             // distribution at this point.
index c27dcdfd616079359df0f4db998f7c09ca285537..47ed6b22db628a8baaed7bd797c027ff0d5531fa 100644 (file)
@@ -49,12 +49,12 @@ class Notice_inbox extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-    function stream($user_id, $offset, $limit, $since_id, $max_id, $since, $own=false)
+    function stream($user_id, $offset, $limit, $since_id, $max_id, $own=false)
     {
         throw new Exception('Notice_inbox no longer used; use Inbox');
     }
 
-    function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id, $since)
+    function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id)
     {
         throw new Exception('Notice_inbox no longer used; use Inbox');
     }
index 4fd76e8ea85e8c04c9119b370bf3c89a462d7dec..a5d0716a7136d6b00c073b0679f7afe273340eb0 100644 (file)
@@ -46,7 +46,7 @@ class Notice_tag extends Memcached_DataObject
         return Notice::getStreamByIds($ids);
     }
 
-    function _streamDirect($tag, $offset, $limit, $since_id, $max_id, $since)
+    function _streamDirect($tag, $offset, $limit, $since_id, $max_id)
     {
         $nt = new Notice_tag();
 
@@ -63,10 +63,6 @@ class Notice_tag extends Memcached_DataObject
             $nt->whereAdd('notice_id < ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $nt->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $nt->orderBy('notice_id DESC');
 
         if (!is_null($offset)) {
index 494c697e425fab0fa9726cba9bf0aac41635e2ff..470ef33207da5e7e9a49cb9b1f3768512c0d86d2 100644 (file)
@@ -163,27 +163,27 @@ class Profile extends Memcached_DataObject
         return null;
     }
 
-    function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
+    function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
     {
         $ids = Notice::stream(array($this, '_streamTaggedDirect'),
                               array($tag),
                               'profile:notice_ids_tagged:' . $this->id . ':' . $tag,
-                              $offset, $limit, $since_id, $max_id, $since);
+                              $offset, $limit, $since_id, $max_id);
         return Notice::getStreamByIds($ids);
     }
 
-    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
+    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
     {
         // XXX: I'm not sure this is going to be any faster. It probably isn't.
         $ids = Notice::stream(array($this, '_streamDirect'),
                               array(),
                               'profile:notice_ids:' . $this->id,
-                              $offset, $limit, $since_id, $max_id, $since);
+                              $offset, $limit, $since_id, $max_id);
 
         return Notice::getStreamByIds($ids);
     }
 
-    function _streamTaggedDirect($tag, $offset, $limit, $since_id, $max_id, $since)
+    function _streamTaggedDirect($tag, $offset, $limit, $since_id, $max_id)
     {
         // XXX It would be nice to do this without a join
 
@@ -202,10 +202,6 @@ class Profile extends Memcached_DataObject
             $query .= " and id < $max_id";
         }
 
-        if (!is_null($since)) {
-            $query .= " and created > '" . date('Y-m-d H:i:s', $since) . "'";
-        }
-
         $query .= ' order by id DESC';
 
         if (!is_null($offset)) {
@@ -223,7 +219,7 @@ class Profile extends Memcached_DataObject
         return $ids;
     }
 
-    function _streamDirect($offset, $limit, $since_id, $max_id, $since = null)
+    function _streamDirect($offset, $limit, $since_id, $max_id)
     {
         $notice = new Notice();
 
@@ -240,10 +236,6 @@ class Profile extends Memcached_DataObject
             $notice->whereAdd('id <= ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $notice->orderBy('id DESC');
 
         if (!is_null($offset)) {
@@ -792,44 +784,17 @@ class Profile extends Memcached_DataObject
      * Returns an XML string fragment with profile information as an
      * Activity Streams noun object with the given element type.
      *
-     * Assumes that 'activity' namespace has been previously defined.
+     * Assumes that 'activity', 'georss', and 'poco' namespace has been
+     * previously defined.
      *
      * @param string $element one of 'actor', 'subject', 'object', 'target'
+     *
      * @return string
      */
     function asActivityNoun($element)
     {
-        $xs = new XMLStringer(true);
-
-        $xs->elementStart('activity:' . $element);
-        $xs->element(
-            'activity:object-type',
-            null,
-            'http://activitystrea.ms/schema/1.0/person'
-        );
-        $xs->element(
-            'id',
-            null,
-            $this->getUri()
-            );
-        $xs->element('title', null, $this->getBestName());
-
-        $avatar = $this->getAvatar(AVATAR_PROFILE_SIZE);
-
-        $xs->element(
-            'link', array(
-                'type' => empty($avatar) ? 'image/png' : $avatar->mediatype,
-                'rel'  => 'avatar',
-                'href' => empty($avatar)
-                ? Avatar::defaultImage(AVATAR_PROFILE_SIZE)
-                : $avatar->displayUrl()
-            ),
-            ''
-        );
-
-        $xs->elementEnd('activity:' . $element);
-
-        return $xs->getString();
+        $noun = ActivityObject::fromProfile($this);
+        return $noun->asString('activity:' . $element);
     }
 
     /**
@@ -841,31 +806,37 @@ class Profile extends Memcached_DataObject
     {
         $uri = null;
 
-        // check for a local user first
-        $user = User::staticGet('id', $this->id);
-
-        if (!empty($user)) {
-            $uri = common_local_url(
-                'userbyid',
-                array('id' => $user->id)
-            );
-        } else {
+        // give plugins a chance to set the URI
+        if (Event::handle('StartGetProfileUri', array($this, &$uri))) {
 
-            // give plugins a chance to set the URI
-            if (Event::handle('StartGetProfileUri', array($this, &$uri))) {
+            // check for a local user first
+            $user = User::staticGet('id', $this->id);
 
+            if (!empty($user)) {
+                $uri = $user->uri;
+            } else {
                 // return OMB profile if any
                 $remote = Remote_profile::staticGet('id', $this->id);
-
                 if (!empty($remote)) {
                     $uri = $remote->uri;
                 }
-
-                Event::handle('EndGetProfileUri', array($this, &$uri));
             }
+            Event::handle('EndGetProfileUri', array($this, &$uri));
         }
 
         return $uri;
     }
 
+    function hasBlocked($other)
+    {
+        $block = Profile_block::get($this->id, $other->id);
+
+        if (empty($block)) {
+            $result = false;
+        } else {
+            $result = true;
+        }
+
+        return $result;
+    }
 }
index 49b1e05e517e1bd34bb7645cead3148990f27c0b..659e04c9253934ad82dad90b0cd2ce4d198b32f5 100644 (file)
@@ -22,16 +22,16 @@ class Reply extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-    function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
+    function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
     {
         $ids = Notice::stream(array('Reply', '_streamDirect'),
                               array($user_id),
                               'reply:stream:' . $user_id,
-                              $offset, $limit, $since_id, $max_id, $since);
+                              $offset, $limit, $since_id, $max_id);
         return $ids;
     }
 
-    function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
+    function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
     {
         $reply = new Reply();
         $reply->profile_id = $user_id;
@@ -44,10 +44,6 @@ class Reply extends Memcached_DataObject
             $reply->whereAdd('notice_id < ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $reply->whereAdd('modified > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $reply->orderBy('notice_id DESC');
 
         if (!is_null($offset)) {
index faf1331cda11565eec0655ea4a266079ceca0618..9cef2df1ad7c222d407fc1c3177fd4fdc1f1fa44 100644 (file)
@@ -24,7 +24,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
  */
 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
-class Subscription extends Memcached_DataObject 
+class Subscription extends Memcached_DataObject
 {
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
@@ -34,8 +34,8 @@ class Subscription extends Memcached_DataObject
     public $subscribed;                      // int(4)  primary_key not_null
     public $jabber;                          // tinyint(1)   default_1
     public $sms;                             // tinyint(1)   default_1
-    public $token;                           // varchar(255)  
-    public $secret;                          // varchar(255)  
+    public $token;                           // varchar(255)
+    public $secret;                          // varchar(255)
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
@@ -45,9 +45,177 @@ class Subscription extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-    
+
     function pkeyGet($kv)
     {
         return Memcached_DataObject::pkeyGet('Subscription', $kv);
     }
+
+    /**
+     * Make a new subscription
+     *
+     * @param Profile $subscriber party to receive new notices
+     * @param Profile $other      party sending notices; publisher
+     *
+     * @return Subscription new subscription
+     */
+
+    static function start($subscriber, $other)
+    {
+        if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
+            throw new Exception(_('You have been banned from subscribing.'));
+        }
+
+        if (self::exists($subscriber, $other)) {
+            throw new Exception(_('Already subscribed!'));
+        }
+
+        if ($other->hasBlocked($subscriber)) {
+            throw new Exception(_('User has blocked you.'));
+        }
+
+        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->notify();
+
+            self::blow('user:notices_with_friends:%d', $subscriber->id);
+
+            $subscriber->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
+
+            $otherUser = User::staticGet('id', $other->id);
+
+            if (!empty($otherUser) &&
+                $otherUser->autosubscribe &&
+                !self::exists($other, $subscriber) &&
+                !$subscriber->hasBlocked($other)) {
+
+                $auto = new Subscription();
+
+                $auto->subscriber = $subscriber->id;
+                $auto->subscribed = $other->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.'));
+                }
+
+                $auto->notify();
+            }
+
+            Event::handle('EndSubscribe', array($subscriber, $other));
+        }
+
+        return true;
+    }
+
+    function notify()
+    {
+        # XXX: add other notifications (Jabber, SMS) here
+        # XXX: queue this and handle it offline
+        # XXX: Whatever happens, do it in Twitter-like API, too
+
+        $this->notifyEmail();
+    }
+
+    function notifyEmail()
+    {
+        $subscribedUser = User::staticGet('id', $this->subscribed);
+
+        if (!empty($subscribedUser)) {
+
+            $subscriber = Profile::staticGet('id', $this->subscriber);
+
+            mail_subscribe_notify_profile($subscribedUser, $subscriber);
+        }
+    }
+
+    /**
+     * Cancel a subscription
+     *
+     */
+
+    function cancel($subscriber, $other)
+    {
+        if (!self::exists($subscriber, $other)) {
+            throw new Exception(_('Not subscribed!'));
+        }
+
+        // Don't allow deleting self subs
+
+        if ($subscriber->id == $other->id) {
+            throw new Exception(_('Couldn\'t delete self-subscription.'));
+        }
+
+        if (Event::handle('StartUnsubscribe', array($subscriber, $other))) {
+
+            $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id,
+                                               'subscribed' => $other->id));
+
+            // note we checked for existence above
+
+            assert(!empty($sub));
+
+            // @todo: move this block to EndSubscribe handler for
+            // OMB plugin when it exists.
+
+            if (!empty($sub->token)) {
+
+                $token = new Token();
+
+                $token->tok    = $sub->token;
+
+                if ($token->find(true)) {
+
+                    $result = $token->delete();
+
+                    if (!$result) {
+                        common_log_db_error($token, 'DELETE', __FILE__);
+                        throw new Exception(_('Couldn\'t delete subscription OMB token.'));
+                    }
+                } else {
+                    common_log(LOG_ERR, "Couldn't find credentials with token {$token->tok}");
+                }
+            }
+
+            $result = $sub->delete();
+
+            if (!$result) {
+                common_log_db_error($sub, 'DELETE', __FILE__);
+                throw new Exception(_('Couldn\'t delete subscription.'));
+            }
+
+            self::blow('user:notices_with_friends:%d', $subscriber->id);
+
+            $subscriber->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
+
+            Event::handle('EndUnsubscribe', array($subscriber, $other));
+        }
+
+        return;
+    }
+
+    function exists($subscriber, $other)
+    {
+        $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id,
+                                           'subscribed' => $other->id));
+        return (empty($sub)) ? false : true;
+    }
 }
index 72c3f39e947e507d191bae34a2a9ed1b674e02fa..357c1e501343ed324d3de3eb5aa1780dd394be00 100644 (file)
@@ -80,11 +80,7 @@ class User extends Memcached_DataObject
 
     function isSubscribed($other)
     {
-        assert(!is_null($other));
-        // XXX: cache results of this query
-        $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
-                                           'subscribed' => $other->id));
-        return (is_null($sub)) ? false : true;
+        return Subscription::exists($this->getProfile(), $other);
     }
 
     // 'update' won't write key columns, so we have to do it ourselves.
@@ -167,17 +163,8 @@ class User extends Memcached_DataObject
 
     function hasBlocked($other)
     {
-
-        $block = Profile_block::get($this->id, $other->id);
-
-        if (is_null($block)) {
-            $result = false;
-        } else {
-            $result = true;
-            $block->free();
-        }
-
-        return $result;
+        $profile = $this->getProfile();
+        return $profile->hasBlocked($other);
     }
 
     /**
@@ -219,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);
 
@@ -469,28 +457,28 @@ class User extends Memcached_DataObject
         return $user;
     }
 
-    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        $ids = Reply::stream($this->id, $offset, $limit, $since_id, $before_id, $since);
+        $ids = Reply::stream($this->id, $offset, $limit, $since_id, $before_id);
         return Notice::getStreamByIds($ids);
     }
 
-    function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) {
+    function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
         $profile = $this->getProfile();
         if (!$profile) {
             return null;
         } else {
-            return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id, $since);
+            return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id);
         }
     }
 
-    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
         $profile = $this->getProfile();
         if (!$profile) {
             return null;
         } else {
-            return $profile->getNotices($offset, $limit, $since_id, $before_id, $since);
+            return $profile->getNotices($offset, $limit, $since_id, $before_id);
         }
     }
 
@@ -500,24 +488,24 @@ class User extends Memcached_DataObject
         return Notice::getStreamByIds($ids);
     }
 
-    function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, $since, false);
+        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, false);
     }
 
-    function noticeInbox($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function noticeInbox($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, $since, true);
+        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, true);
     }
 
-    function friendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function friendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, $since, false);
+        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, false);
     }
 
-    function ownFriendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
+    function ownFriendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, $since, true);
+        return Inbox::streamNotices($this->id, $offset, $limit, $since_id, $before_id, true);
     }
 
     function blowFavesCache()
@@ -802,7 +790,7 @@ class User extends Memcached_DataObject
         return Notice::getStreamByIds($ids);
     }
 
-    function _repeatedByMeDirect($offset, $limit, $since_id, $max_id, $since)
+    function _repeatedByMeDirect($offset, $limit, $since_id, $max_id)
     {
         $notice = new Notice();
 
@@ -826,10 +814,6 @@ class User extends Memcached_DataObject
             $notice->whereAdd('id <= ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $ids = array();
 
         if ($notice->find()) {
@@ -849,12 +833,12 @@ class User extends Memcached_DataObject
         $ids = Notice::stream(array($this, '_repeatsOfMeDirect'),
                               array(),
                               'user:repeats_of_me:'.$this->id,
-                              $offset, $limit, $since_id, $max_id, null);
+                              $offset, $limit, $since_id, $max_id);
 
         return Notice::getStreamByIds($ids);
     }
 
-    function _repeatsOfMeDirect($offset, $limit, $since_id, $max_id, $since)
+    function _repeatsOfMeDirect($offset, $limit, $since_id, $max_id)
     {
         $qry =
           'SELECT DISTINCT original.id AS id ' .
@@ -869,10 +853,6 @@ class User extends Memcached_DataObject
             $qry .= 'AND original.id <= ' . $max_id . ' ';
         }
 
-        if (!is_null($since)) {
-            $qry .= 'AND original.modified > \'' . date('Y-m-d H:i:s', $since) . '\' ';
-        }
-
         // NOTE: we sort by fave time, not by notice time!
 
         $qry .= 'ORDER BY original.id DESC ';
index 379e6b7219fb6d84eed97b069d3e6c410c12ba36..e9288747467472491459be7b6c72868557040107 100644 (file)
@@ -10,21 +10,23 @@ class User_group extends Memcached_DataObject
 
     public $__table = 'user_group';                      // table name
     public $id;                              // int(4)  primary_key not_null
-    public $nickname;                        // varchar(64)  unique_key
+    public $nickname;                        // varchar(64)
     public $fullname;                        // varchar(255)
     public $homepage;                        // varchar(255)
-    public $description;                     // text()
+    public $description;                     // text
     public $location;                        // varchar(255)
     public $original_logo;                   // varchar(255)
     public $homepage_logo;                   // varchar(255)
     public $stream_logo;                     // varchar(255)
     public $mini_logo;                       // varchar(255)
     public $design_id;                       // int(4)
-    public $created;                         // datetime()   not_null
-    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
+    public $created;                         // datetime   not_null default_0000-00-00%2000%3A00%3A00
+    public $modified;                        // timestamp   not_null default_CURRENT_TIMESTAMP
+    public $uri;                             // varchar(255)  unique_key
+    public $mainpage;                        // varchar(255)
 
     /* Static get */
-    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_group',$k,$v); }
+    function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('User_group',$k,$v); }
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
@@ -39,14 +41,44 @@ class User_group extends Memcached_DataObject
 
     function homeUrl()
     {
-        return common_local_url('showgroup',
-                                array('nickname' => $this->nickname));
+        $url = null;
+        if (Event::handle('StartUserGroupHomeUrl', array($this, &$url))) {
+            // normally stored in mainpage, but older ones may be null
+            if (!empty($this->mainpage)) {
+                $url = $this->mainpage;
+            } else {
+                $url = common_local_url('showgroup',
+                                        array('nickname' => $this->nickname));
+            }
+        }
+        Event::handle('EndUserGroupHomeUrl', array($this, &$url));
+        return $url;
+    }
+
+    function getUri()
+    {
+        $uri = null;
+        if (Event::handle('StartUserGroupGetUri', array($this, &$uri))) {
+            if (!empty($this->uri)) {
+                $uri = $this->uri;
+            } else {
+                $uri = common_local_url('groupbyid',
+                                        array('id' => $this->id));
+            }
+        }
+        Event::handle('EndUserGroupGetUri', array($this, &$uri));
+        return $uri;
     }
 
     function permalink()
     {
-        return common_local_url('groupbyid',
-                                array('id' => $this->id));
+        $url = null;
+        if (Event::handle('StartUserGroupPermalink', array($this, &$url))) {
+            $url = common_local_url('groupbyid',
+                                    array('id' => $this->id));
+        }
+        Event::handle('EndUserGroupPermalink', array($this, &$url));
+        return $url;
     }
 
     function getNotices($offset, $limit, $since_id=null, $max_id=null)
@@ -59,7 +91,7 @@ class User_group extends Memcached_DataObject
         return Notice::getStreamByIds($ids);
     }
 
-    function _streamDirect($offset, $limit, $since_id, $max_id, $since)
+    function _streamDirect($offset, $limit, $since_id, $max_id)
     {
         $inbox = new Group_inbox();
 
@@ -76,10 +108,6 @@ class User_group extends Memcached_DataObject
             $inbox->whereAdd('notice_id <= ' . $max_id);
         }
 
-        if (!is_null($since)) {
-            $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
-        }
-
         $inbox->orderBy('notice_id DESC');
 
         if (!is_null($offset)) {
@@ -367,25 +395,41 @@ class User_group extends Memcached_DataObject
         return $xs->getString();
     }
 
+    /**
+     * Returns an XML string fragment with group information as an
+     * Activity Streams <activity:subject> element.
+     *
+     * Assumes that 'activity' namespace has been previously defined.
+     *
+     * @return string
+     */
     function asActivitySubject()
     {
-        $xs = new XMLStringer(true);
+        return $this->asActivityNoun('subject');
+    }
 
-        $xs->elementStart('activity:subject');
-        $xs->element('activity:object', null, 'http://activitystrea.ms/schema/1.0/group');
-        $xs->element('id', null, $this->permalink());
-        $xs->element('title', null, $this->getBestName());
-        $xs->element(
-            'link', array(
-                'rel'  => 'avatar',
-                'href' =>  empty($this->homepage_logo)
-                    ? User_group::defaultLogo(AVATAR_PROFILE_SIZE)
-                    : $this->homepage_logo
-            )
-        );
-        $xs->elementEnd('activity:subject');
+    /**
+     * Returns an XML string fragment with group information as an
+     * Activity Streams noun object with the given element type.
+     *
+     * Assumes that 'activity', 'georss', and 'poco' namespace has been
+     * previously defined.
+     *
+     * @param string $element one of 'actor', 'subject', 'object', 'target'
+     *
+     * @return string
+     */
+    function asActivityNoun($element)
+    {
+        $noun = ActivityObject::fromGroup($this);
+        return $noun->asString('activity:' . $element);
+    }
 
-        return $xs->getString();
+    function getAvatar()
+    {
+        return empty($this->homepage_logo)
+            ? User_group::defaultLogo(AVATAR_PROFILE_SIZE)
+            : $this->homepage_logo;
     }
 
     static function register($fields) {
@@ -403,28 +447,31 @@ class User_group extends Memcached_DataObject
         $group->homepage    = $homepage;
         $group->description = $description;
         $group->location    = $location;
+        $group->uri         = $uri;
+        $group->mainpage    = $mainpage;
         $group->created     = common_sql_now();
 
         $result = $group->insert();
 
         if (!$result) {
             common_log_db_error($group, 'INSERT', __FILE__);
-            $this->serverError(
-                _('Could not create group.'),
-                500,
-                $this->format
-            );
-            return;
+            throw new ServerException(_('Could not create group.'));
+        }
+
+        if (!isset($uri) || empty($uri)) {
+            $orig = clone($group);
+            $group->uri = common_local_url('groupbyid', array('id' => $group->id));
+            $result = $group->update($orig);
+            if (!$result) {
+                common_log_db_error($group, 'UPDATE', __FILE__);
+                throw new ServerException(_('Could not set group URI.'));
+            }
         }
+
         $result = $group->setAliases($aliases);
 
         if (!$result) {
-            $this->serverError(
-                _('Could not create aliases.'),
-                500,
-                $this->format
-            );
-            return;
+            throw new ServerException(_('Could not create aliases.'));
         }
 
         $member = new Group_member();
@@ -438,12 +485,22 @@ class User_group extends Memcached_DataObject
 
         if (!$result) {
             common_log_db_error($member, 'INSERT', __FILE__);
-            $this->serverError(
-                _('Could not set group membership.'),
-                500,
-                $this->format
-            );
-            return;
+            throw new ServerException(_('Could not set group membership.'));
+        }
+
+        if ($local) {
+            $local_group = new Local_group();
+
+            $local_group->group_id = $group->id;
+            $local_group->nickname = $nickname;
+            $local_group->created  = common_sql_now();
+
+            $result = $local_group->insert();
+
+            if (!$result) {
+                common_log_db_error($local_group, 'INSERT', __FILE__);
+                throw new ServerException(_('Could not save local group info.'));
+            }
         }
 
         $group->query('COMMIT');
index 81c1b68b236eedc1b5994c12d7cd96aec11ff0cc..3fb8ee208ba17c850abd0df50544028b0e504712 100644 (file)
@@ -245,13 +245,6 @@ modified = 384
 group_id = K
 profile_id = K
 
-[invitation]
-code = 130
-user_id = 129
-address = 130
-address_type = 130
-created = 142
-
 [inbox]
 user_id = 129
 notice_ids = 66
@@ -259,9 +252,26 @@ notice_ids = 66
 [inbox__keys]
 user_id = K
 
+[invitation]
+code = 130
+user_id = 129
+address = 130
+address_type = 130
+created = 142
+
 [invitation__keys]
 code = K
 
+[local_group]
+group_id = 129
+nickname = 2
+created = 142
+modified = 384
+
+[local_group__keys]
+group_id = K
+nickname = U
+
 [location_namespace]
 id = 129
 description = 2
@@ -369,7 +379,7 @@ icon = 130
 source_url = 2
 organization = 2
 homepage = 2
-callback_url = 130
+callback_url = 2
 type = 17
 access_type = 17
 created = 142
@@ -440,13 +450,13 @@ tag = K
 
 [queue_item]
 id = 129
-frame = 66
+frame = 194
 transport = 130
 created = 142
 claimed = 14
 
 [queue_item__keys]
-id = K
+id = N
 
 [related_group]
 group_id = 129
@@ -593,10 +603,11 @@ mini_logo = 2
 design_id = 1
 created = 142
 modified = 384
+uri = 2
+mainpage = 2
 
 [user_group__keys]
 id = N
-nickname = U
 
 [user_openid]
 canonical = 130
@@ -627,4 +638,3 @@ modified = 384
 
 [user_location_prefs__keys]
 user_id = K
-
index b8852dc672f3b755b3e715b2df1969e825e85168..5c5fb5b539341e2aa7e108feb81ddfdde1883ac1 100644 (file)
@@ -275,6 +275,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 d5f30a26b99e449c62b9c8522ff1518bd96c8139..c6c5d7af61626bb60782bc03581fd7949c8a4e84 100644 (file)
@@ -140,4 +140,8 @@ create table oauth_application_user (
     constraint primary key (profile_id, application_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
+alter table file_to_post
+    add index post_id_idx (post_id);
 
+alter table group_inbox
+    add index group_inbox_notice_id_idx (notice_id);
diff --git a/db/beta5tobeta6.sql b/db/beta5tobeta6.sql
new file mode 100644 (file)
index 0000000..e9dff17
--- /dev/null
@@ -0,0 +1,28 @@
+alter table oauth_application
+    modify column name varchar(255) not null unique key comment 'name of the application',
+    modify column access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write';
+
+alter table user_group
+add column uri varchar(255) unique key comment 'universal identifier',
+add column mainpage varchar(255) comment 'page for group info to link to',
+drop index nickname;
+
+create table conversation (
+     id integer auto_increment primary key comment 'unique identifier',
+     uri varchar(225) unique comment 'URI of the conversation',
+     created datetime not null comment 'date this record was created',
+     modified timestamp comment 'date this record was modified'
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
+create table local_group (
+    group_id integer primary key comment 'group represented' references user_group (id),
+    nickname varchar(64) unique key comment 'group represented',
+
+    created datetime not null comment 'date this record was created',
+    modified timestamp comment 'date this record was modified'
+
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
+insert into local_group (group_id, nickname, created)
+select id, nickname, created from user_group;
+
index 97117c80aab6b69898012f695d0902eb6ee1554c..3f95948e1ed5ede5d9cde05511f78fb49f657021 100644 (file)
@@ -406,7 +406,7 @@ create table profile_block (
 create table user_group (
     id integer auto_increment primary key comment 'unique identifier',
 
-    nickname varchar(64) unique key comment 'nickname for addressing',
+    nickname varchar(64) comment 'nickname for addressing',
     fullname varchar(255) comment 'display name',
     homepage varchar(255) comment 'URL, cached so we dont regenerate',
     description text comment 'group description',
@@ -421,6 +421,9 @@ create table user_group (
     created datetime not null comment 'date this record was created',
     modified timestamp comment 'date this record was modified',
 
+    uri varchar(255) unique key comment 'universal identifier',
+    mainpage varchar(255) comment 'page for group info to link to',
+
     index user_group_nickname_idx (nickname)
 
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
@@ -455,7 +458,8 @@ create table group_inbox (
     created datetime not null comment 'date the notice was created',
 
     constraint primary key (group_id, notice_id),
-    index group_inbox_created_idx (created)
+    index group_inbox_created_idx (created),
+    index group_inbox_notice_id_idx (notice_id)
 
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
@@ -520,7 +524,8 @@ create table file_to_post (
     post_id integer comment 'id of the notice it belongs to' references notice (id),
     modified timestamp comment 'date this record was modified',
 
-    constraint primary key (file_id, post_id)
+    constraint primary key (file_id, post_id),
+    index post_id_idx (post_id)
 
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
@@ -641,3 +646,13 @@ create table conversation (
     modified timestamp comment 'date this record was modified'
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
+create table local_group (
+
+   group_id integer primary key comment 'group represented' references user_group (id),
+   nickname varchar(64) unique key comment 'group represented',
+
+   created datetime not null comment 'date this record was created',
+   modified timestamp comment 'date this record was modified'
+
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
index 06ff9900fd5bff24466be4cbd6ee5ffaeb87ac6e..215d1f676e1f28dca36c2ae360fef123a6665097 100644 (file)
--- a/index.php
+++ b/index.php
@@ -37,8 +37,6 @@ define('INSTALLDIR', dirname(__FILE__));
 define('STATUSNET', true);
 define('LACONICA', true); // compatibility
 
-require_once INSTALLDIR . '/lib/common.php';
-
 $user = null;
 $action = null;
 
@@ -68,52 +66,69 @@ function getPath($req)
  */
 function handleError($error)
 {
-    if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
-        return;
-    }
+    try {
 
-    $logmsg = "PEAR error: " . $error->getMessage();
-    if (common_config('site', 'logdebug')) {
-        $logmsg .= " : ". $error->getDebugInfo();
-    }
-    // DB queries often end up with a lot of newlines; merge to a single line
-    // for easier grepability...
-    $logmsg = str_replace("\n", " ", $logmsg);
-    common_log(LOG_ERR, $logmsg);
-
-    // @fixme backtrace output should be consistent with exception handling
-    if (common_config('site', 'logdebug')) {
-        $bt = $error->getBacktrace();
-        foreach ($bt as $n => $line) {
-            common_log(LOG_ERR, formatBacktraceLine($n, $line));
+        if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
+            return;
         }
-    }
-    if ($error instanceof DB_DataObject_Error
-        || $error instanceof DB_Error
-    ) {
-        $msg = sprintf(
-            _(
-                'The database for %s isn\'t responding correctly, '.
-                'so the site won\'t work properly. '.
-                'The site admins probably know about the problem, '.
-                'but you can contact them at %s to make sure. '.
-                'Otherwise, wait a few minutes and try again.'
-            ),
-            common_config('site', 'name'),
-            common_config('site', 'email')
-        );
-    } else {
-        $msg = _(
-            'An important error occured, probably related to email setup. '.
-            'Check logfiles for more info..'
-        );
-    }
 
-    $dac = new DBErrorAction($msg, 500);
-    $dac->showPage();
+        $logmsg = "PEAR error: " . $error->getMessage();
+        if ($error instanceof PEAR_Exception && common_config('site', 'logdebug')) {
+            $logmsg .= " : ". $error->toText();
+        }
+        // DB queries often end up with a lot of newlines; merge to a single line
+        // for easier grepability...
+        $logmsg = str_replace("\n", " ", $logmsg);
+        common_log(LOG_ERR, $logmsg);
+
+        // @fixme backtrace output should be consistent with exception handling
+        if (common_config('site', 'logdebug')) {
+            $bt = $error->getTrace();
+            foreach ($bt as $n => $line) {
+                common_log(LOG_ERR, formatBacktraceLine($n, $line));
+            }
+        }
+        if ($error instanceof DB_DataObject_Error
+            || $error instanceof DB_Error
+            || ($error instanceof PEAR_Exception && $error->getCode() == -24)
+        ) {
+            //If we run into a DB error, assume we can't connect to the DB at all
+            //so set the current user to null, so we don't try to access the DB
+            //while rendering the error page.
+            global $_cur;
+            $_cur = null;
+
+            $msg = sprintf(
+                _(
+                    'The database for %s isn\'t responding correctly, '.
+                    'so the site won\'t work properly. '.
+                    'The site admins probably know about the problem, '.
+                    'but you can contact them at %s to make sure. '.
+                    'Otherwise, wait a few minutes and try again.'
+                ),
+                common_config('site', 'name'),
+                common_config('site', 'email')
+            );
+        } else {
+            $msg = _(
+                'An important error occured, probably related to email setup. '.
+                'Check logfiles for more info..'
+            );
+        }
+
+        $dac = new DBErrorAction($msg, 500);
+        $dac->showPage();
+
+    } catch (Exception $e) {
+        echo _('An error occurred.');
+    }
     exit(-1);
 }
 
+set_exception_handler('handleError');
+
+require_once INSTALLDIR . '/lib/common.php';
+
 /**
  * Format a backtrace line for debug output roughly like debug_print_backtrace() does.
  * Exceptions already have this built in, but PEAR error objects just give us the array.
@@ -238,10 +253,6 @@ function main()
         return;
     }
 
-    // For database errors
-
-    PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
-
     // Make sure RW database is setup
 
     setupRW();
index dde394270f13cabc96340a834235651863593e8c..936b847abe7bedc9ae44cf68cc75a48b1b94bf5c 100644 (file)
-/*
- * jQuery Form Plugin
- * version: 2.36 (07-NOV-2009)
- * @requires jQuery v1.2.6 or later
- *
- * Examples and documentation at: http://malsup.com/jquery/form/
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- */
-;(function($) {
-
-/*
-       Usage Note:
-       -----------
-       Do not use both ajaxSubmit and ajaxForm on the same form.  These
-       functions are intended to be exclusive.  Use ajaxSubmit if you want
-       to bind your own submit handler to the form.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').bind('submit', function() {
-                       $(this).ajaxSubmit({
-                               target: '#output'
-                       });
-                       return false; // <-- important!
-               });
-       });
-
-       Use ajaxForm when you want the plugin to manage all the event binding
-       for you.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').ajaxForm({
-                       target: '#output'
-               });
-       });
-
-       When using ajaxForm, the ajaxSubmit function will be invoked for you
-       at the appropriate time.
-*/
-
-/**
- * ajaxSubmit() provides a mechanism for immediately submitting
- * an HTML form using AJAX.
- */
-$.fn.ajaxSubmit = function(options) {
-       // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-       if (!this.length) {
-               log('ajaxSubmit: skipping submit process - no element selected');
-               return this;
-       }
-
-       if (typeof options == 'function')
-               options = { success: options };
-
-       var url = $.trim(this.attr('action'));
-       if (url) {
-               // clean url (don't include hash vaue)
-               url = (url.match(/^([^#]+)/)||[])[1];
-       }
-       url = url || window.location.href || '';
-
-       options = $.extend({
-               url:  url,
-               type: this.attr('method') || 'GET',
-               iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
-       }, options || {});
-
-       // hook for manipulating the form data before it is extracted;
-       // convenient for use with rich editors like tinyMCE or FCKEditor
-       var veto = {};
-       this.trigger('form-pre-serialize', [this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-               return this;
-       }
-
-       // provide opportunity to alter form data before it is serialized
-       if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSerialize callback');
-               return this;
-       }
-
-       var a = this.formToArray(options.semantic);
-       if (options.data) {
-               options.extraData = options.data;
-               for (var n in options.data) {
-                 if(options.data[n] instanceof Array) {
-                       for (var k in options.data[n])
-                         a.push( { name: n, value: options.data[n][k] } );
-                 }
-                 else
-                        a.push( { name: n, value: options.data[n] } );
-               }
-       }
-
-       // give pre-submit callback an opportunity to abort the submit
-       if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSubmit callback');
-               return this;
-       }
-
-       // fire vetoable 'validate' event
-       this.trigger('form-submit-validate', [a, this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-               return this;
-       }
-
-       var q = $.param(a);
-
-       if (options.type.toUpperCase() == 'GET') {
-               options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-               options.data = null;  // data is null for 'get'
-       }
-       else
-               options.data = q; // data is the query string for 'post'
-
-       var $form = this, callbacks = [];
-       if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
-       if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
-
-       // perform a load on the target only if dataType is not provided
-       if (!options.dataType && options.target) {
-               var oldSuccess = options.success || function(){};
-               callbacks.push(function(data) {
-                       $(options.target).html(data).each(oldSuccess, arguments);
-               });
-       }
-       else if (options.success)
-               callbacks.push(options.success);
-
-       options.success = function(data, status) {
-               for (var i=0, max=callbacks.length; i < max; i++)
-                       callbacks[i].apply(options, [data, status, $form]);
-       };
-
-       // are there files to upload?
-       var files = $('input:file', this).fieldValue();
-       var found = false;
-       for (var j=0; j < files.length; j++)
-               if (files[j])
-                       found = true;
-
-       var multipart = false;
-//     var mp = 'multipart/form-data';
-//     multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
-
-       // options.iframe allows user to force iframe mode
-       // 06-NOV-09: now defaulting to iframe mode if file input is detected
-   if ((files.length && options.iframe !== false) || options.iframe || found || multipart) {
-          // hack to fix Safari hang (thanks to Tim Molendijk for this)
-          // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-          if (options.closeKeepAlive)
-                  $.get(options.closeKeepAlive, fileUpload);
-          else
-                  fileUpload();
-          }
-   else
-          $.ajax(options);
-
-       // fire 'notify' event
-       this.trigger('form-submit-notify', [this, options]);
-       return this;
-
-
-       // private function for handling file uploads (hat tip to YAHOO!)
-       function fileUpload() {
-               var form = $form[0];
-
-               if ($(':input[name=submit]', form).length) {
-                       alert('Error: Form elements must not be named "submit".');
-                       return;
-               }
-
-               var opts = $.extend({}, $.ajaxSettings, options);
-               var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
-
-               var id = 'jqFormIO' + (new Date().getTime());
-               var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />');
-               var io = $io[0];
-
-               $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-
-               var xhr = { // mock object
-                       aborted: 0,
-                       responseText: null,
-                       responseXML: null,
-                       status: 0,
-                       statusText: 'n/a',
-                       getAllResponseHeaders: function() {},
-                       getResponseHeader: function() {},
-                       setRequestHeader: function() {},
-                       abort: function() {
-                               this.aborted = 1;
-                               $io.attr('src', opts.iframeSrc); // abort op in progress
-                       }
-               };
-
-               var g = opts.global;
-               // trigger ajax global events so that activity/block indicators work like normal
-               if (g && ! $.active++) $.event.trigger("ajaxStart");
-               if (g) $.event.trigger("ajaxSend", [xhr, opts]);
-
-               if (s.beforeSend && s.beforeSend(xhr, s) === false) {
-                       s.global && $.active--;
-                       return;
-               }
-               if (xhr.aborted)
-                       return;
-
-               var cbInvoked = 0;
-               var timedOut = 0;
-
-               // add submitting element to data if we know it
-               var sub = form.clk;
-               if (sub) {
-                       var n = sub.name;
-                       if (n && !sub.disabled) {
-                               options.extraData = options.extraData || {};
-                               options.extraData[n] = sub.value;
-                               if (sub.type == "image") {
-                                       options.extraData[name+'.x'] = form.clk_x;
-                                       options.extraData[name+'.y'] = form.clk_y;
-                               }
-                       }
-               }
-
-               // take a breath so that pending repaints get some cpu time before the upload starts
-               setTimeout(function() {
-                       // make sure form attrs are set
-                       var t = $form.attr('target'), a = $form.attr('action');
-
-                       // update form attrs in IE friendly way
-                       form.setAttribute('target',id);
-                       if (form.getAttribute('method') != 'POST')
-                               form.setAttribute('method', 'POST');
-                       if (form.getAttribute('action') != opts.url)
-                               form.setAttribute('action', opts.url);
-
-                       // ie borks in some cases when setting encoding
-                       if (! options.skipEncodingOverride) {
-                               $form.attr({
-                                       encoding: 'multipart/form-data',
-                                       enctype:  'multipart/form-data'
-                               });
-                       }
-
-                       // support timout
-                       if (opts.timeout)
-                               setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
-
-                       // add "extra" data to form if provided in options
-                       var extraInputs = [];
-                       try {
-                               if (options.extraData)
-                                       for (var n in options.extraData)
-                                               extraInputs.push(
-                                                       $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
-                                                               .appendTo(form)[0]);
-
-                               // add iframe to doc and submit the form
-                               $io.appendTo('body');
-                               io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
-                               form.submit();
-                       }
-                       finally {
-                               // reset attrs and remove "extra" input elements
-                               form.setAttribute('action',a);
-                               t ? form.setAttribute('target', t) : $form.removeAttr('target');
-                               $(extraInputs).remove();
-                       }
-               }, 10);
-
-               var domCheckCount = 50;
-
-               function cb() {
-                       if (cbInvoked++) return;
-
-                       io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
-
-                       var ok = true;
-                       try {
-                               if (timedOut) throw 'timeout';
-                               // extract the server response from the iframe
-                               var data, doc;
-
-                               doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
-                               
-                               var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
-                               log('isXml='+isXml);
-                               if (!isXml && (doc.body == null || doc.body.innerHTML == '')) {
-                                       if (--domCheckCount) {
-                                               // in some browsers (Opera) the iframe DOM is not always traversable when
-                                               // the onload callback fires, so we loop a bit to accommodate
-                                               cbInvoked = 0;
-                                               setTimeout(cb, 100);
-                                               return;
-                                       }
-                                       log('Could not access iframe DOM after 50 tries.');
-                                       return;
-                               }
-
-                               xhr.responseText = doc.body ? doc.body.innerHTML : null;
-                               xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                               xhr.getResponseHeader = function(header){
-                                       var headers = {'content-type': opts.dataType};
-                                       return headers[header];
-                               };
-
-                               if (opts.dataType == 'json' || opts.dataType == 'script') {
-                                       // see if user embedded response in textarea
-                                       var ta = doc.getElementsByTagName('textarea')[0];
-                                       if (ta)
-                                               xhr.responseText = ta.value;
-                                       else {
-                                               // account for browsers injecting pre around json response
-                                               var pre = doc.getElementsByTagName('pre')[0];
-                                               if (pre)
-                                                       xhr.responseText = pre.innerHTML;
-                                       }                         
-                               }
-                               else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
-                                       xhr.responseXML = toXml(xhr.responseText);
-                               }
-                               data = $.httpData(xhr, opts.dataType);
-                       }
-                       catch(e){
-                               ok = false;
-                               $.handleError(opts, xhr, 'error', e);
-                       }
-
-                       // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-                       if (ok) {
-                               opts.success(data, 'success');
-                               if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
-                       }
-                       if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
-                       if (g && ! --$.active) $.event.trigger("ajaxStop");
-                       if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
-
-                       // clean up
-                       setTimeout(function() {
-                               $io.remove();
-                               xhr.responseXML = null;
-                       }, 100);
-               };
-
-               function toXml(s, doc) {
-                       if (window.ActiveXObject) {
-                               doc = new ActiveXObject('Microsoft.XMLDOM');
-                               doc.async = 'false';
-                               doc.loadXML(s);
-                       }
-                       else
-                               doc = (new DOMParser()).parseFromString(s, 'text/xml');
-                       return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
-               };
-       };
-};
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *     is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- *     used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself.
- */
-$.fn.ajaxForm = function(options) {
-       return this.ajaxFormUnbind().bind('submit.form-plugin', function() {
-               $(this).ajaxSubmit(options);
-               return false;
-       }).bind('click.form-plugin', function(e) {
-               var target = e.target;
-               var $el = $(target);
-               if (!($el.is(":submit,input:image"))) {
-                       // is this a child element of the submit el?  (ex: a span within a button)
-                       var t = $el.closest(':submit');
-                       if (t.length == 0)
-                               return;
-                       target = t[0];
-               }
-               var form = this;
-               form.clk = target;
-               if (target.type == 'image') {
-                       if (e.offsetX != undefined) {
-                               form.clk_x = e.offsetX;
-                               form.clk_y = e.offsetY;
-                       } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
-                               var offset = $el.offset();
-                               form.clk_x = e.pageX - offset.left;
-                               form.clk_y = e.pageY - offset.top;
-                       } else {
-                               form.clk_x = e.pageX - target.offsetLeft;
-                               form.clk_y = e.pageY - target.offsetTop;
-                       }
-               }
-               // clear form vars
-               setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
-       });
-};
-
-// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
-$.fn.ajaxFormUnbind = function() {
-       return this.unbind('submit.form-plugin click.form-plugin');
-};
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property.  An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- */
-$.fn.formToArray = function(semantic) {
-       var a = [];
-       if (this.length == 0) return a;
-
-       var form = this[0];
-       var els = semantic ? form.getElementsByTagName('*') : form.elements;
-       if (!els) return a;
-       for(var i=0, max=els.length; i < max; i++) {
-               var el = els[i];
-               var n = el.name;
-               if (!n) continue;
-
-               if (semantic && form.clk && el.type == "image") {
-                       // handle image inputs on the fly when semantic == true
-                       if(!el.disabled && form.clk == el) {
-                               a.push({name: n, value: $(el).val()});
-                               a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-                       }
-                       continue;
-               }
-
-               var v = $.fieldValue(el, true);
-               if (v && v.constructor == Array) {
-                       for(var j=0, jmax=v.length; j < jmax; j++)
-                               a.push({name: n, value: v[j]});
-               }
-               else if (v !== null && typeof v != 'undefined')
-                       a.push({name: n, value: v});
-       }
-
-       if (!semantic && form.clk) {
-               // input type=='image' are not found in elements array! handle it here
-               var $input = $(form.clk), input = $input[0], n = input.name;
-               if (n && !input.disabled && input.type == 'image') {
-                       a.push({name: n, value: $input.val()});
-                       a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-               }
-       }
-       return a;
-};
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- */
-$.fn.formSerialize = function(semantic) {
-       //hand off to jQuery.param for proper encoding
-       return $.param(this.formToArray(semantic));
-};
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- */
-$.fn.fieldSerialize = function(successful) {
-       var a = [];
-       this.each(function() {
-               var n = this.name;
-               if (!n) return;
-               var v = $.fieldValue(this, successful);
-               if (v && v.constructor == Array) {
-                       for (var i=0,max=v.length; i < max; i++)
-                               a.push({name: n, value: v[i]});
-               }
-               else if (v !== null && typeof v != 'undefined')
-                       a.push({name: this.name, value: v});
-       });
-       //hand off to jQuery.param for proper encoding
-       return $.param(a);
-};
-
-/**
- * Returns the value(s) of the element in the matched set.  For example, consider the following form:
- *
- *  <form><fieldset>
- *       <input name="A" type="text" />
- *       <input name="A" type="text" />
- *       <input name="B" type="checkbox" value="B1" />
- *       <input name="B" type="checkbox" value="B2"/>
- *       <input name="C" type="radio" value="C1" />
- *       <input name="C" type="radio" value="C2" />
- *  </fieldset></form>
- *
- *  var v = $(':text').fieldValue();
- *  // if no values are entered into the text inputs
- *  v == ['','']
- *  // if values entered into the text inputs are 'foo' and 'bar'
- *  v == ['foo','bar']
- *
- *  var v = $(':checkbox').fieldValue();
- *  // if neither checkbox is checked
- *  v === undefined
- *  // if both checkboxes are checked
- *  v == ['B1', 'B2']
- *
- *  var v = $(':radio').fieldValue();
- *  // if neither radio is checked
- *  v === undefined
- *  // if first radio is checked
- *  v == ['C1']
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If this value is false the value(s)
- * for each element is returned.
- *
- * Note: This method *always* returns an array.  If no valid value can be determined the
- *        array will be empty, otherwise it will contain one or more values.
- */
-$.fn.fieldValue = function(successful) {
-       for (var val=[], i=0, max=this.length; i < max; i++) {
-               var el = this[i];
-               var v = $.fieldValue(el, successful);
-               if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
-                       continue;
-               v.constructor == Array ? $.merge(val, v) : val.push(v);
-       }
-       return val;
-};
-
-/**
- * Returns the value of the field element.
- */
-$.fieldValue = function(el, successful) {
-       var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-       if (typeof successful == 'undefined') successful = true;
-
-       if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-               (t == 'checkbox' || t == 'radio') && !el.checked ||
-               (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-               tag == 'select' && el.selectedIndex == -1))
-                       return null;
-
-       if (tag == 'select') {
-               var index = el.selectedIndex;
-               if (index < 0) return null;
-               var a = [], ops = el.options;
-               var one = (t == 'select-one');
-               var max = (one ? index+1 : ops.length);
-               for(var i=(one ? index : 0); i < max; i++) {
-                       var op = ops[i];
-                       if (op.selected) {
-                               var v = op.value;
-                               if (!v) // extra pain for IE...
-                                       v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
-                               if (one) return v;
-                               a.push(v);
-                       }
-               }
-               return a;
-       }
-       return el.value;
-};
-
-/**
- * Clears the form data.  Takes the following actions on the form's input fields:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- */
-$.fn.clearForm = function() {
-       return this.each(function() {
-               $('input,select,textarea', this).clearFields();
-       });
-};
-
-/**
- * Clears the selected form elements.
- */
-$.fn.clearFields = $.fn.clearInputs = function() {
-       return this.each(function() {
-               var t = this.type, tag = this.tagName.toLowerCase();
-               if (t == 'text' || t == 'password' || tag == 'textarea')
-                       this.value = '';
-               else if (t == 'checkbox' || t == 'radio')
-                       this.checked = false;
-               else if (tag == 'select')
-                       this.selectedIndex = -1;
-       });
-};
-
-/**
- * Resets the form data.  Causes all form elements to be reset to their original value.
- */
-$.fn.resetForm = function() {
-       return this.each(function() {
-               // guard against an input with the name of 'reset'
-               // note that IE reports the reset function as an 'object'
-               if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
-                       this.reset();
-       });
-};
-
-/**
- * Enables or disables any matching elements.
- */
-$.fn.enable = function(b) {
-       if (b == undefined) b = true;
-       return this.each(function() {
-               this.disabled = !b;
-       });
-};
-
-/**
- * Checks/unchecks any matching checkboxes or radio buttons and
- * selects/deselects and matching option elements.
- */
-$.fn.selected = function(select) {
-       if (select == undefined) select = true;
-       return this.each(function() {
-               var t = this.type;
-               if (t == 'checkbox' || t == 'radio')
-                       this.checked = select;
-               else if (this.tagName.toLowerCase() == 'option') {
-                       var $sel = $(this).parent('select');
-                       if (select && $sel[0] && $sel[0].type == 'select-one') {
-                               // deselect all other options
-                               $sel.find('option').selected(false);
-                       }
-                       this.selected = select;
-               }
-       });
-};
-
-// helper fn for console logging
-// set $.fn.ajaxSubmit.debug to true to enable debug logging
-function log() {
-       if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
-               window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
-};
-
-})(jQuery);
+/*\r
+ * jQuery Form Plugin\r
+ * version: 2.17 (06-NOV-2008)\r
+ * @requires jQuery v1.2.2 or later\r
+ *\r
+ * Examples and documentation at: http://malsup.com/jquery/form/\r
+ * Dual licensed under the MIT and GPL licenses:\r
+ *   http://www.opensource.org/licenses/mit-license.php\r
+ *   http://www.gnu.org/licenses/gpl.html\r
+ *\r
+ * Revision: $Id$\r
+ */\r
+;(function($) {\r
+\r
+/*\r
+    Usage Note:  \r
+    -----------\r
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These\r
+    functions are intended to be exclusive.  Use ajaxSubmit if you want\r
+    to bind your own submit handler to the form.  For example,\r
+\r
+    $(document).ready(function() {\r
+        $('#myForm').bind('submit', function() {\r
+            $(this).ajaxSubmit({\r
+                target: '#output'\r
+            });\r
+            return false; // <-- important!\r
+        });\r
+    });\r
+\r
+    Use ajaxForm when you want the plugin to manage all the event binding\r
+    for you.  For example,\r
+\r
+    $(document).ready(function() {\r
+        $('#myForm').ajaxForm({\r
+            target: '#output'\r
+        });\r
+    });\r
+        \r
+    When using ajaxForm, the ajaxSubmit function will be invoked for you\r
+    at the appropriate time.  \r
+*/\r
+\r
+/**\r
+ * ajaxSubmit() provides a mechanism for immediately submitting \r
+ * an HTML form using AJAX.\r
+ */\r
+$.fn.ajaxSubmit = function(options) {\r
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\r
+    if (!this.length) {\r
+        log('ajaxSubmit: skipping submit process - no element selected');\r
+        return this;\r
+    }\r
+\r
+    if (typeof options == 'function')\r
+        options = { success: options };\r
+\r
+    options = $.extend({\r
+        url:  this.attr('action') || window.location.toString(),\r
+        type: this.attr('method') || 'GET'\r
+    }, options || {});\r
+\r
+    // hook for manipulating the form data before it is extracted;\r
+    // convenient for use with rich editors like tinyMCE or FCKEditor\r
+    var veto = {};\r
+    this.trigger('form-pre-serialize', [this, options, veto]);\r
+    if (veto.veto) {\r
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\r
+        return this;\r
+    }\r
+\r
+    // provide opportunity to alter form data before it is serialized\r
+    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\r
+        log('ajaxSubmit: submit aborted via beforeSerialize callback');\r
+        return this;\r
+    }    \r
+   \r
+    var a = this.formToArray(options.semantic);\r
+    if (options.data) {\r
+        options.extraData = options.data;\r
+        for (var n in options.data) {\r
+          if(options.data[n] instanceof Array) {\r
+            for (var k in options.data[n])\r
+              a.push( { name: n, value: options.data[n][k] } )\r
+          }  \r
+          else\r
+             a.push( { name: n, value: options.data[n] } );\r
+        }\r
+    }\r
+\r
+    // give pre-submit callback an opportunity to abort the submit\r
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\r
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');\r
+        return this;\r
+    }    \r
+\r
+    // fire vetoable 'validate' event\r
+    this.trigger('form-submit-validate', [a, this, options, veto]);\r
+    if (veto.veto) {\r
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');\r
+        return this;\r
+    }    \r
+\r
+    var q = $.param(a);\r
+\r
+    if (options.type.toUpperCase() == 'GET') {\r
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\r
+        options.data = null;  // data is null for 'get'\r
+    }\r
+    else\r
+        options.data = q; // data is the query string for 'post'\r
+\r
+    var $form = this, callbacks = [];\r
+    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });\r
+    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });\r
+\r
+    // perform a load on the target only if dataType is not provided\r
+    if (!options.dataType && options.target) {\r
+        var oldSuccess = options.success || function(){};\r
+        callbacks.push(function(data) {\r
+            $(options.target).html(data).each(oldSuccess, arguments);\r
+        });\r
+    }\r
+    else if (options.success)\r
+        callbacks.push(options.success);\r
+\r
+    options.success = function(data, status) {\r
+        for (var i=0, max=callbacks.length; i < max; i++)\r
+            callbacks[i].apply(options, [data, status, $form]);\r
+    };\r
+\r
+    // are there files to upload?\r
+    var files = $('input:file', this).fieldValue();\r
+    var found = false;\r
+    for (var j=0; j < files.length; j++)\r
+        if (files[j])\r
+            found = true;\r
+\r
+    // options.iframe allows user to force iframe mode\r
+   if (options.iframe || found) { \r
+       // hack to fix Safari hang (thanks to Tim Molendijk for this)\r
+       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\r
+       if ($.browser.safari && options.closeKeepAlive)\r
+           $.get(options.closeKeepAlive, fileUpload);\r
+       else\r
+           fileUpload();\r
+       }\r
+   else\r
+       $.ajax(options);\r
+\r
+    // fire 'notify' event\r
+    this.trigger('form-submit-notify', [this, options]);\r
+    return this;\r
+\r
+\r
+    // private function for handling file uploads (hat tip to YAHOO!)\r
+    function fileUpload() {\r
+        var form = $form[0];\r
+        \r
+        if ($(':input[name=submit]', form).length) {\r
+            alert('Error: Form elements must not be named "submit".');\r
+            return;\r
+        }\r
+        \r
+        var opts = $.extend({}, $.ajaxSettings, options);\r
+               var s = jQuery.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);\r
+\r
+        var id = 'jqFormIO' + (new Date().getTime());\r
+        var $io = $('<iframe id="' + id + '" name="' + id + '" />');\r
+        var io = $io[0];\r
+\r
+        if ($.browser.msie || $.browser.opera) \r
+            io.src = 'javascript:false;document.write("");';\r
+        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });\r
+\r
+        var xhr = { // mock object\r
+            aborted: 0,\r
+            responseText: null,\r
+            responseXML: null,\r
+            status: 0,\r
+            statusText: 'n/a',\r
+            getAllResponseHeaders: function() {},\r
+            getResponseHeader: function() {},\r
+            setRequestHeader: function() {},\r
+            abort: function() { \r
+                this.aborted = 1; \r
+                $io.attr('src','about:blank'); // abort op in progress\r
+            }\r
+        };\r
+\r
+        var g = opts.global;\r
+        // trigger ajax global events so that activity/block indicators work like normal\r
+        if (g && ! $.active++) $.event.trigger("ajaxStart");\r
+        if (g) $.event.trigger("ajaxSend", [xhr, opts]);\r
+\r
+               if (s.beforeSend && s.beforeSend(xhr, s) === false) {\r
+                       s.global && jQuery.active--;\r
+                       return;\r
+        }\r
+        if (xhr.aborted)\r
+            return;\r
+        \r
+        var cbInvoked = 0;\r
+        var timedOut = 0;\r
+\r
+        // add submitting element to data if we know it\r
+        var sub = form.clk;\r
+        if (sub) {\r
+            var n = sub.name;\r
+            if (n && !sub.disabled) {\r
+                options.extraData = options.extraData || {};\r
+                options.extraData[n] = sub.value;\r
+                if (sub.type == "image") {\r
+                    options.extraData[name+'.x'] = form.clk_x;\r
+                    options.extraData[name+'.y'] = form.clk_y;\r
+                }\r
+            }\r
+        }\r
+\r
+        // take a breath so that pending repaints get some cpu time before the upload starts\r
+        setTimeout(function() {\r
+            // make sure form attrs are set\r
+            var t = $form.attr('target'), a = $form.attr('action');\r
+            $form.attr({\r
+                target:   id,\r
+                method:   'POST',\r
+                action:   opts.url\r
+            });\r
+            \r
+            // ie borks in some cases when setting encoding\r
+            if (! options.skipEncodingOverride) {\r
+                $form.attr({\r
+                    encoding: 'multipart/form-data',\r
+                    enctype:  'multipart/form-data'\r
+                });\r
+            }\r
+\r
+            // support timout\r
+            if (opts.timeout)\r
+                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);\r
+\r
+            // add "extra" data to form if provided in options\r
+            var extraInputs = [];\r
+            try {\r
+                if (options.extraData)\r
+                    for (var n in options.extraData)\r
+                        extraInputs.push(\r
+                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')\r
+                                .appendTo(form)[0]);\r
+            \r
+                // add iframe to doc and submit the form\r
+                $io.appendTo('body');\r
+                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);\r
+                form.submit();\r
+            }\r
+            finally {\r
+                // reset attrs and remove "extra" input elements\r
+                $form.attr('action', a);\r
+                t ? $form.attr('target', t) : $form.removeAttr('target');\r
+                $(extraInputs).remove();\r
+            }\r
+        }, 10);\r
+\r
+        function cb() {\r
+            if (cbInvoked++) return;\r
+            \r
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);\r
+\r
+            var operaHack = 0;\r
+            var ok = true;\r
+            try {\r
+                if (timedOut) throw 'timeout';\r
+                // extract the server response from the iframe\r
+                var data, doc;\r
+\r
+                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;\r
+                \r
+                if (doc.body == null && !operaHack && $.browser.opera) {\r
+                    // In Opera 9.2.x the iframe DOM is not always traversable when\r
+                    // the onload callback fires so we give Opera 100ms to right itself\r
+                    operaHack = 1;\r
+                    cbInvoked--;\r
+                    setTimeout(cb, 100);\r
+                    return;\r
+                }\r
+                \r
+                xhr.responseText = doc.body ? doc.body.innerHTML : null;\r
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;\r
+                xhr.getResponseHeader = function(header){\r
+                    var headers = {'content-type': opts.dataType};\r
+                    return headers[header];\r
+                };\r
+\r
+                if (opts.dataType == 'json' || opts.dataType == 'script') {\r
+                    var ta = doc.getElementsByTagName('textarea')[0];\r
+                    xhr.responseText = ta ? ta.value : xhr.responseText;\r
+                }\r
+                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {\r
+                    xhr.responseXML = toXml(xhr.responseText);\r
+                }\r
+                data = $.httpData(xhr, opts.dataType);\r
+            }\r
+            catch(e){\r
+                ok = false;\r
+                $.handleError(opts, xhr, 'error', e);\r
+            }\r
+\r
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it\r
+            if (ok) {\r
+                opts.success(data, 'success');\r
+                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);\r
+            }\r
+            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);\r
+            if (g && ! --$.active) $.event.trigger("ajaxStop");\r
+            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');\r
+\r
+            // clean up\r
+            setTimeout(function() {\r
+                $io.remove();\r
+                xhr.responseXML = null;\r
+            }, 100);\r
+        };\r
+\r
+        function toXml(s, doc) {\r
+            if (window.ActiveXObject) {\r
+                doc = new ActiveXObject('Microsoft.XMLDOM');\r
+                doc.async = 'false';\r
+                doc.loadXML(s);\r
+            }\r
+            else\r
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');\r
+            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;\r
+        };\r
+    };\r
+};\r
+\r
+/**\r
+ * ajaxForm() provides a mechanism for fully automating form submission.\r
+ *\r
+ * The advantages of using this method instead of ajaxSubmit() are:\r
+ *\r
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element\r
+ *    is used to submit the form).\r
+ * 2. This method will include the submit element's name/value data (for the element that was\r
+ *    used to submit the form).\r
+ * 3. This method binds the submit() method to the form for you.\r
+ *\r
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely\r
+ * passes the options argument along after properly binding events for submit elements and\r
+ * the form itself.\r
+ */ \r
+$.fn.ajaxForm = function(options) {\r
+    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {\r
+        $(this).ajaxSubmit(options);\r
+        return false;\r
+    }).each(function() {\r
+        // store options in hash\r
+        $(":submit,input:image", this).bind('click.form-plugin',function(e) {\r
+            var form = this.form;\r
+            form.clk = this;\r
+            if (this.type == 'image') {\r
+                if (e.offsetX != undefined) {\r
+                    form.clk_x = e.offsetX;\r
+                    form.clk_y = e.offsetY;\r
+                } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin\r
+                    var offset = $(this).offset();\r
+                    form.clk_x = e.pageX - offset.left;\r
+                    form.clk_y = e.pageY - offset.top;\r
+                } else {\r
+                    form.clk_x = e.pageX - this.offsetLeft;\r
+                    form.clk_y = e.pageY - this.offsetTop;\r
+                }\r
+            }\r
+            // clear form vars\r
+            setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);\r
+        });\r
+    });\r
+};\r
+\r
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm\r
+$.fn.ajaxFormUnbind = function() {\r
+    this.unbind('submit.form-plugin');\r
+    return this.each(function() {\r
+        $(":submit,input:image", this).unbind('click.form-plugin');\r
+    });\r
+\r
+};\r
+\r
+/**\r
+ * formToArray() gathers form element data into an array of objects that can\r
+ * be passed to any of the following ajax functions: $.get, $.post, or load.\r
+ * Each object in the array has both a 'name' and 'value' property.  An example of\r
+ * an array for a simple login form might be:\r
+ *\r
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\r
+ *\r
+ * It is this array that is passed to pre-submit callback functions provided to the\r
+ * ajaxSubmit() and ajaxForm() methods.\r
+ */\r
+$.fn.formToArray = function(semantic) {\r
+    var a = [];\r
+    if (this.length == 0) return a;\r
+\r
+    var form = this[0];\r
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;\r
+    if (!els) return a;\r
+    for(var i=0, max=els.length; i < max; i++) {\r
+        var el = els[i];\r
+        var n = el.name;\r
+        if (!n) continue;\r
+\r
+        if (semantic && form.clk && el.type == "image") {\r
+            // handle image inputs on the fly when semantic == true\r
+            if(!el.disabled && form.clk == el)\r
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\r
+            continue;\r
+        }\r
+\r
+        var v = $.fieldValue(el, true);\r
+        if (v && v.constructor == Array) {\r
+            for(var j=0, jmax=v.length; j < jmax; j++)\r
+                a.push({name: n, value: v[j]});\r
+        }\r
+        else if (v !== null && typeof v != 'undefined')\r
+            a.push({name: n, value: v});\r
+    }\r
+\r
+    if (!semantic && form.clk) {\r
+        // input type=='image' are not found in elements array! handle them here\r
+        var inputs = form.getElementsByTagName("input");\r
+        for(var i=0, max=inputs.length; i < max; i++) {\r
+            var input = inputs[i];\r
+            var n = input.name;\r
+            if(n && !input.disabled && input.type == "image" && form.clk == input)\r
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\r
+        }\r
+    }\r
+    return a;\r
+};\r
+\r
+/**\r
+ * Serializes form data into a 'submittable' string. This method will return a string\r
+ * in the format: name1=value1&amp;name2=value2\r
+ */\r
+$.fn.formSerialize = function(semantic) {\r
+    //hand off to jQuery.param for proper encoding\r
+    return $.param(this.formToArray(semantic));\r
+};\r
+\r
+/**\r
+ * Serializes all field elements in the jQuery object into a query string.\r
+ * This method will return a string in the format: name1=value1&amp;name2=value2\r
+ */\r
+$.fn.fieldSerialize = function(successful) {\r
+    var a = [];\r
+    this.each(function() {\r
+        var n = this.name;\r
+        if (!n) return;\r
+        var v = $.fieldValue(this, successful);\r
+        if (v && v.constructor == Array) {\r
+            for (var i=0,max=v.length; i < max; i++)\r
+                a.push({name: n, value: v[i]});\r
+        }\r
+        else if (v !== null && typeof v != 'undefined')\r
+            a.push({name: this.name, value: v});\r
+    });\r
+    //hand off to jQuery.param for proper encoding\r
+    return $.param(a);\r
+};\r
+\r
+/**\r
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:\r
+ *\r
+ *  <form><fieldset>\r
+ *      <input name="A" type="text" />\r
+ *      <input name="A" type="text" />\r
+ *      <input name="B" type="checkbox" value="B1" />\r
+ *      <input name="B" type="checkbox" value="B2"/>\r
+ *      <input name="C" type="radio" value="C1" />\r
+ *      <input name="C" type="radio" value="C2" />\r
+ *  </fieldset></form>\r
+ *\r
+ *  var v = $(':text').fieldValue();\r
+ *  // if no values are entered into the text inputs\r
+ *  v == ['','']\r
+ *  // if values entered into the text inputs are 'foo' and 'bar'\r
+ *  v == ['foo','bar']\r
+ *\r
+ *  var v = $(':checkbox').fieldValue();\r
+ *  // if neither checkbox is checked\r
+ *  v === undefined\r
+ *  // if both checkboxes are checked\r
+ *  v == ['B1', 'B2']\r
+ *\r
+ *  var v = $(':radio').fieldValue();\r
+ *  // if neither radio is checked\r
+ *  v === undefined\r
+ *  // if first radio is checked\r
+ *  v == ['C1']\r
+ *\r
+ * The successful argument controls whether or not the field element must be 'successful'\r
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).\r
+ * The default value of the successful argument is true.  If this value is false the value(s)\r
+ * for each element is returned.\r
+ *\r
+ * Note: This method *always* returns an array.  If no valid value can be determined the\r
+ *       array will be empty, otherwise it will contain one or more values.\r
+ */\r
+$.fn.fieldValue = function(successful) {\r
+    for (var val=[], i=0, max=this.length; i < max; i++) {\r
+        var el = this[i];\r
+        var v = $.fieldValue(el, successful);\r
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))\r
+            continue;\r
+        v.constructor == Array ? $.merge(val, v) : val.push(v);\r
+    }\r
+    return val;\r
+};\r
+\r
+/**\r
+ * Returns the value of the field element.\r
+ */\r
+$.fieldValue = function(el, successful) {\r
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();\r
+    if (typeof successful == 'undefined') successful = true;\r
+\r
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||\r
+        (t == 'checkbox' || t == 'radio') && !el.checked ||\r
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||\r
+        tag == 'select' && el.selectedIndex == -1))\r
+            return null;\r
+\r
+    if (tag == 'select') {\r
+        var index = el.selectedIndex;\r
+        if (index < 0) return null;\r
+        var a = [], ops = el.options;\r
+        var one = (t == 'select-one');\r
+        var max = (one ? index+1 : ops.length);\r
+        for(var i=(one ? index : 0); i < max; i++) {\r
+            var op = ops[i];\r
+            if (op.selected) {\r
+                // extra pain for IE...\r
+                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;\r
+                if (one) return v;\r
+                a.push(v);\r
+            }\r
+        }\r
+        return a;\r
+    }\r
+    return el.value;\r
+};\r
+\r
+/**\r
+ * Clears the form data.  Takes the following actions on the form's input fields:\r
+ *  - input text fields will have their 'value' property set to the empty string\r
+ *  - select elements will have their 'selectedIndex' property set to -1\r
+ *  - checkbox and radio inputs will have their 'checked' property set to false\r
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected\r
+ *  - button elements will *not* be effected\r
+ */\r
+$.fn.clearForm = function() {\r
+    return this.each(function() {\r
+        $('input,select,textarea', this).clearFields();\r
+    });\r
+};\r
+\r
+/**\r
+ * Clears the selected form elements.\r
+ */\r
+$.fn.clearFields = $.fn.clearInputs = function() {\r
+    return this.each(function() {\r
+        var t = this.type, tag = this.tagName.toLowerCase();\r
+        if (t == 'file' || t == 'text' || t == 'password' || tag == 'textarea')\r
+            this.value = '';\r
+        else if (t == 'checkbox' || t == 'radio')\r
+            this.checked = false;\r
+        else if (tag == 'select')\r
+            this.selectedIndex = -1;\r
+    });\r
+};\r
+\r
+/**\r
+ * Resets the form data.  Causes all form elements to be reset to their original value.\r
+ */\r
+$.fn.resetForm = function() {\r
+    return this.each(function() {\r
+        // guard against an input with the name of 'reset'\r
+        // note that IE reports the reset function as an 'object'\r
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))\r
+            this.reset();\r
+    });\r
+};\r
+\r
+/**\r
+ * Enables or disables any matching elements.\r
+ */\r
+$.fn.enable = function(b) { \r
+    if (b == undefined) b = true;\r
+    return this.each(function() { \r
+        this.disabled = !b \r
+    });\r
+};\r
+\r
+/**\r
+ * Checks/unchecks any matching checkboxes or radio buttons and\r
+ * selects/deselects and matching option elements.\r
+ */\r
+$.fn.selected = function(select) {\r
+    if (select == undefined) select = true;\r
+    return this.each(function() { \r
+        var t = this.type;\r
+        if (t == 'checkbox' || t == 'radio')\r
+            this.checked = select;\r
+        else if (this.tagName.toLowerCase() == 'option') {\r
+            var $sel = $(this).parent('select');\r
+            if (select && $sel[0] && $sel[0].type == 'select-one') {\r
+                // deselect all other options\r
+                $sel.find('option').selected(false);\r
+            }\r
+            this.selected = select;\r
+        }\r
+    });\r
+};\r
+\r
+// helper fn for console logging\r
+// set $.fn.ajaxSubmit.debug to true to enable debug logging\r
+function log() {\r
+    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)\r
+        window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));\r
+};\r
+\r
+})(jQuery);\r
index 237e1b9081302568b4286f9028e1380b1492db10..b3b95307a13602285313ecc90a9707b10bf270b6 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.4.1
+ * jQuery JavaScript Library v1.4.2
  * http://jquery.com/
  *
  * Copyright 2010, John Resig
@@ -11,7 +11,7 @@
  * Copyright 2010, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Mon Jan 25 19:43:33 2010 -0500
+ * Date: Sat Feb 13 22:33:48 2010 -0500
  */
 (function( window, undefined ) {
 
@@ -86,6 +86,15 @@ jQuery.fn = jQuery.prototype = {
                        this.length = 1;
                        return this;
                }
+               
+               // The body element only exists once, optimize finding it
+               if ( selector === "body" && !context ) {
+                       this.context = document;
+                       this[0] = document.body;
+                       this.selector = "body";
+                       this.length = 1;
+                       return this;
+               }
 
                // Handle HTML strings
                if ( typeof selector === "string" ) {
@@ -116,7 +125,9 @@ jQuery.fn = jQuery.prototype = {
                                                ret = buildFragment( [ match[1] ], [ doc ] );
                                                selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
                                        }
-
+                                       
+                                       return jQuery.merge( this, selector );
+                                       
                                // HANDLE: $("#id")
                                } else {
                                        elem = document.getElementById( match[2] );
@@ -143,6 +154,7 @@ jQuery.fn = jQuery.prototype = {
                                this.selector = selector;
                                this.context = document;
                                selector = document.getElementsByTagName( selector );
+                               return jQuery.merge( this, selector );
 
                        // HANDLE: $(expr, $(...))
                        } else if ( !context || context.jquery ) {
@@ -165,16 +177,14 @@ jQuery.fn = jQuery.prototype = {
                        this.context = selector.context;
                }
 
-               return jQuery.isArray( selector ) ?
-                       this.setArray( selector ) :
-                       jQuery.makeArray( selector, this );
+               return jQuery.makeArray( selector, this );
        },
 
        // Start with an empty selector
        selector: "",
 
        // The current version of jQuery being used
-       jquery: "1.4.1",
+       jquery: "1.4.2",
 
        // The default length of a jQuery object is 0
        length: 0,
@@ -204,7 +214,14 @@ jQuery.fn = jQuery.prototype = {
        // (returning the new matched element set)
        pushStack: function( elems, name, selector ) {
                // Build a new jQuery matched element set
-               var ret = jQuery( elems || null );
+               var ret = jQuery();
+
+               if ( jQuery.isArray( elems ) ) {
+                       push.apply( ret, elems );
+               
+               } else {
+                       jQuery.merge( ret, elems );
+               }
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
@@ -221,18 +238,6 @@ jQuery.fn = jQuery.prototype = {
                return ret;
        },
 
-       // Force the current matched set of elements to become
-       // the specified array of elements (destroying the stack in the process)
-       // You should use pushStack() in order to do this, but maintain the stack
-       setArray: function( elems ) {
-               // Resetting the length to 0, then using the native Array push
-               // is a super-fast way to populate an object with array-like properties
-               this.length = 0;
-               push.apply( this, elems );
-
-               return this;
-       },
-
        // Execute a callback for every element in the matched set.
        // (You can seed the arguments with an array of args, but this is
        // only used internally.)
@@ -492,6 +497,9 @@ jQuery.extend({
                if ( typeof data !== "string" || !data ) {
                        return null;
                }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
                
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
@@ -619,6 +627,7 @@ jQuery.extend({
                        for ( var l = second.length; j < l; j++ ) {
                                first[ i++ ] = second[ j ];
                        }
+               
                } else {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
@@ -807,7 +816,7 @@ function access( elems, key, value, exec, fn, pass ) {
        }
        
        // Getting an attribute
-       return length ? fn( elems[0], key ) : null;
+       return length ? fn( elems[0], key ) : undefined;
 }
 
 function now() {
@@ -871,7 +880,10 @@ function now() {
                // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
                optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
 
+               parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
+
                // Will be defined later
+               deleteExpando: true,
                checkClone: false,
                scriptEval: false,
                noCloneEvent: true,
@@ -893,6 +905,15 @@ function now() {
                delete window[ id ];
        }
 
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete script.test;
+       
+       } catch(e) {
+               jQuery.support.deleteExpando = false;
+       }
+
        root.removeChild( script );
 
        if ( div.attachEvent && div.fireEvent ) {
@@ -923,6 +944,7 @@ function now() {
                document.body.appendChild( div );
                jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
                document.body.removeChild( div ).style.display = 'none';
+
                div = null;
        });
 
@@ -962,7 +984,6 @@ jQuery.props = {
        frameborder: "frameBorder"
 };
 var expando = "jQuery" + now(), uuid = 0, windowData = {};
-var emptyObject = {};
 
 jQuery.extend({
        cache: {},
@@ -988,8 +1009,7 @@ jQuery.extend({
 
                var id = elem[ expando ], cache = jQuery.cache, thisCache;
 
-               // Handle the case where there's no name immediately
-               if ( !name && !id ) {
+               if ( !id && typeof name === "string" && data === undefined ) {
                        return null;
                }
 
@@ -1003,17 +1023,16 @@ jQuery.extend({
                if ( typeof name === "object" ) {
                        elem[ expando ] = id;
                        thisCache = cache[ id ] = jQuery.extend(true, {}, name);
-               } else if ( cache[ id ] ) {
-                       thisCache = cache[ id ];
-               } else if ( typeof data === "undefined" ) {
-                       thisCache = emptyObject;
-               } else {
-                       thisCache = cache[ id ] = {};
+
+               } else if ( !cache[ id ] ) {
+                       elem[ expando ] = id;
+                       cache[ id ] = {};
                }
 
+               thisCache = cache[ id ];
+
                // Prevent overriding the named cache with undefined values
                if ( data !== undefined ) {
-                       elem[ expando ] = id;
                        thisCache[ name ] = data;
                }
 
@@ -1045,15 +1064,11 @@ jQuery.extend({
 
                // Otherwise, we want to remove all of the element's data
                } else {
-                       // Clean up the element expando
-                       try {
-                               delete elem[ expando ];
-                       } catch( e ) {
-                               // IE has trouble directly removing the expando
-                               // but it's ok with using removeAttribute
-                               if ( elem.removeAttribute ) {
-                                       elem.removeAttribute( expando );
-                               }
+                       if ( jQuery.support.deleteExpando ) {
+                               delete elem[ jQuery.expando ];
+
+                       } else if ( elem.removeAttribute ) {
+                               elem.removeAttribute( jQuery.expando );
                        }
 
                        // Completely remove the data cache
@@ -1230,12 +1245,13 @@ jQuery.fn.extend({
                                                elem.className = value;
 
                                        } else {
-                                               var className = " " + elem.className + " ";
+                                               var className = " " + elem.className + " ", setClass = elem.className;
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
-                                                               elem.className += " " + classNames[c];
+                                                               setClass += " " + classNames[c];
                                                        }
                                                }
+                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
                        }
@@ -1264,7 +1280,7 @@ jQuery.fn.extend({
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
                                                        className = className.replace(" " + classNames[c] + " ", " ");
                                                }
-                                               elem.className = className.substring(1, className.length - 1);
+                                               elem.className = jQuery.trim( className );
 
                                        } else {
                                                elem.className = "";
@@ -1520,15 +1536,16 @@ jQuery.extend({
                }
 
                // elem is actually elem.style ... set the style
-               // Using attr for specific style information is now deprecated. Use style insead.
+               // Using attr for specific style information is now deprecated. Use style instead.
                return jQuery.style( elem, name, value );
        }
 });
-var fcleanup = function( nm ) {
-       return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
-               return "\\" + ch;
-       });
-};
+var rnamespaces = /\.(.*)$/,
+       fcleanup = function( nm ) {
+               return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
+                       return "\\" + ch;
+               });
+       };
 
 /*
  * A number of helper functions used for managing events.
@@ -1550,107 +1567,104 @@ jQuery.event = {
                        elem = window;
                }
 
+               var handleObjIn, handleObj;
+
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+               }
+
                // Make sure that the function being executed has a unique ID
                if ( !handler.guid ) {
                        handler.guid = jQuery.guid++;
                }
 
-               // if data is passed, bind to handler
-               if ( data !== undefined ) {
-                       // Create temporary function pointer to original handler
-                       var fn = handler;
-
-                       // Create unique handler function, wrapped around original handler
-                       handler = jQuery.proxy( fn );
+               // Init the element's event structure
+               var elemData = jQuery.data( elem );
 
-                       // Store data in unique handler
-                       handler.data = data;
+               // If no elemData is found then we must be trying to bind to one of the
+               // banned noData elements
+               if ( !elemData ) {
+                       return;
                }
 
-               // Init the element's event structure
-               var events = jQuery.data( elem, "events" ) || jQuery.data( elem, "events", {} ),
-                       handle = jQuery.data( elem, "handle" ), eventHandle;
+               var events = elemData.events = elemData.events || {},
+                       eventHandle = elemData.handle, eventHandle;
 
-               if ( !handle ) {
-                       eventHandle = function() {
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function() {
                                // Handle the second event of a trigger and when
                                // an event is called after a page has unloaded
                                return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
                                        undefined;
                        };
-
-                       handle = jQuery.data( elem, "handle", eventHandle );
-               }
-
-               // If no handle is found then we must be trying to bind to one of the
-               // banned noData elements
-               if ( !handle ) {
-                       return;
                }
 
                // Add elem as a property of the handle function
-               // This is to prevent a memory leak with non-native
-               // event in IE.
-               handle.elem = elem;
+               // This is to prevent a memory leak with non-native events in IE.
+               eventHandle.elem = elem;
 
                // Handle multiple events separated by a space
                // jQuery(...).bind("mouseover mouseout", fn);
-               types = types.split( /\s+/ );
+               types = types.split(" ");
 
-               var type, i = 0;
+               var type, i = 0, namespaces;
 
                while ( (type = types[ i++ ]) ) {
-                       // Namespaced event handlers
-                       var namespaces = type.split(".");
-                       type = namespaces.shift();
+                       handleObj = handleObjIn ?
+                               jQuery.extend({}, handleObjIn) :
+                               { handler: handler, data: data };
 
-                       if ( i > 1 ) {
-                               handler = jQuery.proxy( handler );
+                       // Namespaced event handlers
+                       if ( type.indexOf(".") > -1 ) {
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+                               handleObj.namespace = namespaces.slice(0).sort().join(".");
 
-                               if ( data !== undefined ) {
-                                       handler.data = data;
-                               }
+                       } else {
+                               namespaces = [];
+                               handleObj.namespace = "";
                        }
 
-                       handler.type = namespaces.slice(0).sort().join(".");
+                       handleObj.type = type;
+                       handleObj.guid = handler.guid;
 
                        // Get the current list of functions bound to this event
                        var handlers = events[ type ],
-                               special = this.special[ type ] || {};
+                               special = jQuery.event.special[ type ] || {};
 
                        // Init the event handler queue
                        if ( !handlers ) {
-                               handlers = events[ type ] = {};
+                               handlers = events[ type ] = [];
 
                                // Check for a special event handler
                                // Only use addEventListener/attachEvent if the special
                                // events handler returns false
-                               if ( !special.setup || special.setup.call( elem, data, namespaces, handler) === false ) {
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
                                        // Bind the global event handler to the element
                                        if ( elem.addEventListener ) {
-                                               elem.addEventListener( type, handle, false );
+                                               elem.addEventListener( type, eventHandle, false );
+
                                        } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, handle );
+                                               elem.attachEvent( "on" + type, eventHandle );
                                        }
                                }
                        }
                        
                        if ( special.add ) { 
-                               var modifiedHandler = special.add.call( elem, handler, data, namespaces, handlers ); 
-                               if ( modifiedHandler && jQuery.isFunction( modifiedHandler ) ) { 
-                                       modifiedHandler.guid = modifiedHandler.guid || handler.guid; 
-                                       modifiedHandler.data = modifiedHandler.data || handler.data; 
-                                       modifiedHandler.type = modifiedHandler.type || handler.type; 
-                                       handler = modifiedHandler; 
-                               } 
-                       } 
-                       
+                               special.add.call( elem, handleObj ); 
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
                        // Add the function to the element's handler list
-                       handlers[ handler.guid ] = handler;
+                       handlers.push( handleObj );
 
                        // Keep track of which events have been used, for global triggering
-                       this.global[ type ] = true;
+                       jQuery.event.global[ type ] = true;
                }
 
                // Nullify elem to prevent memory leaks in IE
@@ -1660,90 +1674,121 @@ jQuery.event = {
        global: {},
 
        // Detach an event or set of events from an element
-       remove: function( elem, types, handler ) {
+       remove: function( elem, types, handler, pos ) {
                // don't do events on text and comment nodes
                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
                        return;
                }
 
-               var events = jQuery.data( elem, "events" ), ret, type, fn;
+               var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+                       elemData = jQuery.data( elem ),
+                       events = elemData && elemData.events;
 
-               if ( events ) {
-                       // Unbind all events for the element
-                       if ( types === undefined || (typeof types === "string" && types.charAt(0) === ".") ) {
-                               for ( type in events ) {
-                                       this.remove( elem, type + (types || "") );
-                               }
-                       } else {
-                               // types is actually an event object here
-                               if ( types.type ) {
-                                       handler = types.handler;
-                                       types = types.type;
+               if ( !elemData || !events ) {
+                       return;
+               }
+
+               // types is actually an event object here
+               if ( types && types.type ) {
+                       handler = types.handler;
+                       types = types.type;
+               }
+
+               // Unbind all events for the element
+               if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+                       types = types || "";
+
+                       for ( type in events ) {
+                               jQuery.event.remove( elem, type + types );
+                       }
+
+                       return;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).unbind("mouseover mouseout", fn);
+               types = types.split(" ");
+
+               while ( (type = types[ i++ ]) ) {
+                       origType = type;
+                       handleObj = null;
+                       all = type.indexOf(".") < 0;
+                       namespaces = [];
+
+                       if ( !all ) {
+                               // Namespaced event handlers
+                               namespaces = type.split(".");
+                               type = namespaces.shift();
+
+                               namespace = new RegExp("(^|\\.)" + 
+                                       jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
+                       }
+
+                       eventType = events[ type ];
+
+                       if ( !eventType ) {
+                               continue;
+                       }
+
+                       if ( !handler ) {
+                               for ( var j = 0; j < eventType.length; j++ ) {
+                                       handleObj = eventType[ j ];
+
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               jQuery.event.remove( elem, origType, handleObj.handler, j );
+                                               eventType.splice( j--, 1 );
+                                       }
                                }
 
-                               // Handle multiple events separated by a space
-                               // jQuery(...).unbind("mouseover mouseout", fn);
-                               types = types.split(/\s+/);
-                               var i = 0;
-                               while ( (type = types[ i++ ]) ) {
-                                       // Namespaced event handlers
-                                       var namespaces = type.split(".");
-                                       type = namespaces.shift();
-                                       var all = !namespaces.length,
-                                               cleaned = jQuery.map( namespaces.slice(0).sort(), fcleanup ),
-                                               namespace = new RegExp("(^|\\.)" + cleaned.join("\\.(?:.*\\.)?") + "(\\.|$)"),
-                                               special = this.special[ type ] || {};
-
-                                       if ( events[ type ] ) {
-                                               // remove the given handler for the given type
-                                               if ( handler ) {
-                                                       fn = events[ type ][ handler.guid ];
-                                                       delete events[ type ][ handler.guid ];
-
-                                               // remove all handlers for the given type
-                                               } else {
-                                                       for ( var handle in events[ type ] ) {
-                                                               // Handle the removal of namespaced events
-                                                               if ( all || namespace.test( events[ type ][ handle ].type ) ) {
-                                                                       delete events[ type ][ handle ];
-                                                               }
-                                                       }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+
+                       for ( var j = pos || 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( handler.guid === handleObj.guid ) {
+                                       // remove the given handler for the given type
+                                       if ( all || namespace.test( handleObj.namespace ) ) {
+                                               if ( pos == null ) {
+                                                       eventType.splice( j--, 1 );
                                                }
 
                                                if ( special.remove ) {
-                                                       special.remove.call( elem, namespaces, fn);
+                                                       special.remove.call( elem, handleObj );
                                                }
+                                       }
 
-                                               // remove generic event handler if no more handlers exist
-                                               for ( ret in events[ type ] ) {
-                                                       break;
-                                               }
-                                               if ( !ret ) {
-                                                       if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
-                                                               if ( elem.removeEventListener ) {
-                                                                       elem.removeEventListener( type, jQuery.data( elem, "handle" ), false );
-                                                               } else if ( elem.detachEvent ) {
-                                                                       elem.detachEvent( "on" + type, jQuery.data( elem, "handle" ) );
-                                                               }
-                                                       }
-                                                       ret = null;
-                                                       delete events[ type ];
-                                               }
+                                       if ( pos != null ) {
+                                               break;
                                        }
                                }
                        }
 
-                       // Remove the expando if it's no longer used
-                       for ( ret in events ) {
-                               break;
-                       }
-                       if ( !ret ) {
-                               var handle = jQuery.data( elem, "handle" );
-                               if ( handle ) {
-                                       handle.elem = null;
+                       // remove generic event handler if no more handlers exist
+                       if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                                       removeEvent( elem, type, elemData.handle );
                                }
-                               jQuery.removeData( elem, "events" );
-                               jQuery.removeData( elem, "handle" );
+
+                               ret = null;
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       var handle = elemData.handle;
+                       if ( handle ) {
+                               handle.elem = null;
+                       }
+
+                       delete elemData.events;
+                       delete elemData.handle;
+
+                       if ( jQuery.isEmptyObject( elemData ) ) {
+                               jQuery.removeData( elem );
                        }
                }
        },
@@ -1774,7 +1819,7 @@ jQuery.event = {
                                event.stopPropagation();
 
                                // Only trigger if we've ever bound an event for it
-                               if ( this.global[ type ] ) {
+                               if ( jQuery.event.global[ type ] ) {
                                        jQuery.each( jQuery.cache, function() {
                                                if ( this.events && this.events[type] ) {
                                                        jQuery.event.trigger( event, data, this.handle.elem );
@@ -1825,9 +1870,12 @@ jQuery.event = {
 
                } else if ( !event.isDefaultPrevented() ) {
                        var target = event.target, old,
-                               isClick = jQuery.nodeName(target, "a") && type === "click";
+                               isClick = jQuery.nodeName(target, "a") && type === "click",
+                               special = jQuery.event.special[ type ] || {};
+
+                       if ( (!special._default || special._default.call( elem, event ) === false) && 
+                               !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
 
-                       if ( !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
                                try {
                                        if ( target[ type ] ) {
                                                // Make sure that we don't accidentally re-trigger the onFOO events
@@ -1837,7 +1885,7 @@ jQuery.event = {
                                                        target[ "on" + type ] = null;
                                                }
 
-                                               this.triggered = true;
+                                               jQuery.event.triggered = true;
                                                target[ type ]();
                                        }
 
@@ -1848,53 +1896,57 @@ jQuery.event = {
                                        target[ "on" + type ] = old;
                                }
 
-                               this.triggered = false;
+                               jQuery.event.triggered = false;
                        }
                }
        },
 
        handle: function( event ) {
-               // returned undefined or false
-               var all, handlers;
+               var all, handlers, namespaces, namespace, events;
 
                event = arguments[0] = jQuery.event.fix( event || window.event );
                event.currentTarget = this;
 
                // Namespaced event handlers
-               var namespaces = event.type.split(".");
-               event.type = namespaces.shift();
+               all = event.type.indexOf(".") < 0 && !event.exclusive;
 
-               // Cache this now, all = true means, any handler
-               all = !namespaces.length && !event.exclusive;
-
-               var namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
+               if ( !all ) {
+                       namespaces = event.type.split(".");
+                       event.type = namespaces.shift();
+                       namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
+               }
 
-               handlers = ( jQuery.data(this, "events") || {} )[ event.type ];
+               var events = jQuery.data(this, "events"), handlers = events[ event.type ];
 
-               for ( var j in handlers ) {
-                       var handler = handlers[ j ];
+               if ( events && handlers ) {
+                       // Clone the handlers to prevent manipulation
+                       handlers = handlers.slice(0);
 
-                       // Filter the functions by class
-                       if ( all || namespace.test(handler.type) ) {
-                               // Pass in a reference to the handler function itself
-                               // So that we can later remove it
-                               event.handler = handler;
-                               event.data = handler.data;
+                       for ( var j = 0, l = handlers.length; j < l; j++ ) {
+                               var handleObj = handlers[ j ];
 
-                               var ret = handler.apply( this, arguments );
+                               // Filter the functions by class
+                               if ( all || namespace.test( handleObj.namespace ) ) {
+                                       // Pass in a reference to the handler function itself
+                                       // So that we can later remove it
+                                       event.handler = handleObj.handler;
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+       
+                                       var ret = handleObj.handler.apply( this, arguments );
 
-                               if ( ret !== undefined ) {
-                                       event.result = ret;
-                                       if ( ret === false ) {
-                                               event.preventDefault();
-                                               event.stopPropagation();
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
                                        }
-                               }
 
-                               if ( event.isImmediatePropagationStopped() ) {
-                                       break;
+                                       if ( event.isImmediatePropagationStopped() ) {
+                                               break;
+                                       }
                                }
-
                        }
                }
 
@@ -1973,44 +2025,39 @@ jQuery.event = {
                },
 
                live: {
-                       add: function( proxy, data, namespaces, live ) {
-                               jQuery.extend( proxy, data || {} );
-
-                               proxy.guid += data.selector + data.live; 
-                               data.liveProxy = proxy;
-
-                               jQuery.event.add( this, data.live, liveHandler, data ); 
-                               
+                       add: function( handleObj ) {
+                               jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
                        },
 
-                       remove: function( namespaces ) {
-                               if ( namespaces.length ) {
-                                       var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
-
-                                       jQuery.each( (jQuery.data(this, "events").live || {}), function() {
-                                               if ( name.test(this.type) ) {
-                                                       remove++;
-                                               }
-                                       });
-
-                                       if ( remove < 1 ) {
-                                               jQuery.event.remove( this, namespaces[0], liveHandler );
+                       remove: function( handleObj ) {
+                               var remove = true,
+                                       type = handleObj.origType.replace(rnamespaces, "");
+                               
+                               jQuery.each( jQuery.data(this, "events").live || [], function() {
+                                       if ( type === this.origType.replace(rnamespaces, "") ) {
+                                               remove = false;
+                                               return false;
                                        }
+                               });
+
+                               if ( remove ) {
+                                       jQuery.event.remove( this, handleObj.origType, liveHandler );
                                }
-                       },
-                       special: {}
+                       }
+
                },
+
                beforeunload: {
-                       setup: function( data, namespaces, fn ) {
+                       setup: function( data, namespaces, eventHandle ) {
                                // We only want to do this special case on windows
                                if ( this.setInterval ) {
-                                       this.onbeforeunload = fn;
+                                       this.onbeforeunload = eventHandle;
                                }
 
                                return false;
                        },
-                       teardown: function( namespaces, fn ) {
-                               if ( this.onbeforeunload === fn ) {
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
                                        this.onbeforeunload = null;
                                }
                        }
@@ -2018,6 +2065,14 @@ jQuery.event = {
        }
 };
 
+var removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               elem.removeEventListener( type, handle, false );
+       } : 
+       function( elem, type, handle ) {
+               elem.detachEvent( "on" + type, handle );
+       };
+
 jQuery.Event = function( src ) {
        // Allow instantiation without the 'new' keyword
        if ( !this.preventDefault ) {
@@ -2095,27 +2150,24 @@ var withinElement = function( event ) {
        // Check if mouse(over|out) are still within the same parent element
        var parent = event.relatedTarget;
 
-       // Traverse up the tree
-       while ( parent && parent !== this ) {
-               // Firefox sometimes assigns relatedTarget a XUL element
-               // which we cannot access the parentNode property of
-               try {
+       // Firefox sometimes assigns relatedTarget a XUL element
+       // which we cannot access the parentNode property of
+       try {
+               // Traverse up the tree
+               while ( parent && parent !== this ) {
                        parent = parent.parentNode;
-
-               // assuming we've left the element since we most likely mousedover a xul element
-               } catch(e) {
-                       break;
                }
-       }
 
-       if ( parent !== this ) {
-               // set the correct event type
-               event.type = event.data;
+               if ( parent !== this ) {
+                       // set the correct event type
+                       event.type = event.data;
 
-               // handle event if we actually just moused on to a non sub-element
-               jQuery.event.handle.apply( this, arguments );
-       }
+                       // handle event if we actually just moused on to a non sub-element
+                       jQuery.event.handle.apply( this, arguments );
+               }
 
+       // assuming we've left the element since we most likely mousedover a xul element
+       } catch(e) { }
 },
 
 // In case of event delegation, we only need to rename the event.type,
@@ -2143,64 +2195,65 @@ jQuery.each({
 // submit delegation
 if ( !jQuery.support.submitBubbles ) {
 
-jQuery.event.special.submit = {
-       setup: function( data, namespaces, fn ) {
-               if ( this.nodeName.toLowerCase() !== "form" ) {
-                       jQuery.event.add(this, "click.specialSubmit." + fn.guid, function( e ) {
-                               var elem = e.target, type = elem.type;
+       jQuery.event.special.submit = {
+               setup: function( data, namespaces ) {
+                       if ( this.nodeName.toLowerCase() !== "form" ) {
+                               jQuery.event.add(this, "click.specialSubmit", function( e ) {
+                                       var elem = e.target, type = elem.type;
 
-                               if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
-                                       return trigger( "submit", this, arguments );
-                               }
-                       });
+                                       if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+                                               return trigger( "submit", this, arguments );
+                                       }
+                               });
         
-                       jQuery.event.add(this, "keypress.specialSubmit." + fn.guid, function( e ) {
-                               var elem = e.target, type = elem.type;
+                               jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+                                       var elem = e.target, type = elem.type;
 
-                               if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
-                                       return trigger( "submit", this, arguments );
-                               }
-                       });
+                                       if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+                                               return trigger( "submit", this, arguments );
+                                       }
+                               });
 
-               } else {
-                       return false;
-               }
-       },
+                       } else {
+                               return false;
+                       }
+               },
 
-       remove: function( namespaces, fn ) {
-               jQuery.event.remove( this, "click.specialSubmit" + (fn ? "."+fn.guid : "") );
-               jQuery.event.remove( this, "keypress.specialSubmit" + (fn ? "."+fn.guid : "") );
-       }
-};
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialSubmit" );
+               }
+       };
 
 }
 
 // change delegation, happens here so we have bind.
 if ( !jQuery.support.changeBubbles ) {
 
-var formElems = /textarea|input|select/i;
+       var formElems = /textarea|input|select/i,
 
-function getVal( elem ) {
-       var type = elem.type, val = elem.value;
+       changeFilters,
 
-       if ( type === "radio" || type === "checkbox" ) {
-               val = elem.checked;
+       getVal = function( elem ) {
+               var type = elem.type, val = elem.value;
 
-       } else if ( type === "select-multiple" ) {
-               val = elem.selectedIndex > -1 ?
-                       jQuery.map( elem.options, function( elem ) {
-                               return elem.selected;
-                       }).join("-") :
-                       "";
+               if ( type === "radio" || type === "checkbox" ) {
+                       val = elem.checked;
 
-       } else if ( elem.nodeName.toLowerCase() === "select" ) {
-               val = elem.selectedIndex;
-       }
+               } else if ( type === "select-multiple" ) {
+                       val = elem.selectedIndex > -1 ?
+                               jQuery.map( elem.options, function( elem ) {
+                                       return elem.selected;
+                               }).join("-") :
+                               "";
 
-       return val;
-}
+               } else if ( elem.nodeName.toLowerCase() === "select" ) {
+                       val = elem.selectedIndex;
+               }
+
+               return val;
+       },
 
-function testChange( e ) {
+       testChange = function testChange( e ) {
                var elem = e.target, data, val;
 
                if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
@@ -2223,61 +2276,61 @@ function testChange( e ) {
                        e.type = "change";
                        return jQuery.event.trigger( e, arguments[1], elem );
                }
-}
+       };
 
-jQuery.event.special.change = {
-       filters: {
-               focusout: testChange, 
+       jQuery.event.special.change = {
+               filters: {
+                       focusout: testChange, 
 
-               click: function( e ) {
-                       var elem = e.target, type = elem.type;
+                       click: function( e ) {
+                               var elem = e.target, type = elem.type;
 
-                       if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
-                               return testChange.call( this, e );
-                       }
-               },
+                               if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+                                       return testChange.call( this, e );
+                               }
+                       },
+
+                       // Change has to be called before submit
+                       // Keydown will be called before keypress, which is used in submit-event delegation
+                       keydown: function( e ) {
+                               var elem = e.target, type = elem.type;
 
-               // Change has to be called before submit
-               // Keydown will be called before keypress, which is used in submit-event delegation
-               keydown: function( e ) {
-                       var elem = e.target, type = elem.type;
+                               if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+                                       (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+                                       type === "select-multiple" ) {
+                                       return testChange.call( this, e );
+                               }
+                       },
 
-                       if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
-                               (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
-                               type === "select-multiple" ) {
-                               return testChange.call( this, e );
+                       // Beforeactivate happens also before the previous element is blurred
+                       // with this event you can't trigger a change event, but you can store
+                       // information/focus[in] is not needed anymore
+                       beforeactivate: function( e ) {
+                               var elem = e.target;
+                               jQuery.data( elem, "_change_data", getVal(elem) );
                        }
                },
 
-               // Beforeactivate happens also before the previous element is blurred
-               // with this event you can't trigger a change event, but you can store
-               // information/focus[in] is not needed anymore
-               beforeactivate: function( e ) {
-                       var elem = e.target;
+               setup: function( data, namespaces ) {
+                       if ( this.type === "file" ) {
+                               return false;
+                       }
 
-                       if ( elem.nodeName.toLowerCase() === "input" && elem.type === "radio" ) {
-                               jQuery.data( elem, "_change_data", getVal(elem) );
+                       for ( var type in changeFilters ) {
+                               jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
                        }
-               }
-       },
-       setup: function( data, namespaces, fn ) {
-               for ( var type in changeFilters ) {
-                       jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] );
-               }
 
-               return formElems.test( this.nodeName );
-       },
-       remove: function( namespaces, fn ) {
-               for ( var type in changeFilters ) {
-                       jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] );
-               }
+                       return formElems.test( this.nodeName );
+               },
 
-               return formElems.test( this.nodeName );
-       }
-};
+               teardown: function( namespaces ) {
+                       jQuery.event.remove( this, ".specialChange" );
 
-var changeFilters = jQuery.event.special.change.filters;
+                       return formElems.test( this.nodeName );
+               }
+       };
 
+       changeFilters = jQuery.event.special.change.filters;
 }
 
 function trigger( type, elem, args ) {
@@ -2325,11 +2378,16 @@ jQuery.each(["bind", "one"], function( i, name ) {
                        return fn.apply( this, arguments );
                }) : fn;
 
-               return type === "unload" && name !== "one" ?
-                       this.one( type, data, fn ) :
-                       this.each(function() {
-                               jQuery.event.add( this, type, handler, data );
-                       });
+               if ( type === "unload" && name !== "one" ) {
+                       this.one( type, data, fn );
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.add( this[i], type, handler, data );
+                       }
+               }
+
+               return this;
        };
 });
 
@@ -2340,13 +2398,29 @@ jQuery.fn.extend({
                        for ( var key in type ) {
                                this.unbind(key, type[key]);
                        }
-                       return this;
+
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ) {
+                               jQuery.event.remove( this[i], type, fn );
+                       }
                }
 
-               return this.each(function() {
-                       jQuery.event.remove( this, type, fn );
-               });
+               return this;
+       },
+       
+       delegate: function( selector, types, data, fn ) {
+               return this.live( types, data, fn, selector );
+       },
+       
+       undelegate: function( selector, types, fn ) {
+               if ( arguments.length === 0 ) {
+                               return this.unbind( "live" );
+               
+               } else {
+                       return this.die( types, null, fn, selector );
+               }
        },
+       
        trigger: function( type, data ) {
                return this.each(function() {
                        jQuery.event.trigger( type, data, this );
@@ -2390,32 +2464,60 @@ jQuery.fn.extend({
        }
 });
 
+var liveMap = {
+       focus: "focusin",
+       blur: "focusout",
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+};
+
 jQuery.each(["live", "die"], function( i, name ) {
-       jQuery.fn[ name ] = function( types, data, fn ) {
-               var type, i = 0;
+       jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+               var type, i = 0, match, namespaces, preType,
+                       selector = origSelector || this.selector,
+                       context = origSelector ? this : jQuery( this.context );
 
                if ( jQuery.isFunction( data ) ) {
                        fn = data;
                        data = undefined;
                }
 
-               types = (types || "").split( /\s+/ );
+               types = (types || "").split(" ");
 
                while ( (type = types[ i++ ]) != null ) {
-                       type = type === "focus" ? "focusin" : // focus --> focusin
-                                       type === "blur" ? "focusout" : // blur --> focusout
-                                       type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support
-                                       type;
-                       
+                       match = rnamespaces.exec( type );
+                       namespaces = "";
+
+                       if ( match )  {
+                               namespaces = match[0];
+                               type = type.replace( rnamespaces, "" );
+                       }
+
+                       if ( type === "hover" ) {
+                               types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+                               continue;
+                       }
+
+                       preType = type;
+
+                       if ( type === "focus" || type === "blur" ) {
+                               types.push( liveMap[ type ] + namespaces );
+                               type = type + namespaces;
+
+                       } else {
+                               type = (liveMap[ type ] || type) + namespaces;
+                       }
+
                        if ( name === "live" ) {
                                // bind live handler
-                               jQuery( this.context ).bind( liveConvert( type, this.selector ), {
-                                       data: data, selector: this.selector, live: type
-                               }, fn );
+                               context.each(function(){
+                                       jQuery.event.add( this, liveConvert( type, selector ),
+                                               { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+                               });
 
                        } else {
                                // unbind live handler
-                               jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
+                               context.unbind( liveConvert( type, selector ), fn );
                        }
                }
                
@@ -2425,45 +2527,46 @@ jQuery.each(["live", "die"], function( i, name ) {
 
 function liveHandler( event ) {
        var stop, elems = [], selectors = [], args = arguments,
-               related, match, fn, elem, j, i, l, data,
-               live = jQuery.extend({}, jQuery.data( this, "events" ).live);
+               related, match, handleObj, elem, j, i, l, data,
+               events = jQuery.data( this, "events" );
 
        // Make sure we avoid non-left-click bubbling in Firefox (#3861)
-       if ( event.button && event.type === "click" ) {
+       if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
                return;
        }
 
-       for ( j in live ) {
-               fn = live[j];
-               if ( fn.live === event.type ||
-                               fn.altLive && jQuery.inArray(event.type, fn.altLive) > -1 ) {
+       event.liveFired = this;
+
+       var live = events.live.slice(0);
+
+       for ( j = 0; j < live.length; j++ ) {
+               handleObj = live[j];
+
+               if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+                       selectors.push( handleObj.selector );
 
-                       data = fn.data;
-                       if ( !(data.beforeFilter && data.beforeFilter[event.type] && 
-                                       !data.beforeFilter[event.type](event)) ) {
-                               selectors.push( fn.selector );
-                       }
                } else {
-                       delete live[j];
+                       live.splice( j--, 1 );
                }
        }
 
        match = jQuery( event.target ).closest( selectors, event.currentTarget );
 
        for ( i = 0, l = match.length; i < l; i++ ) {
-               for ( j in live ) {
-                       fn = live[j];
-                       elem = match[i].elem;
-                       related = null;
+               for ( j = 0; j < live.length; j++ ) {
+                       handleObj = live[j];
+
+                       if ( match[i].selector === handleObj.selector ) {
+                               elem = match[i].elem;
+                               related = null;
 
-                       if ( match[i].selector === fn.selector ) {
                                // Those two events require additional checking
-                               if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) {
-                                       related = jQuery( event.relatedTarget ).closest( fn.selector )[0];
+                               if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+                                       related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
                                }
 
                                if ( !related || related !== elem ) {
-                                       elems.push({ elem: elem, fn: fn });
+                                       elems.push({ elem: elem, handleObj: handleObj });
                                }
                        }
                }
@@ -2472,8 +2575,10 @@ function liveHandler( event ) {
        for ( i = 0, l = elems.length; i < l; i++ ) {
                match = elems[i];
                event.currentTarget = match.elem;
-               event.data = match.fn.data;
-               if ( match.fn.apply( match.elem, args ) === false ) {
+               event.data = match.handleObj.data;
+               event.handleObj = match.handleObj;
+
+               if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
                        stop = false;
                        break;
                }
@@ -2483,7 +2588,7 @@ function liveHandler( event ) {
 }
 
 function liveConvert( type, selector ) {
-       return "live." + (type ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
+       return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
 }
 
 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
@@ -3228,8 +3333,10 @@ var makeArray = function(array, results) {
 
 // Perform a simple check to determine if the browser is capable of
 // converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
 try {
-       Array.prototype.slice.call( document.documentElement.childNodes, 0 );
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
 // Provide a fallback method if it does not work
 } catch(e){
@@ -3533,7 +3640,7 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 }
 
 var contains = document.compareDocumentPosition ? function(a, b){
-       return a.compareDocumentPosition(b) & 16;
+       return !!(a.compareDocumentPosition(b) & 16);
 } : function(a, b){
        return a !== b && (a.contains ? a.contains(b) : true);
 };
@@ -3570,7 +3677,7 @@ jQuery.find = Sizzle;
 jQuery.expr = Sizzle.selectors;
 jQuery.expr[":"] = jQuery.expr.filters;
 jQuery.unique = Sizzle.uniqueSort;
-jQuery.getText = getText;
+jQuery.text = getText;
 jQuery.isXMLDoc = isXML;
 jQuery.contains = contains;
 
@@ -3856,7 +3963,8 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
        rtagName = /<([\w:]+)/,
        rtbody = /<tbody/i,
-       rhtml = /<|&\w+;/,
+       rhtml = /<|&#?\w+;/,
+       rnocache = /<script|<object|<embed|<option|<style/i,
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
        fcloseTag = function( all, front, tag ) {
                return rselfClosing.test( tag ) ?
@@ -3896,7 +4004,7 @@ jQuery.fn.extend({
                        return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
                }
 
-               return jQuery.getText( this );
+               return jQuery.text( this );
        },
 
        wrapAll: function( html ) {
@@ -4000,6 +4108,40 @@ jQuery.fn.extend({
                        return set;
                }
        },
+       
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                        elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+               
+               return this;
+       },
+
+       empty: function() {
+               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+               
+               return this;
+       },
 
        clone: function( events ) {
                // Do the clone
@@ -4021,6 +4163,8 @@ jQuery.fn.extend({
                                }
 
                                return jQuery.clean([html.replace(rinlinejQuery, "")
+                                       // Handle the case in IE 8 where action=/test/> self-closes a tag
+                                       .replace(/=([^="'>\s]+\/)>/g, '="$1">')
                                        .replace(rleadingWhitespace, "")], ownerDocument)[0];
                        } else {
                                return this.cloneNode(true);
@@ -4044,7 +4188,7 @@ jQuery.fn.extend({
                                null;
 
                // See if we can take a shortcut and just use innerHTML
-               } else if ( typeof value === "string" && !/<script/i.test( value ) &&
+               } else if ( typeof value === "string" && !rnocache.test( value ) &&
                        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
                        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
 
@@ -4083,16 +4227,17 @@ jQuery.fn.extend({
                if ( this[0] && this[0].parentNode ) {
                        // Make sure that the elements are removed from the DOM before they are inserted
                        // this can help fix replacing a parent with child elements
-                       if ( !jQuery.isFunction( value ) ) {
-                               value = jQuery( value ).detach();
-
-                       } else {
+                       if ( jQuery.isFunction( value ) ) {
                                return this.each(function(i) {
                                        var self = jQuery(this), old = self.html();
                                        self.replaceWith( value.call( this, i, old ) );
                                });
                        }
 
+                       if ( typeof value !== "string" ) {
+                               value = jQuery(value).detach();
+                       }
+
                        return this.each(function() {
                                var next = this.nextSibling, parent = this.parentNode;
 
@@ -4114,7 +4259,7 @@ jQuery.fn.extend({
        },
 
        domManip: function( args, table, callback ) {
-               var results, first, value = args[0], scripts = [];
+               var results, first, value = args[0], scripts = [], fragment, parent;
 
                // We can't cloneNode fragments that contain checked, in WebKit
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
@@ -4132,14 +4277,23 @@ jQuery.fn.extend({
                }
 
                if ( this[0] ) {
+                       parent = value && value.parentNode;
+
                        // If we're in a fragment, just use that instead of building a new one
-                       if ( args[0] && args[0].parentNode && args[0].parentNode.nodeType === 11 ) {
-                               results = { fragment: args[0].parentNode };
+                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+                               results = { fragment: parent };
+
                        } else {
                                results = buildFragment( args, this, scripts );
                        }
-
-                       first = results.fragment.firstChild;
+                       
+                       fragment = results.fragment;
+                       
+                       if ( fragment.childNodes.length === 1 ) {
+                               first = fragment = fragment.firstChild;
+                       } else {
+                               first = fragment.firstChild;
+                       }
 
                        if ( first ) {
                                table = table && jQuery.nodeName( first, "tr" );
@@ -4149,14 +4303,14 @@ jQuery.fn.extend({
                                                table ?
                                                        root(this[i], first) :
                                                        this[i],
-                                               results.cacheable || this.length > 1 || i > 0 ?
-                                                       results.fragment.cloneNode(true) :
-                                                       results.fragment
+                                               i > 0 || results.cacheable || this.length > 1  ?
+                                                       fragment.cloneNode(true) :
+                                                       fragment
                                        );
                                }
                        }
 
-                       if ( scripts ) {
+                       if ( scripts.length ) {
                                jQuery.each( scripts, evalScript );
                        }
                }
@@ -4196,10 +4350,16 @@ function cloneCopyEvent(orig, ret) {
 }
 
 function buildFragment( args, nodes, scripts ) {
-       var fragment, cacheable, cacheresults, doc;
+       var fragment, cacheable, cacheresults,
+               doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+       // Only cache "small" (1/2 KB) strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+               !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
 
-       // webkit does not clone 'checked' attribute of radio inputs on cloneNode, so don't cache if string has a checked
-       if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && args[0].indexOf("<option") < 0 && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
                cacheable = true;
                cacheresults = jQuery.fragments[ args[0] ];
                if ( cacheresults ) {
@@ -4210,7 +4370,6 @@ function buildFragment( args, nodes, scripts ) {
        }
 
        if ( !fragment ) {
-               doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
                fragment = doc.createDocumentFragment();
                jQuery.clean( args, doc, fragment, scripts );
        }
@@ -4232,46 +4391,22 @@ jQuery.each({
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
-               var ret = [], insert = jQuery( selector );
-
-               for ( var i = 0, l = insert.length; i < l; i++ ) {
-                       var elems = (i > 0 ? this.clone(true) : this).get();
-                       jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
-                       ret = ret.concat( elems );
-               }
-               return this.pushStack( ret, name, insert.selector );
-       };
-});
-
-jQuery.each({
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
-                       if ( !keepData && this.nodeType === 1 ) {
-                               jQuery.cleanData( this.getElementsByTagName("*") );
-                               jQuery.cleanData( [ this ] );
-                       }
-
-                       if ( this.parentNode ) {
-                                this.parentNode.removeChild( this );
+               var ret = [], insert = jQuery( selector ),
+                       parent = this.length === 1 && this[0].parentNode;
+               
+               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+                       
+               } else {
+                       for ( var i = 0, l = insert.length; i < l; i++ ) {
+                               var elems = (i > 0 ? this.clone(true) : this).get();
+                               jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+                               ret = ret.concat( elems );
                        }
+               
+                       return this.pushStack( ret, name, insert.selector );
                }
-       },
-
-       empty: function() {
-               // Remove element nodes and prevent memory leaks
-               if ( this.nodeType === 1 ) {
-                       jQuery.cleanData( this.getElementsByTagName("*") );
-               }
-
-               // Remove any remaining nodes
-               while ( this.firstChild ) {
-                       this.removeChild( this.firstChild );
-               }
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function() {
-               return this.each( fn, arguments );
        };
 });
 
@@ -4286,13 +4421,13 @@ jQuery.extend({
 
                var ret = [];
 
-               jQuery.each(elems, function( i, elem ) {
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
                        if ( typeof elem === "number" ) {
                                elem += "";
                        }
 
                        if ( !elem ) {
-                               return;
+                               continue;
                        }
 
                        // Convert html string into DOM nodes
@@ -4343,7 +4478,7 @@ jQuery.extend({
                                        div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
                                }
 
-                               elem = jQuery.makeArray( div.childNodes );
+                               elem = div.childNodes;
                        }
 
                        if ( elem.nodeType ) {
@@ -4351,13 +4486,13 @@ jQuery.extend({
                        } else {
                                ret = jQuery.merge( ret, elem );
                        }
-
-               });
+               }
 
                if ( fragment ) {
                        for ( var i = 0; ret[i]; i++ ) {
                                if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
                                        scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+                               
                                } else {
                                        if ( ret[i].nodeType === 1 ) {
                                                ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
@@ -4371,9 +4506,36 @@ jQuery.extend({
        },
        
        cleanData: function( elems ) {
-               for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) {
-                       jQuery.event.remove( elem );
-                       jQuery.removeData( elem );
+               var data, id, cache = jQuery.cache,
+                       special = jQuery.event.special,
+                       deleteExpando = jQuery.support.deleteExpando;
+               
+               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+                       id = elem[ jQuery.expando ];
+                       
+                       if ( id ) {
+                               data = cache[ id ];
+                               
+                               if ( data.events ) {
+                                       for ( var type in data.events ) {
+                                               if ( special[ type ] ) {
+                                                       jQuery.event.remove( elem, type );
+
+                                               } else {
+                                                       removeEvent( elem, type, data.handle );
+                                               }
+                                       }
+                               }
+                               
+                               if ( deleteExpando ) {
+                                       delete elem[ jQuery.expando ];
+
+                               } else if ( elem.removeAttribute ) {
+                                       elem.removeAttribute( jQuery.expando );
+                               }
+                               
+                               delete cache[ id ];
+                       }
                }
        }
 });
@@ -4614,15 +4776,15 @@ var jsc = now(),
        rquery = /\?/,
        rts = /(\?|&)_=.*?(&|$)/,
        rurl = /^(\w+:)?\/\/([^\/?#]+)/,
-       r20 = /%20/g;
+       r20 = /%20/g,
 
-jQuery.fn.extend({
-       // Keep a copy of the old load
-       _load: jQuery.fn.load,
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load;
 
+jQuery.fn.extend({
        load: function( url, params, callback ) {
                if ( typeof url !== "string" ) {
-                       return this._load( url );
+                       return _load.call( this, url );
 
                // Don't do a request if no elements are being requested
                } else if ( !this.length ) {
@@ -5243,7 +5405,7 @@ jQuery.extend({
                        if ( jQuery.isArray(obj) ) {
                                // Serialize array item.
                                jQuery.each( obj, function( i, v ) {
-                                       if ( traditional ) {
+                                       if ( traditional || /\[\]$/.test( prefix ) ) {
                                                // Treat each array item as a scalar.
                                                add( prefix, v );
                                        } else {
index 950198f4770f8135ea7708da4e6a73b33c0d40ec..b170a78f8fbda267b82abbe51da6dacb2157c7c0 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.4.1
+ * jQuery JavaScript Library v1.4.2
  * http://jquery.com/
  *
  * Copyright 2010, John Resig
  * Copyright 2010, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Mon Jan 25 19:43:33 2010 -0500
+ * Date: Sat Feb 13 22:33:48 2010 -0500
  */
-(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n<j;n++)e(a[n],b,f?d.call(a[n],n,e(a[n],b)):d,i);return a}return j?
-e(a[0],b):null}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function ma(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function na(a){var b,d=[],f=[],e=arguments,i,j,n,o,m,s,x=c.extend({},c.data(this,"events").live);if(!(a.button&&a.type==="click")){for(o in x){j=x[o];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f,
-a.currentTarget);m=0;for(s=i.length;m<s;m++)for(o in x){j=x[o];n=i[m].elem;f=null;if(i[m].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==n)d.push({elem:n,fn:j})}}m=0;for(s=d.length;m<s;m++){i=d[m];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}}function oa(a,b){return"live."+(a?a+".":"")+b.replace(/\./g,"`").replace(/ /g,"&")}function pa(a){return!a||!a.parentNode||a.parentNode.nodeType===
-11}function qa(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ra(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0&&(c.support.checkClone||!sa.test(a[0]))){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:r;f=b.createDocumentFragment();
-c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=i?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(ta.concat.apply([],ta.slice(0,b)),function(){d[this]=a});return d}function ua(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Na=z.jQuery,Oa=z.$,r=z.document,S,Pa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent,
-va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]],
-[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,
-this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this,
-a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};
-c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];n=e[i];if(a!==n)if(f&&n&&(c.isPlainObject(n)||c.isArray(n))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(n)?[]:{};a[i]=c.extend(f,j,n)}else if(n!==v)a[i]=n}return a};c.extend({noConflict:function(a){z.$=
-Oa;if(a)z.jQuery=Na;return c},isReady:false,ready:function(){if(!c.isReady){if(!r.body)return setTimeout(c.ready,13);c.isReady=true;if(P){for(var a,b=0;a=P[b++];)a.call(r,c);P=null}c.fn.triggerHandler&&c(r).triggerHandler("ready")}},bindReady:function(){if(!va){va=true;if(r.readyState==="complete")return c.ready();if(r.addEventListener){r.addEventListener("DOMContentLoaded",L,false);z.addEventListener("load",c.ready,false)}else if(r.attachEvent){r.attachEvent("onreadystatechange",L);z.attachEvent("onload",
-c.ready);var a=false;try{a=z.frameElement==null}catch(b){}r.documentElement.doScroll&&a&&la()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===v||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;
-return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return z.JSON&&z.JSON.parse?z.JSON.parse(a):(new Function("return "+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Ra.test(a)){var b=r.getElementsByTagName("head")[0]||
-r.documentElement,d=r.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(r.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===v||c.isFunction(a);if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=
-a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Sa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==
-v;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=v}else if(b&&!c.isFunction(b)){d=b;b=v}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},
-uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});O=c.uaMatch(O);if(O.browser){c.browser[O.browser]=true;c.browser.version=O.version}if(c.browser.webkit)c.browser.safari=true;if(wa)c.inArray=function(a,b){return wa.call(b,a)};S=c(r);if(r.addEventListener)L=function(){r.removeEventListener("DOMContentLoaded",
-L,false);c.ready()};else if(r.attachEvent)L=function(){if(r.readyState==="complete"){r.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=r.documentElement,b=r.createElement("script"),d=r.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support=
-{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
-b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=r.createDocumentFragment();a.appendChild(d.firstChild);
-c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props=
-{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true,
-{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,
-a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);
-return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||
-a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=
-c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,n=b.length;j<n;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=c(this);m.removeClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string"||a===v)for(var b=(a||"").split(ca),
-d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(ya," "),j=0,n=b.length;j<n;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),n=b,o=
-a.split(ca);e=o[i++];){n=f?n:!j.hasClass(e);j[n?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(ya," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||
-{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(za.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Wa,"")}return v}var n=c.isFunction(a);return this.each(function(o){var m=c(this),s=a;if(this.nodeType===1){if(n)s=a.call(this,o,m.val());
-if(typeof s==="number")s+="";if(c.isArray(s)&&za.test(this.type))this.checked=c.inArray(m.val(),s)>=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d);
-f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=
-""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=
-function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a,
-d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+
-s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a,
-"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,
-b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b,
-d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b=
-0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};
-c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b=
-a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!==
-"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,
-"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"||
-d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a=
-a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,
-f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,
-b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+
-a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e){var i,j=0;if(c.isFunction(f)){e=f;f=v}for(d=(d||"").split(/\s+/);(i=d[j++])!=null;){i=i==="focus"?"focusin":i==="blur"?"focusout":i==="hover"?d.push("mouseleave")&&"mouseenter":i;b==="live"?c(this.context).bind(oa(i,this.selector),{data:f,selector:this.selector,
-live:i},e):c(this.context).unbind(oa(i,this.selector),e?{guid:e.guid+this.selector+i}:null)}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});z.attachEvent&&!z.addEventListener&&z.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
-(function(){function a(g){for(var h="",k,l=0;g[l];l++){k=g[l];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===k){y=l[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=k;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}l[q]=y}}}function d(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===
-k){y=l[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=k;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(o.filter(h,[t]).length>0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||
-typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u=
-l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&
-y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};o.matches=function(g,h){return o(g,null,null,h)};o.find=function(g,h,k){var l,q;if(!g)return[];for(var p=0,u=m.order.length;p<u;p++){var t=m.order[p];if(q=m.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");l=m.find[t](q,
-h,k);if(l!=null){g=g.replace(m.match[t],"");break}}}}l||(l=h.getElementsByTagName("*"));return{set:l,expr:g}};o.filter=function(g,h,k,l){for(var q=g,p=[],u=h,t,y,R=h&&h[0]&&w(h[0]);g&&h.length;){for(var H in m.filter)if((t=m.leftMatch[H].exec(g))!=null&&t[2]){var M=m.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(u===p)p=[];if(m.preFilter[H])if(t=m.preFilter[H](t,u,k,p,l,R)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=u[U])!=null;U++)if(D){I=M(D,t,U,u);var Da=
-l^!!I;if(k&&I!=null)if(Da)y=true;else u[U]=false;else if(Da){p.push(D);y=true}}if(I!==v){k||(u=p);g=g.replace(m.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)o.error(g);else break;q=g}return u};o.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var m=o.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
-TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,h){var k=typeof h==="string",l=k&&!/\W/.test(h);k=k&&!l;if(l)h=h.toLowerCase();l=0;for(var q=g.length,
-p;l<q;l++)if(p=g[l]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[l]=k||p&&p.nodeName.toLowerCase()===h?p||false:p===h}k&&o.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l<q;l++){var p=g[l];if(p){k=p.parentNode;g[l]=k.nodeName.toLowerCase()===h?k:false}}}else{l=0;for(q=g.length;l<q;l++)if(p=g[l])g[l]=k?p.parentNode:p.parentNode===h;k&&o.filter(h,g,true)}},"":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=
-h=h.toLowerCase();q=b}q("parentNode",h,l,g,p,k)},"~":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,l,g,p,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];h=h.getElementsByName(g[1]);for(var l=0,q=h.length;l<q;l++)h[l].getAttribute("name")===g[1]&&k.push(h[l]);return k.length===0?null:k}},
-TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,l,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var u;(u=h[p])!=null;p++)if(u)if(q^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&
-"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);
-return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===
-g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2===
-0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k<l;k++)if(h[k]===g)return false;return true}else o.error("Syntax error, unrecognized expression: "+
-q)},CHILD:function(g,h){var k=h[1],l=g;switch(k){case "only":case "first":for(;l=l.previousSibling;)if(l.nodeType===1)return false;if(k==="first")return true;l=g;case "last":for(;l=l.nextSibling;)if(l.nodeType===1)return false;return true;case "nth":k=h[2];var q=h[3];if(k===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var u=0;for(l=p.firstChild;l;l=l.nextSibling)if(l.nodeType===1)l.nodeIndex=++u;p.sizcache=h}g=g.nodeIndex-q;return k===0?g===0:g%k===0&&g/k>=
-0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="?
-k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};
-try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k<l;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var C;if(r.documentElement.compareDocumentPosition)C=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===
-h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in r.documentElement)C=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(r.createRange)C=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),l=h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);l.setStart(h,0);l.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,
-l);if(g===0)j=true;return g};(function(){var g=r.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id");
-return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href",
-2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
-0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[],
-l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)o(g,h[q],k);return o.filter(l,k)};c.find=o;c.expr=o.selectors;c.expr[":"]=c.expr.filters;c.unique=o.uniqueSort;c.getText=a;c.isXMLDoc=w;c.contains=E})();var bb=/Until$/,cb=/^(?:parents|prevUntil|prevAll)/,db=/,/;Q=Array.prototype.slice;var Ea=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,
-function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Qa.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=
-0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ea(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ea(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e<n;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>
--1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),
-a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},
-nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):
-e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==
-b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,sa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ia=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],
-col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)},
-wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?
-d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,
-false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&
-!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(Ha.exec(a)||
-["",""])[1].toLowerCase()]){a=a.replace(Ga,Ia);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,
-b,f))});else a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(s){return c.nodeName(s,"table")?s.getElementsByTagName("tbody")[0]||s.appendChild(s.ownerDocument.createElement("tbody")):s}var e,i,j=a[0],n=[];if(!c.support.checkClone&&arguments.length===3&&typeof j===
-"string"&&sa.test(j))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(j))return this.each(function(s){var x=c(this);a[0]=j.call(this,s,b?x.html():v);x.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ra(a,this,n);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var o=0,m=this.length;o<m;o++)d.call(b?f(this[o],i):this[o],e.cacheable||this.length>1||o>0?e.fragment.cloneNode(true):e.fragment)}n&&c.each(n,
-Ma)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){c.cleanData(this.getElementsByTagName("*"));c.cleanData([this])}this.parentNode&&
-this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&c.cleanData(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||r;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||r;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j===
-"string"){j=j.replace(Ga,Ia);var n=(Ha.exec(j)||["",""])[1].toLowerCase(),o=F[n]||F._default,m=o[0];i=b.createElement("div");for(i.innerHTML=o[1]+j+o[2];m--;)i=i.lastChild;if(!c.support.tbody){m=fb.test(j);n=n==="table"&&!m?i.firstChild&&i.firstChild.childNodes:o[1]==="<table>"&&!m?i.childNodes:[];for(o=n.length-1;o>=0;--o)c.nodeName(n[o],"tbody")&&!n[o].childNodes.length&&n[o].parentNode.removeChild(n[o])}!c.support.leadingWhitespace&&V.test(j)&&i.insertBefore(b.createTextNode(V.exec(j)[0]),i.firstChild);
-j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()==="text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e},cleanData:function(a){for(var b=0,d;(d=a[b])!=null;b++){c.event.remove(d);c.removeData(d)}}});var hb=/z-?index|font-?weight|opacity|zoom|line-?height/i,
-Ja=/alpha\([^)]*\)/,Ka=/opacity=([^)]*)/,ga=/float/i,ha=/-([a-z])/ig,ib=/([A-Z])/g,jb=/^-?\d+(?:px)?$/i,kb=/^-?\d/,lb={position:"absolute",visibility:"hidden",display:"block"},mb=["Left","Right"],nb=["Top","Bottom"],ob=r.defaultView&&r.defaultView.getComputedStyle,La=c.support.cssFloat?"cssFloat":"styleFloat",ia=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===v)return c.curCSS(d,f);if(typeof e==="number"&&!hb.test(f))e+="px";c.style(d,f,e)})};
-c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return v;if((b==="width"||b==="height")&&parseFloat(d)<0)d=v;var f=a.style||a,e=d!==v;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ja.test(a)?a.replace(Ja,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ka.exec(f.filter)[1])/100+"":""}if(ga.test(b))b=La;b=b.replace(ha,ia);if(e)f[b]=d;return f[b]},css:function(a,
-b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?mb:nb;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,lb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&
-a.currentStyle){f=Ka.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ga.test(b))b=La;if(!d&&e&&e[b])f=e[b];else if(ob){if(ga.test(b))b="float";b=b.replace(ib,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ha,ia);f=a.currentStyle[b]||a.currentStyle[d];if(!jb.test(f)&&kb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=
-a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var pb=
-J(),qb=/<script(.|\s)*?\/script>/gi,rb=/select|textarea/i,sb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ja=/\?/,tb=/(\?|&)_=.*?(&|$)/,ub=/^(\w+:)?\/\/([^\/?#]+)/,vb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=
-c.param(b,c.ajaxSettings.traditional);f="POST"}var i=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(j,n){if(n==="success"||n==="notmodified")i.html(e?c("<div />").append(j.responseText.replace(qb,"")).find(e):j.responseText);d&&i.each(d,[j.responseText,n,j])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&
-(this.checked||rb.test(this.nodeName)||sb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,
-b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:z.XMLHttpRequest&&(z.location.protocol!=="file:"||!z.ActiveXObject)?function(){return new z.XMLHttpRequest}:
-function(){try{return new z.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(o,n,j,w);e.global&&f("ajaxSuccess",[w,e])}function d(){e.complete&&e.complete.call(o,w,j);e.global&&f("ajaxComplete",[w,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}
-function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,n,o=a&&a.context||e,m=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(m==="GET")N.test(e.url)||(e.url+=(ja.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||
-N.test(e.url))){i=e.jsonpCallback||"jsonp"+pb++;if(e.data)e.data=(e.data+"").replace(N,"="+i+"$1");e.url=e.url.replace(N,"="+i+"$1");e.dataType="script";z[i]=z[i]||function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&&A.removeChild(B)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&m==="GET"){var s=J(),x=e.url.replace(tb,"$1_="+s+"$2");e.url=x+(x===e.url?(ja.test(e.url)?"&":"?")+"_="+s:"")}if(e.data&&m==="GET")e.url+=(ja.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&
-c.event.trigger("ajaxStart");s=(s=ub.exec(e.url))&&(s[1]&&s[1]!==location.protocol||s[2]!==location.host);if(e.dataType==="script"&&m==="GET"&&s){var A=r.getElementsByTagName("head")[0]||r.documentElement,B=r.createElement("script");B.src=e.url;if(e.scriptCharset)B.charset=e.scriptCharset;if(!i){var C=false;B.onload=B.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;b();d();B.onload=B.onreadystatechange=null;A&&B.parentNode&&
-A.removeChild(B)}}}A.insertBefore(B,A.firstChild);return v}var E=false,w=e.xhr();if(w){e.username?w.open(m,e.url,e.async,e.username,e.password):w.open(m,e.url,e.async);try{if(e.data||a&&a.contentType)w.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&w.setRequestHeader("If-None-Match",c.etag[e.url])}s||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",
-e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(fa){}if(e.beforeSend&&e.beforeSend.call(o,w,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");w.abort();return false}e.global&&f("ajaxSend",[w,e]);var g=w.onreadystatechange=function(q){if(!w||w.readyState===0||q==="abort"){E||d();E=true;if(w)w.onreadystatechange=c.noop}else if(!E&&w&&(w.readyState===4||q==="timeout")){E=true;w.onreadystatechange=c.noop;j=q==="timeout"?"timeout":!c.httpSuccess(w)?
-"error":e.ifModified&&c.httpNotModified(w,e.url)?"notmodified":"success";var p;if(j==="success")try{n=c.httpData(w,e.dataType,e)}catch(u){j="parsererror";p=u}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,w,j,p);d();q==="timeout"&&w.abort();if(e.async)w=null}};try{var h=w.abort;w.abort=function(){w&&h.call(w);g("abort")}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){w&&!E&&g("timeout")},e.timeout);try{w.send(m==="POST"||m==="PUT"||m==="DELETE"?e.data:null)}catch(l){c.handleError(e,
-w,null,l);d()}e.async||g();return w}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=
-f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(j,n){if(c.isArray(n))c.each(n,
-function(o,m){b?f(j,m):d(j+"["+(typeof m==="object"||c.isArray(m)?o:"")+"]",m)});else!b&&n!=null&&typeof n==="object"?c.each(n,function(o,m){d(j+"["+o+"]",m)}):f(j,n)}function f(j,n){n=c.isFunction(n)?n():n;e[e.length]=encodeURIComponent(j)+"="+encodeURIComponent(n)}var e=[];if(b===v)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var i in a)d(i,a[i]);return e.join("&").replace(vb,"+")}});var ka={},wb=/toggle|show|hide/,xb=/^([+-]=)?([\d+-.]+)(.*)$/,
-W,ta=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(ka[d])f=ka[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
-ka[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
-c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,n=this.nodeType===1&&c(this).is(":hidden"),
-o=this;for(j in a){var m=j.replace(ha,ia);if(j!==m){a[m]=a[j];delete a[j];j=m}if(a[j]==="hide"&&n||a[j]==="show"&&!n)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(s,x){var A=new c.fx(o,i,s);if(wb.test(x))A[x==="toggle"?n?"show":"hide":x](a);
-else{var B=xb.exec(x),C=A.cur(true)||0;if(B){x=parseFloat(B[2]);var E=B[3]||"px";if(E!=="px"){o.style[s]=(x||1)+E;C=(x||1)/A.cur(true)*C;o.style[s]=C+E}if(B[1])x=(B[1]==="-="?-1:1)*x+C;A.custom(C,x,E)}else A.custom(C,x,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",
-1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
-b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
-null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
-"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
-this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
-c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
-null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in r.documentElement?function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
-f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
-b,e=b.ownerDocument,i,j=e.documentElement,n=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var o=b.offsetTop,m=b.offsetLeft;(b=b.parentNode)&&b!==n&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;o-=b.scrollTop;m-=b.scrollLeft;if(b===d){o+=b.offsetTop;m+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){o+=parseFloat(i.borderTopWidth)||
-0;m+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){o+=parseFloat(i.borderTopWidth)||0;m+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){o+=n.offsetTop;m+=n.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){o+=Math.max(j.scrollTop,n.scrollTop);m+=Math.max(j.scrollLeft,n.scrollLeft)}return{top:o,left:m}};c.offset={initialize:function(){var a=r.body,b=r.createElement("div"),
-d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
-d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
-bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
-e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
-this.offsetParent||r.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==v)return this.each(function(){if(i=ua(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=ua(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
-c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(i){var j=c(this);j[d](f.call(this,i,j[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||
-e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===v?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});z.jQuery=z.$=c})(window);
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
 
index 3623337b9f65725acbcf16f6ce33e420350de5b5..949aec957d0b1d06b968cad9585e7185e3b919be 100644 (file)
@@ -54,7 +54,8 @@ var SN = { // StatusNet
             NoticeGeoName: 'notice_data-geo_name',
             NoticeDataGeo: 'notice_data-geo',
             NoticeDataGeoCookie: 'notice_data-geo_cookie',
-            NoticeDataGeoSelected: 'notice_data-geo_selected'
+            NoticeDataGeoSelected: 'notice_data-geo_selected',
+            StatusNetInstance:'StatusNetInstance'
         }
     },
 
@@ -319,18 +320,12 @@ var SN = { // StatusNet
             }
         },
 
-        NoticeReplyTo: function(notice_item) {
-            var notice = notice_item[0];
-            var notice_reply = $('.notice_reply', notice)[0];
-
-            if (jQuery.data(notice_reply, "ElementData") === undefined) {
-                jQuery.data(notice_reply, "ElementData", {Bind:'submit'});
-                $(notice_reply).bind('click', function() {
-                    var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname.uid');
-                    SN.U.NoticeReplySet(nickname.text(), $($('.notice_id', notice)[0]).text());
-                    return false;
-                });
-            }
+        NoticeReplyTo: function(notice) {
+            notice.find('.notice_reply').live('click', function() {
+                var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname.uid');
+                SN.U.NoticeReplySet(nickname.text(), $($('.notice_id', notice)[0]).text());
+                return false;
+            });
         },
 
         NoticeReplySet: function(nick,id) {
@@ -670,6 +665,35 @@ var SN = { // StatusNet
             date.setFullYear(year, month, day);
 
             return date;
+        },
+
+        StatusNetInstance: {
+            Set: function(value) {
+                var SNI = SN.U.StatusNetInstance.Get();
+                if (SNI !== null) {
+                    value = $.extend(SNI, value);
+                }
+
+                $.cookie(
+                    SN.C.S.StatusNetInstance,
+                    JSON.stringify(value),
+                    {
+                        path: '/',
+                        expires: SN.U.GetFullYear(2029, 0, 1)
+                    });
+            },
+
+            Get: function() {
+                var cookieValue = $.cookie(SN.C.S.StatusNetInstance);
+                if (cookieValue !== null) {
+                    return JSON.parse(cookieValue);
+                }
+                return null;
+            },
+
+            Delete: function() {
+                $.cookie(SN.C.S.StatusNetInstance, null);
+            }
         }
     },
 
@@ -707,6 +731,20 @@ var SN = { // StatusNet
 
                 SN.U.NewDirectMessage();
             }
+        },
+
+        Login: function() {
+            if (SN.U.StatusNetInstance.Get() !== null) {
+                var nickname = SN.U.StatusNetInstance.Get().Nickname;
+                if (nickname !== null) {
+                    $('#form_login #nickname').val(nickname);
+                }
+            }
+
+            $('#form_login').bind('submit', function() {
+                SN.U.StatusNetInstance.Set({Nickname: $('#form_login #nickname').val()});
+                return true;
+            });
         }
     }
 };
@@ -721,5 +759,8 @@ $(document).ready(function(){
     if ($('#content .entity_actions').length > 0) {
         SN.Init.EntityActions();
     }
+    if ($('#form_login').length > 0) {
+        SN.Init.Login();
+    }
 });
 
index b85f353a3d14087a460e8a492d4d0504183ab87e..a804b8e82536ac0d3cbdddeb3d6bce0880919e73 100644 (file)
@@ -249,7 +249,7 @@ class Action extends HTMLOutputter // lawsuit
                 $this->script('jquery.min.js');
                 $this->script('jquery.form.js');
                 $this->script('jquery.cookie.js');
-                $this->script('json2.js');
+                $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/json2.js').'"); }');
                 $this->script('jquery.joverlay.min.js');
                 Event::handle('EndShowJQueryScripts', array($this));
             }
@@ -259,8 +259,7 @@ class Action extends HTMLOutputter // lawsuit
                 $this->script('util.js');
                 $this->script('geometa.js');
                 // Frame-busting code to avoid clickjacking attacks.
-                $this->element('script', array('type' => 'text/javascript'),
-                               'if (window.top !== window.self) { window.top.location.href = window.self.location.href; }');
+                $this->inlineScript('if (window.top !== window.self) { window.top.location.href = window.self.location.href; }');
                 Event::handle('EndShowStatusNetScripts', array($this));
                 Event::handle('EndShowLaconicaScripts', array($this));
             }
@@ -426,8 +425,6 @@ class Action extends HTMLOutputter // lawsuit
             $connect = 'imsettings';
         } else if (common_config('sms', 'enabled')) {
             $connect = 'smssettings';
-        } else if (common_config('twitter', 'enabled')) {
-            $connect = 'twittersettings';
         }
 
         $this->elementStart('dl', array('id' => 'site_nav_global_primary'));
@@ -436,41 +433,71 @@ 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');
+                                _m('MENU', 'Account'), $tooltip, false, 'nav_account');
                 if ($connect) {
+                    // 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($connect),
-                                    _('Connect'), _('Connect to services'), false, 'nav_connect');
+                                    _m('MENU', '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));
         }
@@ -491,6 +518,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);
@@ -977,7 +1005,7 @@ class Action extends HTMLOutputter // lawsuit
 
         if (is_null($arg)) {
             return $def;
-        } else if (in_array($arg, array('true', 'yes', '1'))) {
+        } else if (in_array($arg, array('true', 'yes', '1', 'on'))) {
             return true;
         } else if (in_array($arg, array('false', 'no', '0'))) {
             return false;
diff --git a/lib/activity.php b/lib/activity.php
new file mode 100644 (file)
index 0000000..b201532
--- /dev/null
@@ -0,0 +1,1267 @@
+<?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();
+    }
+}
+
+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)
+    {
+        $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK);
+
+        foreach ($links as $link) {
+
+            $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)
+    {
+        $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK);
+        $out = array();
+
+        foreach ($links as $link) {
+
+            $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
+ *
+ * An activity is kind of like a sentence: someone did something
+ * to something else.
+ *
+ * 'someone' is the 'actor'; 'did something' is the verb;
+ * 'something else' is the object.
+ *
+ * @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 Activity
+{
+    const SPEC   = 'http://activitystrea.ms/spec/1.0/';
+    const SCHEMA = 'http://activitystrea.ms/schema/1.0/';
+
+    const VERB       = 'verb';
+    const OBJECT     = 'object';
+    const ACTOR      = 'actor';
+    const SUBJECT    = 'subject';
+    const OBJECTTYPE = 'object-type';
+    const CONTEXT    = 'context';
+    const TARGET     = 'target';
+
+    const ATOM = 'http://www.w3.org/2005/Atom';
+
+    const AUTHOR    = 'author';
+    const PUBLISHED = 'published';
+    const UPDATED   = 'updated';
+
+    public $actor;   // an ActivityObject
+    public $verb;    // a string (the URL)
+    public $object;  // an ActivityObject
+    public $target;  // an ActivityObject
+    public $context; // an ActivityObject
+    public $time;    // Time of the activity
+    public $link;    // an ActivityObject
+    public $entry;   // the source entry
+    public $feed;    // the source feed
+
+    public $summary; // summary of activity
+    public $content; // HTML content of activity
+    public $id;      // ID of the activity
+    public $title;   // title of the activity
+    public $categories = array(); // list of AtomCategory objects
+
+    /**
+     * Turns a regular old Atom <entry> into a magical activity
+     *
+     * @param DOMElement $entry Atom entry to poke at
+     * @param DOMElement $feed  Atom feed, for context
+     */
+
+    function __construct($entry = null, $feed = null)
+    {
+        if (is_null($entry)) {
+            return;
+        }
+
+        $this->entry = $entry;
+        $this->feed  = $feed;
+
+        $pubEl = $this->_child($entry, self::PUBLISHED, self::ATOM);
+
+        if (!empty($pubEl)) {
+            $this->time = strtotime($pubEl->textContent);
+        } else {
+            // XXX technically an error; being liberal. Good idea...?
+            $updateEl = $this->_child($entry, self::UPDATED, self::ATOM);
+            if (!empty($updateEl)) {
+                $this->time = strtotime($updateEl->textContent);
+            } else {
+                $this->time = null;
+            }
+        }
+
+        $this->link = ActivityUtils::getPermalink($entry);
+
+        $verbEl = $this->_child($entry, self::VERB);
+
+        if (!empty($verbEl)) {
+            $this->verb = trim($verbEl->textContent);
+        } else {
+            $this->verb = ActivityVerb::POST;
+            // XXX: do other implied stuff here
+        }
+
+        $objectEl = $this->_child($entry, self::OBJECT);
+
+        if (!empty($objectEl)) {
+            $this->object = new ActivityObject($objectEl);
+        } else {
+            $this->object = new ActivityObject($entry);
+        }
+
+        $actorEl = $this->_child($entry, self::ACTOR);
+
+        if (!empty($actorEl)) {
+
+            $this->actor = new ActivityObject($actorEl);
+
+        } else if (!empty($feed) &&
+                   $subjectEl = $this->_child($feed, self::SUBJECT)) {
+
+            $this->actor = new ActivityObject($subjectEl);
+
+        } else if ($authorEl = $this->_child($entry, self::AUTHOR, self::ATOM)) {
+
+            $this->actor = new ActivityObject($authorEl);
+
+        } else if (!empty($feed) && $authorEl = $this->_child($feed, self::AUTHOR,
+                                                              self::ATOM)) {
+
+            $this->actor = new ActivityObject($authorEl);
+        }
+
+        $contextEl = $this->_child($entry, self::CONTEXT);
+
+        if (!empty($contextEl)) {
+            $this->context = new ActivityContext($contextEl);
+        } else {
+            $this->context = new ActivityContext($entry);
+        }
+
+        $targetEl = $this->_child($entry, self::TARGET);
+
+        if (!empty($targetEl)) {
+            $this->target = new ActivityObject($targetEl);
+        }
+
+        $this->summary = ActivityUtils::childContent($entry, 'summary');
+        $this->id      = ActivityUtils::childContent($entry, 'id');
+        $this->content = ActivityUtils::getContent($entry);
+
+        $catEls = $entry->getElementsByTagNameNS(self::ATOM, 'category');
+        if ($catEls) {
+            for ($i = 0; $i < $catEls->length; $i++) {
+                $catEl = $catEls->item($i);
+                $this->categories[] = new AtomCategory($catEl);
+            }
+        }
+    }
+
+    /**
+     * Returns an Atom <entry> based on this activity
+     *
+     * @return DOMElement Atom entry
+     */
+
+    function toAtomEntry()
+    {
+        return null;
+    }
+
+    function asString($namespace=false)
+    {
+        $xs = new XMLStringer(true);
+
+        if ($namespace) {
+            $attrs = array('xmlns' => 'http://www.w3.org/2005/Atom',
+                           'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/',
+                           'xmlns:georss' => 'http://www.georss.org/georss',
+                           'xmlns:ostatus' => 'http://ostatus.org/schema/1.0',
+                           'xmlns:poco' => 'http://portablecontacts.net/spec/1.0',
+                           'xmlns:media' => 'http://purl.org/syndication/atommedia');
+        } else {
+            $attrs = array();
+        }
+
+        $xs->elementStart('entry', $attrs);
+
+        $xs->element('id', null, $this->id);
+        $xs->element('title', null, $this->title);
+        $xs->element('published', null, common_date_iso8601($this->time));
+        $xs->element('content', array('type' => 'html'), $this->content);
+
+        if (!empty($this->summary)) {
+            $xs->element('summary', null, $this->summary);
+        }
+
+        if (!empty($this->link)) {
+            $xs->element('link', array('rel' => 'alternate',
+                                       'type' => 'text/html'),
+                         $this->link);
+        }
+
+        // XXX: add context
+
+        $xs->elementStart('author');
+        $xs->element('uri', array(), $this->actor->id);
+        if ($this->actor->title) {
+            $xs->element('name', array(), $this->actor->title);
+        }
+        $xs->elementEnd('author');
+        $xs->raw($this->actor->asString('activity:actor'));
+
+        $xs->element('activity:verb', null, $this->verb);
+
+        if ($this->object) {
+            $xs->raw($this->object->asString());
+        }
+
+        if ($this->target) {
+            $xs->raw($this->target->asString('activity:target'));
+        }
+
+        foreach ($this->categories as $cat) {
+            $xs->raw($cat->asString());
+        }
+
+        $xs->elementEnd('entry');
+
+        return $xs->getString();
+    }
+
+    private function _child($element, $tag, $namespace=self::SPEC)
+    {
+        return ActivityUtils::child($element, $tag, $namespace);
+    }
+}
+
+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 f05627b317cd47ffbfc9eff4cbf3988301a20a89..a0cdab8a45dc9bb29e000369b1acc002d1e4310f 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;
         }
@@ -103,7 +105,8 @@ class AdminPanelAction extends Action
 
         $name = mb_substr($name, 0, -10);
 
-        if (!in_array($name, common_config('admin', 'panels'))) {
+        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;
@@ -203,6 +207,7 @@ class AdminPanelAction extends Action
 
     function showForm()
     {
+        // TRANS: Client error message
         $this->clientError(_('showForm() not implemented.'));
         return;
     }
@@ -232,6 +237,7 @@ class AdminPanelAction extends Action
 
     function saveSettings()
     {
+        // TRANS: Client error message
         $this->clientError(_('saveSettings() not implemented.'));
         return;
     }
@@ -255,6 +261,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;
             }
@@ -262,6 +269,17 @@ class AdminPanelAction extends Action
 
         return $result;
     }
+
+    function canAdmin($name)
+    {
+        $isOK = false;
+
+        if (Event::handle('AdminPanelCheck', array($name, &$isOK))) {
+            $isOK = in_array($name, common_config('admin', 'panels'));
+        }
+
+        return $isOK;
+    }
 }
 
 /**
@@ -307,34 +325,52 @@ class AdminPanelNav extends Widget
 
         if (Event::handle('StartAdminPanelNav', array($this))) {
 
-            if ($this->canAdmin('site')) {
-                $this->out->menuItem(common_local_url('siteadminpanel'), _('Site'),
-                                     _('Basic site configuration'), $action_name == 'siteadminpanel', 'nav_site_admin_panel');
+            if (AdminPanelAction::canAdmin('site')) {
+                // 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 ($this->canAdmin('design')) {
-                $this->out->menuItem(common_local_url('designadminpanel'), _('Design'),
-                                     _('Design configuration'), $action_name == 'designadminpanel', 'nav_design_admin_panel');
+            if (AdminPanelAction::canAdmin('design')) {
+                // 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 ($this->canAdmin('user')) {
-                $this->out->menuItem(common_local_url('useradminpanel'), _('User'),
-                                     _('User configuration'), $action_name == 'useradminpanel', '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'), _m('MENU', 'User'),
+                                     $menu_title, $action_name == 'useradminpanel', 'nav_design_admin_panel');
             }
 
-            if ($this->canAdmin('access')) {
-                $this->out->menuItem(common_local_url('accessadminpanel'), _('Access'),
-                                     _('Access configuration'), $action_name == 'accessadminpanel', 'nav_design_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'), _m('MENU', 'Access'),
+                                     $menu_title, $action_name == 'accessadminpanel', 'nav_design_admin_panel');
             }
 
-            if ($this->canAdmin('paths')) {
-                $this->out->menuItem(common_local_url('pathsadminpanel'), _('Paths'),
-                                    _('Paths configuration'), $action_name == 'pathsadminpanel', 'nav_design_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'), _m('MENU', 'Paths'),
+                                    $menu_title, $action_name == 'pathsadminpanel', 'nav_design_admin_panel');
             }
 
-            if ($this->canAdmin('sessions')) {
-                $this->out->menuItem(common_local_url('sessionsadminpanel'), _('Sessions'),
-                                     _('Sessions configuration'), $action_name == 'sessionsadminpanel', 'nav_design_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'), _m('MENU', 'Sessions'),
+                                     $menu_title, $action_name == 'sessionsadminpanel', 'nav_design_admin_panel');
             }
 
             Event::handle('EndAdminPanelNav', array($this));
@@ -342,8 +378,4 @@ class AdminPanelNav extends Widget
         $this->action->elementEnd('ul');
     }
 
-    function canAdmin($name)
-    {
-        return in_array($name, common_config('admin', 'panels'));
-    }
 }
diff --git a/lib/api.php b/lib/api.php
deleted file mode 100644 (file)
index 9000fb4..0000000
+++ /dev/null
@@ -1,1342 +0,0 @@
-<?php
-/**
- * StatusNet, the distributed open-source microblogging tool
- *
- * Base API action
- *
- * 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
- * @package   StatusNet
- * @author    Craig Andrews <candrews@integralblue.com>
- * @author    Dan Moore <dan@moore.cx>
- * @author    Evan Prodromou <evan@status.net>
- * @author    Jeffery To <jeffery.to@gmail.com>
- * @author    Toby Inkster <mail@tobyinkster.co.uk>
- * @author    Zach Copley <zach@status.net>
- * @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')) {
-    exit(1);
-}
-
-/**
- * Contains most of the Twitter-compatible API output functions.
- *
- * @category API
- * @package  StatusNet
- * @author   Craig Andrews <candrews@integralblue.com>
- * @author   Dan Moore <dan@moore.cx>
- * @author   Evan Prodromou <evan@status.net>
- * @author   Jeffery To <jeffery.to@gmail.com>
- * @author   Toby Inkster <mail@tobyinkster.co.uk>
- * @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 ApiAction extends Action
-{
-    const READ_ONLY  = 1;
-    const READ_WRITE = 2;
-
-    var $format    = null;
-    var $user      = null;
-    var $auth_user = null;
-    var $page      = null;
-    var $count     = null;
-    var $max_id    = null;
-    var $since_id  = null;
-    var $since     = null;
-
-    var $access    = self::READ_ONLY;  // read (default) or read-write
-
-    /**
-     * Initialization.
-     *
-     * @param array $args Web and URL arguments
-     *
-     * @return boolean false if user doesn't exist
-     */
-
-    function prepare($args)
-    {
-        StatusNet::setApi(true); // reduce exception reports to aid in debugging
-        parent::prepare($args);
-
-        $this->format   = $this->arg('format');
-        $this->page     = (int)$this->arg('page', 1);
-        $this->count    = (int)$this->arg('count', 20);
-        $this->max_id   = (int)$this->arg('max_id', 0);
-        $this->since_id = (int)$this->arg('since_id', 0);
-        $this->since    = $this->arg('since');
-
-        return true;
-    }
-
-    /**
-     * Handle a request
-     *
-     * @param array $args Arguments from $_REQUEST
-     *
-     * @return void
-     */
-
-    function handle($args)
-    {
-        parent::handle($args);
-    }
-
-    /**
-     * Overrides XMLOutputter::element to write booleans as strings (true|false).
-     * See that method's documentation for more info.
-     *
-     * @param string $tag     Element type or tagname
-     * @param array  $attrs   Array of element attributes, as
-     *                        key-value pairs
-     * @param string $content string content of the element
-     *
-     * @return void
-     */
-    function element($tag, $attrs=null, $content=null)
-    {
-        if (is_bool($content)) {
-            $content = ($content ? 'true' : 'false');
-        }
-
-        return parent::element($tag, $attrs, $content);
-    }
-
-    function twitterUserArray($profile, $get_notice=false)
-    {
-        $twitter_user = array();
-
-        $twitter_user['id'] = intval($profile->id);
-        $twitter_user['name'] = $profile->getBestName();
-        $twitter_user['screen_name'] = $profile->nickname;
-        $twitter_user['location'] = ($profile->location) ? $profile->location : null;
-        $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
-
-        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-        $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() :
-            Avatar::defaultImage(AVATAR_STREAM_SIZE);
-
-        $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
-        $twitter_user['protected'] = false; # not supported by StatusNet yet
-        $twitter_user['followers_count'] = $profile->subscriberCount();
-
-        $design        = null;
-        $user          = $profile->getUser();
-
-        // Note: some profiles don't have an associated user
-
-        $defaultDesign = Design::siteDesign();
-
-        if (!empty($user)) {
-            $design = $user->getDesign();
-        }
-
-        if (empty($design)) {
-            $design = $defaultDesign;
-        }
-
-        $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor);
-        $twitter_user['profile_background_color'] = ($color == null) ? '' : '#'.$color->hexValue();
-        $color = Design::toWebColor(empty($design->textcolor) ? $defaultDesign->textcolor : $design->textcolor);
-        $twitter_user['profile_text_color'] = ($color == null) ? '' : '#'.$color->hexValue();
-        $color = Design::toWebColor(empty($design->linkcolor) ? $defaultDesign->linkcolor : $design->linkcolor);
-        $twitter_user['profile_link_color'] = ($color == null) ? '' : '#'.$color->hexValue();
-        $color = Design::toWebColor(empty($design->sidebarcolor) ? $defaultDesign->sidebarcolor : $design->sidebarcolor);
-        $twitter_user['profile_sidebar_fill_color'] = ($color == null) ? '' : '#'.$color->hexValue();
-        $twitter_user['profile_sidebar_border_color'] = '';
-
-        $twitter_user['friends_count'] = $profile->subscriptionCount();
-
-        $twitter_user['created_at'] = $this->dateTwitter($profile->created);
-
-        $twitter_user['favourites_count'] = $profile->faveCount(); // British spelling!
-
-        $timezone = 'UTC';
-
-        if (!empty($user) && $user->timezone) {
-            $timezone = $user->timezone;
-        }
-
-        $t = new DateTime;
-        $t->setTimezone(new DateTimeZone($timezone));
-
-        $twitter_user['utc_offset'] = $t->format('Z');
-        $twitter_user['time_zone'] = $timezone;
-
-        $twitter_user['profile_background_image_url']
-            = empty($design->backgroundimage)
-            ? '' : ($design->disposition & BACKGROUND_ON)
-            ? Design::url($design->backgroundimage) : '';
-
-        $twitter_user['profile_background_tile']
-            = empty($design->disposition)
-            ? '' : ($design->disposition & BACKGROUND_TILE) ? 'true' : 'false';
-
-        $twitter_user['statuses_count'] = $profile->noticeCount();
-
-        // Is the requesting user following this user?
-        $twitter_user['following'] = false;
-        $twitter_user['notifications'] = false;
-
-        if (isset($this->auth_user)) {
-
-            $twitter_user['following'] = $this->auth_user->isSubscribed($profile);
-
-            // Notifications on?
-            $sub = Subscription::pkeyGet(array('subscriber' =>
-                                               $this->auth_user->id,
-                                               'subscribed' => $profile->id));
-
-            if ($sub) {
-                $twitter_user['notifications'] = ($sub->jabber || $sub->sms);
-            }
-        }
-
-        if ($get_notice) {
-            $notice = $profile->getCurrentNotice();
-            if ($notice) {
-                # don't get user!
-                $twitter_user['status'] = $this->twitterStatusArray($notice, false);
-            }
-        }
-
-        return $twitter_user;
-    }
-
-    function twitterStatusArray($notice, $include_user=true)
-    {
-        $base = $this->twitterSimpleStatusArray($notice, $include_user);
-
-        if (!empty($notice->repeat_of)) {
-            $original = Notice::staticGet('id', $notice->repeat_of);
-            if (!empty($original)) {
-                $original_array = $this->twitterSimpleStatusArray($original, $include_user);
-                $base['retweeted_status'] = $original_array;
-            }
-        }
-
-        return $base;
-    }
-
-    function twitterSimpleStatusArray($notice, $include_user=true)
-    {
-        $profile = $notice->getProfile();
-
-        $twitter_status = array();
-        $twitter_status['text'] = $notice->content;
-        $twitter_status['truncated'] = false; # Not possible on StatusNet
-        $twitter_status['created_at'] = $this->dateTwitter($notice->created);
-        $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ?
-            intval($notice->reply_to) : null;
-        $twitter_status['source'] = $this->sourceLink($notice->source);
-        $twitter_status['id'] = intval($notice->id);
-
-        $replier_profile = null;
-
-        if ($notice->reply_to) {
-            $reply = Notice::staticGet(intval($notice->reply_to));
-            if ($reply) {
-                $replier_profile = $reply->getProfile();
-            }
-        }
-
-        $twitter_status['in_reply_to_user_id'] =
-            ($replier_profile) ? intval($replier_profile->id) : null;
-        $twitter_status['in_reply_to_screen_name'] =
-            ($replier_profile) ? $replier_profile->nickname : null;
-
-        if (isset($notice->lat) && isset($notice->lon)) {
-            // This is the format that GeoJSON expects stuff to be in
-            $twitter_status['geo'] = array('type' => 'Point',
-                                           'coordinates' => array((float) $notice->lat,
-                                                                  (float) $notice->lon));
-        } else {
-            $twitter_status['geo'] = null;
-        }
-
-        if (isset($this->auth_user)) {
-            $twitter_status['favorited'] = $this->auth_user->hasFave($notice);
-        } else {
-            $twitter_status['favorited'] = false;
-        }
-
-        // Enclosures
-        $attachments = $notice->attachments();
-
-        if (!empty($attachments)) {
-
-            $twitter_status['attachments'] = array();
-
-            foreach ($attachments as $attachment) {
-                $enclosure_o=$attachment->getEnclosure();
-                if ($enclosure_o) {
-                    $enclosure = array();
-                    $enclosure['url'] = $enclosure_o->url;
-                    $enclosure['mimetype'] = $enclosure_o->mimetype;
-                    $enclosure['size'] = $enclosure_o->size;
-                    $twitter_status['attachments'][] = $enclosure;
-                }
-            }
-        }
-
-        if ($include_user && $profile) {
-            # Don't get notice (recursive!)
-            $twitter_user = $this->twitterUserArray($profile, false);
-            $twitter_status['user'] = $twitter_user;
-        }
-
-        return $twitter_status;
-    }
-
-    function twitterGroupArray($group)
-    {
-        $twitter_group=array();
-        $twitter_group['id']=$group->id;
-        $twitter_group['url']=$group->permalink();
-        $twitter_group['nickname']=$group->nickname;
-        $twitter_group['fullname']=$group->fullname;
-        $twitter_group['homepage_url']=$group->homepage_url;
-        $twitter_group['original_logo']=$group->original_logo;
-        $twitter_group['homepage_logo']=$group->homepage_logo;
-        $twitter_group['stream_logo']=$group->stream_logo;
-        $twitter_group['mini_logo']=$group->mini_logo;
-        $twitter_group['homepage']=$group->homepage;
-        $twitter_group['description']=$group->description;
-        $twitter_group['location']=$group->location;
-        $twitter_group['created']=$this->dateTwitter($group->created);
-        $twitter_group['modified']=$this->dateTwitter($group->modified);
-        return $twitter_group;
-    }
-
-    function twitterRssGroupArray($group)
-    {
-        $entry = array();
-        $entry['content']=$group->description;
-        $entry['title']=$group->nickname;
-        $entry['link']=$group->permalink();
-        $entry['published']=common_date_iso8601($group->created);
-        $entry['updated']==common_date_iso8601($group->modified);
-        $taguribase = common_config('integration', 'groupuri');
-        $entry['id'] = "group:$groupuribase:$entry[link]";
-
-        $entry['description'] = $entry['content'];
-        $entry['pubDate'] = common_date_rfc2822($group->created);
-        $entry['guid'] = $entry['link'];
-
-        return $entry;
-    }
-
-    function twitterRssEntryArray($notice)
-    {
-        $profile = $notice->getProfile();
-        $entry = array();
-
-        // We trim() to avoid extraneous whitespace in the output
-
-        $entry['content'] = common_xml_safe_str(trim($notice->rendered));
-        $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
-        $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
-        $entry['published'] = common_date_iso8601($notice->created);
-
-        $taguribase = common_config('integration', 'taguri');
-        $entry['id'] = "tag:$taguribase:$entry[link]";
-
-        $entry['updated'] = $entry['published'];
-        $entry['author'] = $profile->getBestName();
-
-        // Enclosures
-        $attachments = $notice->attachments();
-        $enclosures = array();
-
-        foreach ($attachments as $attachment) {
-            $enclosure_o=$attachment->getEnclosure();
-            if ($enclosure_o) {
-                 $enclosure = array();
-                 $enclosure['url'] = $enclosure_o->url;
-                 $enclosure['mimetype'] = $enclosure_o->mimetype;
-                 $enclosure['size'] = $enclosure_o->size;
-                 $enclosures[] = $enclosure;
-            }
-        }
-
-        if (!empty($enclosures)) {
-            $entry['enclosures'] = $enclosures;
-        }
-
-        // Tags/Categories
-        $tag = new Notice_tag();
-        $tag->notice_id = $notice->id;
-        if ($tag->find()) {
-            $entry['tags']=array();
-            while ($tag->fetch()) {
-                $entry['tags'][]=$tag->tag;
-            }
-        }
-        $tag->free();
-
-        // RSS Item specific
-        $entry['description'] = $entry['content'];
-        $entry['pubDate'] = common_date_rfc2822($notice->created);
-        $entry['guid'] = $entry['link'];
-
-        if (isset($notice->lat) && isset($notice->lon)) {
-            // This is the format that GeoJSON expects stuff to be in.
-            // showGeoRSS() below uses it for XML output, so we reuse it
-            $entry['geo'] = array('type' => 'Point',
-                                  'coordinates' => array((float) $notice->lat,
-                                                         (float) $notice->lon));
-        } else {
-            $entry['geo'] = null;
-        }
-
-        return $entry;
-    }
-
-    function twitterRelationshipArray($source, $target)
-    {
-        $relationship = array();
-
-        $relationship['source'] =
-            $this->relationshipDetailsArray($source, $target);
-        $relationship['target'] =
-            $this->relationshipDetailsArray($target, $source);
-
-        return array('relationship' => $relationship);
-    }
-
-    function relationshipDetailsArray($source, $target)
-    {
-        $details = array();
-
-        $details['screen_name'] = $source->nickname;
-        $details['followed_by'] = $target->isSubscribed($source);
-        $details['following'] = $source->isSubscribed($target);
-
-        $notifications = false;
-
-        if ($source->isSubscribed($target)) {
-
-            $sub = Subscription::pkeyGet(array('subscriber' =>
-                $source->id, 'subscribed' => $target->id));
-
-            if (!empty($sub)) {
-                $notifications = ($sub->jabber || $sub->sms);
-            }
-        }
-
-        $details['notifications_enabled'] = $notifications;
-        $details['blocking'] = $source->hasBlocked($target);
-        $details['id'] = $source->id;
-
-        return $details;
-    }
-
-    function showTwitterXmlRelationship($relationship)
-    {
-        $this->elementStart('relationship');
-
-        foreach($relationship as $element => $value) {
-            if ($element == 'source' || $element == 'target') {
-                $this->elementStart($element);
-                $this->showXmlRelationshipDetails($value);
-                $this->elementEnd($element);
-            }
-        }
-
-        $this->elementEnd('relationship');
-    }
-
-    function showXmlRelationshipDetails($details)
-    {
-        foreach($details as $element => $value) {
-            $this->element($element, null, $value);
-        }
-    }
-
-    function showTwitterXmlStatus($twitter_status, $tag='status')
-    {
-        $this->elementStart($tag);
-        foreach($twitter_status as $element => $value) {
-            switch ($element) {
-            case 'user':
-                $this->showTwitterXmlUser($twitter_status['user']);
-                break;
-            case 'text':
-                $this->element($element, null, common_xml_safe_str($value));
-                break;
-            case 'attachments':
-                $this->showXmlAttachments($twitter_status['attachments']);
-                break;
-            case 'geo':
-                $this->showGeoRSS($value);
-                break;
-            case 'retweeted_status':
-                $this->showTwitterXmlStatus($value, 'retweeted_status');
-                break;
-            default:
-                $this->element($element, null, $value);
-            }
-        }
-        $this->elementEnd($tag);
-    }
-
-    function showTwitterXmlGroup($twitter_group)
-    {
-        $this->elementStart('group');
-        foreach($twitter_group as $element => $value) {
-            $this->element($element, null, $value);
-        }
-        $this->elementEnd('group');
-    }
-
-    function showTwitterXmlUser($twitter_user, $role='user')
-    {
-        $this->elementStart($role);
-        foreach($twitter_user as $element => $value) {
-            if ($element == 'status') {
-                $this->showTwitterXmlStatus($twitter_user['status']);
-            } else {
-                $this->element($element, null, $value);
-            }
-        }
-        $this->elementEnd($role);
-    }
-
-    function showXmlAttachments($attachments) {
-        if (!empty($attachments)) {
-            $this->elementStart('attachments', array('type' => 'array'));
-            foreach ($attachments as $attachment) {
-                $attrs = array();
-                $attrs['url'] = $attachment['url'];
-                $attrs['mimetype'] = $attachment['mimetype'];
-                $attrs['size'] = $attachment['size'];
-                $this->element('enclosure', $attrs, '');
-            }
-            $this->elementEnd('attachments');
-        }
-    }
-
-    function showGeoRSS($geo)
-    {
-        if (empty($geo)) {
-            // empty geo element
-            $this->element('geo');
-        } else {
-            $this->elementStart('geo', array('xmlns:georss' => 'http://www.georss.org/georss'));
-            $this->element('georss:point', null, $geo['coordinates'][0] . ' ' . $geo['coordinates'][1]);
-            $this->elementEnd('geo');
-        }
-    }
-
-    function showTwitterRssItem($entry)
-    {
-        $this->elementStart('item');
-        $this->element('title', null, $entry['title']);
-        $this->element('description', null, $entry['description']);
-        $this->element('pubDate', null, $entry['pubDate']);
-        $this->element('guid', null, $entry['guid']);
-        $this->element('link', null, $entry['link']);
-
-        # RSS only supports 1 enclosure per item
-        if(array_key_exists('enclosures', $entry) and !empty($entry['enclosures'])){
-            $enclosure = $entry['enclosures'][0];
-            $this->element('enclosure', array('url'=>$enclosure['url'],'type'=>$enclosure['mimetype'],'length'=>$enclosure['size']), null);
-        }
-
-        if(array_key_exists('tags', $entry)){
-            foreach($entry['tags'] as $tag){
-                $this->element('category', null,$tag);
-            }
-        }
-
-        $this->showGeoRSS($entry['geo']);
-        $this->elementEnd('item');
-    }
-
-    function showJsonObjects($objects)
-    {
-        print(json_encode($objects));
-    }
-
-    function showSingleXmlStatus($notice)
-    {
-        $this->initDocument('xml');
-        $twitter_status = $this->twitterStatusArray($notice);
-        $this->showTwitterXmlStatus($twitter_status);
-        $this->endDocument('xml');
-    }
-
-    function show_single_json_status($notice)
-    {
-        $this->initDocument('json');
-        $status = $this->twitterStatusArray($notice);
-        $this->showJsonObjects($status);
-        $this->endDocument('json');
-    }
-
-    function showXmlTimeline($notice)
-    {
-
-        $this->initDocument('xml');
-        $this->elementStart('statuses', array('type' => 'array'));
-
-        if (is_array($notice)) {
-            foreach ($notice as $n) {
-                $twitter_status = $this->twitterStatusArray($n);
-                $this->showTwitterXmlStatus($twitter_status);
-            }
-        } else {
-            while ($notice->fetch()) {
-                $twitter_status = $this->twitterStatusArray($notice);
-                $this->showTwitterXmlStatus($twitter_status);
-            }
-        }
-
-        $this->elementEnd('statuses');
-        $this->endDocument('xml');
-    }
-
-    function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null, $logo=null)
-    {
-
-        $this->initDocument('rss');
-
-        $this->element('title', null, $title);
-        $this->element('link', null, $link);
-        if (!is_null($suplink)) {
-            // For FriendFeed's SUP protocol
-            $this->element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
-                                         'rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                         'href' => $suplink,
-                                         'type' => 'application/json'));
-        }
-
-        if (!is_null($logo)) {
-            $this->elementStart('image');
-            $this->element('link', null, $link);
-            $this->element('title', null, $title);
-            $this->element('url', null, $logo);
-            $this->elementEnd('image');
-        }
-
-        $this->element('description', null, $subtitle);
-        $this->element('language', null, 'en-us');
-        $this->element('ttl', null, '40');
-
-        if (is_array($notice)) {
-            foreach ($notice as $n) {
-                $entry = $this->twitterRssEntryArray($n);
-                $this->showTwitterRssItem($entry);
-            }
-        } else {
-            while ($notice->fetch()) {
-                $entry = $this->twitterRssEntryArray($notice);
-                $this->showTwitterRssItem($entry);
-            }
-        }
-
-        $this->endTwitterRss();
-    }
-
-    function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null, $logo=null)
-    {
-
-        $this->initDocument('atom');
-
-        $this->element('title', null, $title);
-        $this->element('id', null, $id);
-        $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
-
-        if (!is_null($logo)) {
-            $this->element('logo',null,$logo);
-        }
-
-        if (!is_null($suplink)) {
-            # For FriendFeed's SUP protocol
-            $this->element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                         'href' => $suplink,
-                                         'type' => 'application/json'));
-        }
-
-        if (!is_null($selfuri)) {
-            $this->element('link', array('href' => $selfuri,
-                'rel' => 'self', 'type' => 'application/atom+xml'), null);
-        }
-
-        $this->element('updated', null, common_date_iso8601('now'));
-        $this->element('subtitle', null, $subtitle);
-
-        if (is_array($notice)) {
-            foreach ($notice as $n) {
-                $this->raw($n->asAtomEntry());
-            }
-        } else {
-            while ($notice->fetch()) {
-                $this->raw($notice->asAtomEntry());
-            }
-        }
-
-        $this->endDocument('atom');
-
-    }
-
-    function showRssGroups($group, $title, $link, $subtitle)
-    {
-
-        $this->initDocument('rss');
-
-        $this->element('title', null, $title);
-        $this->element('link', null, $link);
-        $this->element('description', null, $subtitle);
-        $this->element('language', null, 'en-us');
-        $this->element('ttl', null, '40');
-
-        if (is_array($group)) {
-            foreach ($group as $g) {
-                $twitter_group = $this->twitterRssGroupArray($g);
-                $this->showTwitterRssItem($twitter_group);
-            }
-        } else {
-            while ($group->fetch()) {
-                $twitter_group = $this->twitterRssGroupArray($group);
-                $this->showTwitterRssItem($twitter_group);
-            }
-        }
-
-        $this->endTwitterRss();
-    }
-
-    function showTwitterAtomEntry($entry)
-    {
-        $this->elementStart('entry');
-        $this->element('title', null, $entry['title']);
-        $this->element('content', array('type' => 'html'), $entry['content']);
-        $this->element('id', null, $entry['id']);
-        $this->element('published', null, $entry['published']);
-        $this->element('updated', null, $entry['updated']);
-        $this->element('link', array('type' => 'text/html',
-                                     'href' => $entry['link'],
-                                     'rel' => 'alternate'));
-        $this->element('link', array('type' => $entry['avatar-type'],
-                                     'href' => $entry['avatar'],
-                                     'rel' => 'image'));
-        $this->elementStart('author');
-
-        $this->element('name', null, $entry['author-name']);
-        $this->element('uri', null, $entry['author-uri']);
-
-        $this->elementEnd('author');
-        $this->elementEnd('entry');
-    }
-
-    function showXmlDirectMessage($dm)
-    {
-        $this->elementStart('direct_message');
-        foreach($dm as $element => $value) {
-            switch ($element) {
-            case 'sender':
-            case 'recipient':
-                $this->showTwitterXmlUser($value, $element);
-                break;
-            case 'text':
-                $this->element($element, null, common_xml_safe_str($value));
-                break;
-            default:
-                $this->element($element, null, $value);
-                break;
-            }
-        }
-        $this->elementEnd('direct_message');
-    }
-
-    function directMessageArray($message)
-    {
-        $dmsg = array();
-
-        $from_profile = $message->getFrom();
-        $to_profile = $message->getTo();
-
-        $dmsg['id'] = $message->id;
-        $dmsg['sender_id'] = $message->from_profile;
-        $dmsg['text'] = trim($message->content);
-        $dmsg['recipient_id'] = $message->to_profile;
-        $dmsg['created_at'] = $this->dateTwitter($message->created);
-        $dmsg['sender_screen_name'] = $from_profile->nickname;
-        $dmsg['recipient_screen_name'] = $to_profile->nickname;
-        $dmsg['sender'] = $this->twitterUserArray($from_profile, false);
-        $dmsg['recipient'] = $this->twitterUserArray($to_profile, false);
-
-        return $dmsg;
-    }
-
-    function rssDirectMessageArray($message)
-    {
-        $entry = array();
-
-        $from = $message->getFrom();
-
-        $entry['title'] = sprintf('Message from %1$s to %2$s',
-            $from->nickname, $message->getTo()->nickname);
-
-        $entry['content'] = common_xml_safe_str($message->rendered);
-        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
-        $entry['published'] = common_date_iso8601($message->created);
-
-        $taguribase = common_config('integration', 'taguri');
-
-        $entry['id'] = "tag:$taguribase:$entry[link]";
-        $entry['updated'] = $entry['published'];
-
-        $entry['author-name'] = $from->getBestName();
-        $entry['author-uri'] = $from->homepage;
-
-        $avatar = $from->getAvatar(AVATAR_STREAM_SIZE);
-
-        $entry['avatar']      = (!empty($avatar)) ? $avatar->url : Avatar::defaultImage(AVATAR_STREAM_SIZE);
-        $entry['avatar-type'] = (!empty($avatar)) ? $avatar->mediatype : 'image/png';
-
-        // RSS item specific
-
-        $entry['description'] = $entry['content'];
-        $entry['pubDate'] = common_date_rfc2822($message->created);
-        $entry['guid'] = $entry['link'];
-
-        return $entry;
-    }
-
-    function showSingleXmlDirectMessage($message)
-    {
-        $this->initDocument('xml');
-        $dmsg = $this->directMessageArray($message);
-        $this->showXmlDirectMessage($dmsg);
-        $this->endDocument('xml');
-    }
-
-    function showSingleJsonDirectMessage($message)
-    {
-        $this->initDocument('json');
-        $dmsg = $this->directMessageArray($message);
-        $this->showJsonObjects($dmsg);
-        $this->endDocument('json');
-    }
-
-    function showAtomGroups($group, $title, $id, $link, $subtitle=null, $selfuri=null)
-    {
-
-        $this->initDocument('atom');
-
-        $this->element('title', null, $title);
-        $this->element('id', null, $id);
-        $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
-
-        if (!is_null($selfuri)) {
-            $this->element('link', array('href' => $selfuri,
-                'rel' => 'self', 'type' => 'application/atom+xml'), null);
-        }
-
-        $this->element('updated', null, common_date_iso8601('now'));
-        $this->element('subtitle', null, $subtitle);
-
-        if (is_array($group)) {
-            foreach ($group as $g) {
-                $this->raw($g->asAtomEntry());
-            }
-        } else {
-            while ($group->fetch()) {
-                $this->raw($group->asAtomEntry());
-            }
-        }
-
-        $this->endDocument('atom');
-
-    }
-
-    function showJsonTimeline($notice)
-    {
-
-        $this->initDocument('json');
-
-        $statuses = array();
-
-        if (is_array($notice)) {
-            foreach ($notice as $n) {
-                $twitter_status = $this->twitterStatusArray($n);
-                array_push($statuses, $twitter_status);
-            }
-        } else {
-            while ($notice->fetch()) {
-                $twitter_status = $this->twitterStatusArray($notice);
-                array_push($statuses, $twitter_status);
-            }
-        }
-
-        $this->showJsonObjects($statuses);
-
-        $this->endDocument('json');
-    }
-
-    function showJsonGroups($group)
-    {
-
-        $this->initDocument('json');
-
-        $groups = array();
-
-        if (is_array($group)) {
-            foreach ($group as $g) {
-                $twitter_group = $this->twitterGroupArray($g);
-                array_push($groups, $twitter_group);
-            }
-        } else {
-            while ($group->fetch()) {
-                $twitter_group = $this->twitterGroupArray($group);
-                array_push($groups, $twitter_group);
-            }
-        }
-
-        $this->showJsonObjects($groups);
-
-        $this->endDocument('json');
-    }
-
-    function showXmlGroups($group)
-    {
-
-        $this->initDocument('xml');
-        $this->elementStart('groups', array('type' => 'array'));
-
-        if (is_array($group)) {
-            foreach ($group as $g) {
-                $twitter_group = $this->twitterGroupArray($g);
-                $this->showTwitterXmlGroup($twitter_group);
-            }
-        } else {
-            while ($group->fetch()) {
-                $twitter_group = $this->twitterGroupArray($group);
-                $this->showTwitterXmlGroup($twitter_group);
-            }
-        }
-
-        $this->elementEnd('groups');
-        $this->endDocument('xml');
-    }
-
-    function showTwitterXmlUsers($user)
-    {
-
-        $this->initDocument('xml');
-        $this->elementStart('users', array('type' => 'array'));
-
-        if (is_array($user)) {
-            foreach ($user as $u) {
-                $twitter_user = $this->twitterUserArray($u);
-                $this->showTwitterXmlUser($twitter_user);
-            }
-        } else {
-            while ($user->fetch()) {
-                $twitter_user = $this->twitterUserArray($user);
-                $this->showTwitterXmlUser($twitter_user);
-            }
-        }
-
-        $this->elementEnd('users');
-        $this->endDocument('xml');
-    }
-
-    function showJsonUsers($user)
-    {
-
-        $this->initDocument('json');
-
-        $users = array();
-
-        if (is_array($user)) {
-            foreach ($user as $u) {
-                $twitter_user = $this->twitterUserArray($u);
-                array_push($users, $twitter_user);
-            }
-        } else {
-            while ($user->fetch()) {
-                $twitter_user = $this->twitterUserArray($user);
-                array_push($users, $twitter_user);
-            }
-        }
-
-        $this->showJsonObjects($users);
-
-        $this->endDocument('json');
-    }
-
-    function showSingleJsonGroup($group)
-    {
-        $this->initDocument('json');
-        $twitter_group = $this->twitterGroupArray($group);
-        $this->showJsonObjects($twitter_group);
-        $this->endDocument('json');
-    }
-
-    function showSingleXmlGroup($group)
-    {
-        $this->initDocument('xml');
-        $twitter_group = $this->twitterGroupArray($group);
-        $this->showTwitterXmlGroup($twitter_group);
-        $this->endDocument('xml');
-    }
-
-    function dateTwitter($dt)
-    {
-        $dateStr = date('d F Y H:i:s', strtotime($dt));
-        $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-        $d->setTimezone(new DateTimeZone(common_timezone()));
-        return $d->format('D M d H:i:s O Y');
-    }
-
-    function initDocument($type='xml')
-    {
-        switch ($type) {
-        case 'xml':
-            header('Content-Type: application/xml; charset=utf-8');
-            $this->startXML();
-            break;
-        case 'json':
-            header('Content-Type: application/json; charset=utf-8');
-
-            // Check for JSONP callback
-            $callback = $this->arg('callback');
-            if ($callback) {
-                print $callback . '(';
-            }
-            break;
-        case 'rss':
-            header("Content-Type: application/rss+xml; charset=utf-8");
-            $this->initTwitterRss();
-            break;
-        case 'atom':
-            header('Content-Type: application/atom+xml; charset=utf-8');
-            $this->initTwitterAtom();
-            break;
-        default:
-            $this->clientError(_('Not a supported data format.'));
-            break;
-        }
-
-        return;
-    }
-
-    function endDocument($type='xml')
-    {
-        switch ($type) {
-        case 'xml':
-            $this->endXML();
-            break;
-        case 'json':
-
-            // Check for JSONP callback
-            $callback = $this->arg('callback');
-            if ($callback) {
-                print ')';
-            }
-            break;
-        case 'rss':
-            $this->endTwitterRss();
-            break;
-        case 'atom':
-            $this->endTwitterRss();
-            break;
-        default:
-            $this->clientError(_('Not a supported data format.'));
-            break;
-        }
-        return;
-    }
-
-    function clientError($msg, $code = 400, $format = 'xml')
-    {
-        $action = $this->trimmed('action');
-
-        common_debug("User error '$code' on '$action': $msg", __FILE__);
-
-        if (!array_key_exists($code, ClientErrorAction::$status)) {
-            $code = 400;
-        }
-
-        $status_string = ClientErrorAction::$status[$code];
-
-        header('HTTP/1.1 '.$code.' '.$status_string);
-
-        if ($format == 'xml') {
-            $this->initDocument('xml');
-            $this->elementStart('hash');
-            $this->element('error', null, $msg);
-            $this->element('request', null, $_SERVER['REQUEST_URI']);
-            $this->elementEnd('hash');
-            $this->endDocument('xml');
-        } elseif ($format == 'json'){
-            $this->initDocument('json');
-            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-            print(json_encode($error_array));
-            $this->endDocument('json');
-        } else {
-
-            // If user didn't request a useful format, throw a regular client error
-            throw new ClientException($msg, $code);
-        }
-    }
-
-    function serverError($msg, $code = 500, $content_type = 'xml')
-    {
-        $action = $this->trimmed('action');
-
-        common_debug("Server error '$code' on '$action': $msg", __FILE__);
-
-        if (!array_key_exists($code, ServerErrorAction::$status)) {
-            $code = 400;
-        }
-
-        $status_string = ServerErrorAction::$status[$code];
-
-        header('HTTP/1.1 '.$code.' '.$status_string);
-
-        if ($content_type == 'xml') {
-            $this->initDocument('xml');
-            $this->elementStart('hash');
-            $this->element('error', null, $msg);
-            $this->element('request', null, $_SERVER['REQUEST_URI']);
-            $this->elementEnd('hash');
-            $this->endDocument('xml');
-        } else {
-            $this->initDocument('json');
-            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-            print(json_encode($error_array));
-            $this->endDocument('json');
-        }
-    }
-
-    function initTwitterRss()
-    {
-        $this->startXML();
-        $this->elementStart('rss', array('version' => '2.0', 'xmlns:atom'=>'http://www.w3.org/2005/Atom'));
-        $this->elementStart('channel');
-        Event::handle('StartApiRss', array($this));
-    }
-
-    function endTwitterRss()
-    {
-        $this->elementEnd('channel');
-        $this->elementEnd('rss');
-        $this->endXML();
-    }
-
-    function initTwitterAtom()
-    {
-        $this->startXML();
-        // FIXME: don't hardcode the language here!
-        $this->elementStart('feed', array('xmlns' => 'http://www.w3.org/2005/Atom',
-                                          'xml:lang' => 'en-US',
-                                          'xmlns:thr' => 'http://purl.org/syndication/thread/1.0'));
-    }
-
-    function endTwitterAtom()
-    {
-        $this->elementEnd('feed');
-        $this->endXML();
-    }
-
-    function showProfile($profile, $content_type='xml', $notice=null, $includeStatuses=true)
-    {
-        $profile_array = $this->twitterUserArray($profile, $includeStatuses);
-        switch ($content_type) {
-        case 'xml':
-            $this->showTwitterXmlUser($profile_array);
-            break;
-        case 'json':
-            $this->showJsonObjects($profile_array);
-            break;
-        default:
-            $this->clientError(_('Not a supported data format.'));
-            return;
-        }
-        return;
-    }
-
-    function getTargetUser($id)
-    {
-        if (empty($id)) {
-
-            // Twitter supports these other ways of passing the user ID
-            if (is_numeric($this->arg('id'))) {
-                return User::staticGet($this->arg('id'));
-            } else if ($this->arg('id')) {
-                $nickname = common_canonical_nickname($this->arg('id'));
-                return User::staticGet('nickname', $nickname);
-            } else if ($this->arg('user_id')) {
-                // This is to ensure that a non-numeric user_id still
-                // overrides screen_name even if it doesn't get used
-                if (is_numeric($this->arg('user_id'))) {
-                    return User::staticGet('id', $this->arg('user_id'));
-                }
-            } else if ($this->arg('screen_name')) {
-                $nickname = common_canonical_nickname($this->arg('screen_name'));
-                return User::staticGet('nickname', $nickname);
-            } else {
-                // Fall back to trying the currently authenticated user
-                return $this->auth_user;
-            }
-
-        } else if (is_numeric($id)) {
-            return User::staticGet($id);
-        } else {
-            $nickname = common_canonical_nickname($id);
-            return User::staticGet('nickname', $nickname);
-        }
-    }
-
-    function getTargetGroup($id)
-    {
-        if (empty($id)) {
-            if (is_numeric($this->arg('id'))) {
-                return User_group::staticGet($this->arg('id'));
-            } else if ($this->arg('id')) {
-                $nickname = common_canonical_nickname($this->arg('id'));
-                return User_group::staticGet('nickname', $nickname);
-            } else if ($this->arg('group_id')) {
-                // This is to ensure that a non-numeric user_id still
-                // overrides screen_name even if it doesn't get used
-                if (is_numeric($this->arg('group_id'))) {
-                    return User_group::staticGet('id', $this->arg('group_id'));
-                }
-            } else if ($this->arg('group_name')) {
-                $nickname = common_canonical_nickname($this->arg('group_name'));
-                return User_group::staticGet('nickname', $nickname);
-            }
-
-        } else if (is_numeric($id)) {
-            return User_group::staticGet($id);
-        } else {
-            $nickname = common_canonical_nickname($id);
-            return User_group::staticGet('nickname', $nickname);
-        }
-    }
-
-    function sourceLink($source)
-    {
-        $source_name = _($source);
-        switch ($source) {
-        case 'web':
-        case 'xmpp':
-        case 'mail':
-        case 'omb':
-        case 'api':
-            break;
-        default:
-
-            $name = null;
-            $url  = null;
-
-            $ns = Notice_source::staticGet($source);
-
-            if ($ns) {
-                $name = $ns->name;
-                $url  = $ns->url;
-            } else {
-                $app = Oauth_application::staticGet('name', $source);
-                if ($app) {
-                    $name = $app->name;
-                    $url  = $app->source_url;
-                }
-            }
-
-            if (!empty($name) && !empty($url)) {
-                $source_name = '<a href="' . $url . '">' . $name . '</a>';
-            }
-
-            break;
-        }
-        return $source_name;
-    }
-
-    /**
-     * Returns query argument or default value if not found. Certain
-     * parameters used throughout the API are lightly scrubbed and
-     * bounds checked.  This overrides Action::arg().
-     *
-     * @param string $key requested argument
-     * @param string $def default value to return if $key is not provided
-     *
-     * @return var $var
-     */
-    function arg($key, $def=null)
-    {
-
-        // XXX: Do even more input validation/scrubbing?
-
-        if (array_key_exists($key, $this->args)) {
-            switch($key) {
-            case 'page':
-                $page = (int)$this->args['page'];
-                return ($page < 1) ? 1 : $page;
-            case 'count':
-                $count = (int)$this->args['count'];
-                if ($count < 1) {
-                    return 20;
-                } elseif ($count > 200) {
-                    return 200;
-                } else {
-                    return $count;
-                }
-            case 'since_id':
-                $since_id = (int)$this->args['since_id'];
-                return ($since_id < 1) ? 0 : $since_id;
-            case 'max_id':
-                $max_id = (int)$this->args['max_id'];
-                return ($max_id < 1) ? 0 : $max_id;
-            case 'since':
-                return strtotime($this->args['since']);
-            default:
-                return parent::arg($key, $def);
-            }
-        } else {
-            return $def;
-        }
-    }
-
-    function getSelfUri($action, $aargs)
-    {
-        parse_str($_SERVER['QUERY_STRING'], $params);
-        $pstring = '';
-        if (!empty($params)) {
-            unset($params['p']);
-            $pstring = http_build_query($params);
-        }
-
-        $uri = common_local_url($action, $aargs);
-
-        if (!empty($pstring)) {
-            $uri .= '?' . $pstring;
-        }
-
-        return $uri;
-    }
-
-}
diff --git a/lib/apiaction.php b/lib/apiaction.php
new file mode 100644 (file)
index 0000000..eef0ba6
--- /dev/null
@@ -0,0 +1,1357 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Base API action
+ *
+ * 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
+ * @package   StatusNet
+ * @author    Craig Andrews <candrews@integralblue.com>
+ * @author    Dan Moore <dan@moore.cx>
+ * @author    Evan Prodromou <evan@status.net>
+ * @author    Jeffery To <jeffery.to@gmail.com>
+ * @author    Toby Inkster <mail@tobyinkster.co.uk>
+ * @author    Zach Copley <zach@status.net>
+ * @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')) {
+    exit(1);
+}
+
+/**
+ * Contains most of the Twitter-compatible API output functions.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Craig Andrews <candrews@integralblue.com>
+ * @author   Dan Moore <dan@moore.cx>
+ * @author   Evan Prodromou <evan@status.net>
+ * @author   Jeffery To <jeffery.to@gmail.com>
+ * @author   Toby Inkster <mail@tobyinkster.co.uk>
+ * @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 ApiAction extends Action
+{
+    const READ_ONLY  = 1;
+    const READ_WRITE = 2;
+
+    var $format    = null;
+    var $user      = null;
+    var $auth_user = null;
+    var $page      = null;
+    var $count     = null;
+    var $max_id    = null;
+    var $since_id  = null;
+
+    var $access    = self::READ_ONLY;  // read (default) or read-write
+
+    /**
+     * Initialization.
+     *
+     * @param array $args Web and URL arguments
+     *
+     * @return boolean false if user doesn't exist
+     */
+
+    function prepare($args)
+    {
+        StatusNet::setApi(true); // reduce exception reports to aid in debugging
+        parent::prepare($args);
+
+        $this->format   = $this->arg('format');
+        $this->page     = (int)$this->arg('page', 1);
+        $this->count    = (int)$this->arg('count', 20);
+        $this->max_id   = (int)$this->arg('max_id', 0);
+        $this->since_id = (int)$this->arg('since_id', 0);
+
+        if ($this->arg('since')) {
+            $this->clientError(_("since parameter is disabled for performance; use since_id"), 403);
+        }
+
+        return true;
+    }
+
+    /**
+     * Handle a request
+     *
+     * @param array $args Arguments from $_REQUEST
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+    }
+
+    /**
+     * Overrides XMLOutputter::element to write booleans as strings (true|false).
+     * See that method's documentation for more info.
+     *
+     * @param string $tag     Element type or tagname
+     * @param array  $attrs   Array of element attributes, as
+     *                        key-value pairs
+     * @param string $content string content of the element
+     *
+     * @return void
+     */
+    function element($tag, $attrs=null, $content=null)
+    {
+        if (is_bool($content)) {
+            $content = ($content ? 'true' : 'false');
+        }
+
+        return parent::element($tag, $attrs, $content);
+    }
+
+    function twitterUserArray($profile, $get_notice=false)
+    {
+        $twitter_user = array();
+
+        $twitter_user['id'] = intval($profile->id);
+        $twitter_user['name'] = $profile->getBestName();
+        $twitter_user['screen_name'] = $profile->nickname;
+        $twitter_user['location'] = ($profile->location) ? $profile->location : null;
+        $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
+
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+        $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() :
+            Avatar::defaultImage(AVATAR_STREAM_SIZE);
+
+        $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
+        $twitter_user['protected'] = false; # not supported by StatusNet yet
+        $twitter_user['followers_count'] = $profile->subscriberCount();
+
+        $design        = null;
+        $user          = $profile->getUser();
+
+        // Note: some profiles don't have an associated user
+
+        $defaultDesign = Design::siteDesign();
+
+        if (!empty($user)) {
+            $design = $user->getDesign();
+        }
+
+        if (empty($design)) {
+            $design = $defaultDesign;
+        }
+
+        $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor);
+        $twitter_user['profile_background_color'] = ($color == null) ? '' : '#'.$color->hexValue();
+        $color = Design::toWebColor(empty($design->textcolor) ? $defaultDesign->textcolor : $design->textcolor);
+        $twitter_user['profile_text_color'] = ($color == null) ? '' : '#'.$color->hexValue();
+        $color = Design::toWebColor(empty($design->linkcolor) ? $defaultDesign->linkcolor : $design->linkcolor);
+        $twitter_user['profile_link_color'] = ($color == null) ? '' : '#'.$color->hexValue();
+        $color = Design::toWebColor(empty($design->sidebarcolor) ? $defaultDesign->sidebarcolor : $design->sidebarcolor);
+        $twitter_user['profile_sidebar_fill_color'] = ($color == null) ? '' : '#'.$color->hexValue();
+        $twitter_user['profile_sidebar_border_color'] = '';
+
+        $twitter_user['friends_count'] = $profile->subscriptionCount();
+
+        $twitter_user['created_at'] = $this->dateTwitter($profile->created);
+
+        $twitter_user['favourites_count'] = $profile->faveCount(); // British spelling!
+
+        $timezone = 'UTC';
+
+        if (!empty($user) && $user->timezone) {
+            $timezone = $user->timezone;
+        }
+
+        $t = new DateTime;
+        $t->setTimezone(new DateTimeZone($timezone));
+
+        $twitter_user['utc_offset'] = $t->format('Z');
+        $twitter_user['time_zone'] = $timezone;
+
+        $twitter_user['profile_background_image_url']
+            = empty($design->backgroundimage)
+            ? '' : ($design->disposition & BACKGROUND_ON)
+            ? Design::url($design->backgroundimage) : '';
+
+        $twitter_user['profile_background_tile']
+            = empty($design->disposition)
+            ? '' : ($design->disposition & BACKGROUND_TILE) ? 'true' : 'false';
+
+        $twitter_user['statuses_count'] = $profile->noticeCount();
+
+        // Is the requesting user following this user?
+        $twitter_user['following'] = false;
+        $twitter_user['notifications'] = false;
+
+        if (isset($this->auth_user)) {
+
+            $twitter_user['following'] = $this->auth_user->isSubscribed($profile);
+
+            // Notifications on?
+            $sub = Subscription::pkeyGet(array('subscriber' =>
+                                               $this->auth_user->id,
+                                               'subscribed' => $profile->id));
+
+            if ($sub) {
+                $twitter_user['notifications'] = ($sub->jabber || $sub->sms);
+            }
+        }
+
+        if ($get_notice) {
+            $notice = $profile->getCurrentNotice();
+            if ($notice) {
+                # don't get user!
+                $twitter_user['status'] = $this->twitterStatusArray($notice, false);
+            }
+        }
+
+        return $twitter_user;
+    }
+
+    function twitterStatusArray($notice, $include_user=true)
+    {
+        $base = $this->twitterSimpleStatusArray($notice, $include_user);
+
+        if (!empty($notice->repeat_of)) {
+            $original = Notice::staticGet('id', $notice->repeat_of);
+            if (!empty($original)) {
+                $original_array = $this->twitterSimpleStatusArray($original, $include_user);
+                $base['retweeted_status'] = $original_array;
+            }
+        }
+
+        return $base;
+    }
+
+    function twitterSimpleStatusArray($notice, $include_user=true)
+    {
+        $profile = $notice->getProfile();
+
+        $twitter_status = array();
+        $twitter_status['text'] = $notice->content;
+        $twitter_status['truncated'] = false; # Not possible on StatusNet
+        $twitter_status['created_at'] = $this->dateTwitter($notice->created);
+        $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ?
+            intval($notice->reply_to) : null;
+        $twitter_status['source'] = $this->sourceLink($notice->source);
+        $twitter_status['id'] = intval($notice->id);
+
+        $replier_profile = null;
+
+        if ($notice->reply_to) {
+            $reply = Notice::staticGet(intval($notice->reply_to));
+            if ($reply) {
+                $replier_profile = $reply->getProfile();
+            }
+        }
+
+        $twitter_status['in_reply_to_user_id'] =
+            ($replier_profile) ? intval($replier_profile->id) : null;
+        $twitter_status['in_reply_to_screen_name'] =
+            ($replier_profile) ? $replier_profile->nickname : null;
+
+        if (isset($notice->lat) && isset($notice->lon)) {
+            // This is the format that GeoJSON expects stuff to be in
+            $twitter_status['geo'] = array('type' => 'Point',
+                                           'coordinates' => array((float) $notice->lat,
+                                                                  (float) $notice->lon));
+        } else {
+            $twitter_status['geo'] = null;
+        }
+
+        if (isset($this->auth_user)) {
+            $twitter_status['favorited'] = $this->auth_user->hasFave($notice);
+        } else {
+            $twitter_status['favorited'] = false;
+        }
+
+        // Enclosures
+        $attachments = $notice->attachments();
+
+        if (!empty($attachments)) {
+
+            $twitter_status['attachments'] = array();
+
+            foreach ($attachments as $attachment) {
+                $enclosure_o=$attachment->getEnclosure();
+                if ($enclosure_o) {
+                    $enclosure = array();
+                    $enclosure['url'] = $enclosure_o->url;
+                    $enclosure['mimetype'] = $enclosure_o->mimetype;
+                    $enclosure['size'] = $enclosure_o->size;
+                    $twitter_status['attachments'][] = $enclosure;
+                }
+            }
+        }
+
+        if ($include_user && $profile) {
+            # Don't get notice (recursive!)
+            $twitter_user = $this->twitterUserArray($profile, false);
+            $twitter_status['user'] = $twitter_user;
+        }
+
+        return $twitter_status;
+    }
+
+    function twitterGroupArray($group)
+    {
+        $twitter_group=array();
+        $twitter_group['id']=$group->id;
+        $twitter_group['url']=$group->permalink();
+        $twitter_group['nickname']=$group->nickname;
+        $twitter_group['fullname']=$group->fullname;
+        $twitter_group['homepage_url']=$group->homepage_url;
+        $twitter_group['original_logo']=$group->original_logo;
+        $twitter_group['homepage_logo']=$group->homepage_logo;
+        $twitter_group['stream_logo']=$group->stream_logo;
+        $twitter_group['mini_logo']=$group->mini_logo;
+        $twitter_group['homepage']=$group->homepage;
+        $twitter_group['description']=$group->description;
+        $twitter_group['location']=$group->location;
+        $twitter_group['created']=$this->dateTwitter($group->created);
+        $twitter_group['modified']=$this->dateTwitter($group->modified);
+        return $twitter_group;
+    }
+
+    function twitterRssGroupArray($group)
+    {
+        $entry = array();
+        $entry['content']=$group->description;
+        $entry['title']=$group->nickname;
+        $entry['link']=$group->permalink();
+        $entry['published']=common_date_iso8601($group->created);
+        $entry['updated']==common_date_iso8601($group->modified);
+        $taguribase = common_config('integration', 'groupuri');
+        $entry['id'] = "group:$groupuribase:$entry[link]";
+
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($group->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function twitterRssEntryArray($notice)
+    {
+        $profile = $notice->getProfile();
+        $entry = array();
+
+        // We trim() to avoid extraneous whitespace in the output
+
+        $entry['content'] = common_xml_safe_str(trim($notice->rendered));
+        $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+        $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
+        $entry['published'] = common_date_iso8601($notice->created);
+
+        $taguribase = TagURI::base();
+        $entry['id'] = "tag:$taguribase:$entry[link]";
+
+        $entry['updated'] = $entry['published'];
+        $entry['author'] = $profile->getBestName();
+
+        // Enclosures
+        $attachments = $notice->attachments();
+        $enclosures = array();
+
+        foreach ($attachments as $attachment) {
+            $enclosure_o=$attachment->getEnclosure();
+            if ($enclosure_o) {
+                 $enclosure = array();
+                 $enclosure['url'] = $enclosure_o->url;
+                 $enclosure['mimetype'] = $enclosure_o->mimetype;
+                 $enclosure['size'] = $enclosure_o->size;
+                 $enclosures[] = $enclosure;
+            }
+        }
+
+        if (!empty($enclosures)) {
+            $entry['enclosures'] = $enclosures;
+        }
+
+        // Tags/Categories
+        $tag = new Notice_tag();
+        $tag->notice_id = $notice->id;
+        if ($tag->find()) {
+            $entry['tags']=array();
+            while ($tag->fetch()) {
+                $entry['tags'][]=$tag->tag;
+            }
+        }
+        $tag->free();
+
+        // RSS Item specific
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($notice->created);
+        $entry['guid'] = $entry['link'];
+
+        if (isset($notice->lat) && isset($notice->lon)) {
+            // This is the format that GeoJSON expects stuff to be in.
+            // showGeoRSS() below uses it for XML output, so we reuse it
+            $entry['geo'] = array('type' => 'Point',
+                                  'coordinates' => array((float) $notice->lat,
+                                                         (float) $notice->lon));
+        } else {
+            $entry['geo'] = null;
+        }
+
+        return $entry;
+    }
+
+    function twitterRelationshipArray($source, $target)
+    {
+        $relationship = array();
+
+        $relationship['source'] =
+            $this->relationshipDetailsArray($source, $target);
+        $relationship['target'] =
+            $this->relationshipDetailsArray($target, $source);
+
+        return array('relationship' => $relationship);
+    }
+
+    function relationshipDetailsArray($source, $target)
+    {
+        $details = array();
+
+        $details['screen_name'] = $source->nickname;
+        $details['followed_by'] = $target->isSubscribed($source);
+        $details['following'] = $source->isSubscribed($target);
+
+        $notifications = false;
+
+        if ($source->isSubscribed($target)) {
+
+            $sub = Subscription::pkeyGet(array('subscriber' =>
+                $source->id, 'subscribed' => $target->id));
+
+            if (!empty($sub)) {
+                $notifications = ($sub->jabber || $sub->sms);
+            }
+        }
+
+        $details['notifications_enabled'] = $notifications;
+        $details['blocking'] = $source->hasBlocked($target);
+        $details['id'] = $source->id;
+
+        return $details;
+    }
+
+    function showTwitterXmlRelationship($relationship)
+    {
+        $this->elementStart('relationship');
+
+        foreach($relationship as $element => $value) {
+            if ($element == 'source' || $element == 'target') {
+                $this->elementStart($element);
+                $this->showXmlRelationshipDetails($value);
+                $this->elementEnd($element);
+            }
+        }
+
+        $this->elementEnd('relationship');
+    }
+
+    function showXmlRelationshipDetails($details)
+    {
+        foreach($details as $element => $value) {
+            $this->element($element, null, $value);
+        }
+    }
+
+    function showTwitterXmlStatus($twitter_status, $tag='status')
+    {
+        $this->elementStart($tag);
+        foreach($twitter_status as $element => $value) {
+            switch ($element) {
+            case 'user':
+                $this->showTwitterXmlUser($twitter_status['user']);
+                break;
+            case 'text':
+                $this->element($element, null, common_xml_safe_str($value));
+                break;
+            case 'attachments':
+                $this->showXmlAttachments($twitter_status['attachments']);
+                break;
+            case 'geo':
+                $this->showGeoRSS($value);
+                break;
+            case 'retweeted_status':
+                $this->showTwitterXmlStatus($value, 'retweeted_status');
+                break;
+            default:
+                $this->element($element, null, $value);
+            }
+        }
+        $this->elementEnd($tag);
+    }
+
+    function showTwitterXmlGroup($twitter_group)
+    {
+        $this->elementStart('group');
+        foreach($twitter_group as $element => $value) {
+            $this->element($element, null, $value);
+        }
+        $this->elementEnd('group');
+    }
+
+    function showTwitterXmlUser($twitter_user, $role='user')
+    {
+        $this->elementStart($role);
+        foreach($twitter_user as $element => $value) {
+            if ($element == 'status') {
+                $this->showTwitterXmlStatus($twitter_user['status']);
+            } else {
+                $this->element($element, null, $value);
+            }
+        }
+        $this->elementEnd($role);
+    }
+
+    function showXmlAttachments($attachments) {
+        if (!empty($attachments)) {
+            $this->elementStart('attachments', array('type' => 'array'));
+            foreach ($attachments as $attachment) {
+                $attrs = array();
+                $attrs['url'] = $attachment['url'];
+                $attrs['mimetype'] = $attachment['mimetype'];
+                $attrs['size'] = $attachment['size'];
+                $this->element('enclosure', $attrs, '');
+            }
+            $this->elementEnd('attachments');
+        }
+    }
+
+    function showGeoRSS($geo)
+    {
+        if (empty($geo)) {
+            // empty geo element
+            $this->element('geo');
+        } else {
+            $this->elementStart('geo', array('xmlns:georss' => 'http://www.georss.org/georss'));
+            $this->element('georss:point', null, $geo['coordinates'][0] . ' ' . $geo['coordinates'][1]);
+            $this->elementEnd('geo');
+        }
+    }
+
+    function showTwitterRssItem($entry)
+    {
+        $this->elementStart('item');
+        $this->element('title', null, $entry['title']);
+        $this->element('description', null, $entry['description']);
+        $this->element('pubDate', null, $entry['pubDate']);
+        $this->element('guid', null, $entry['guid']);
+        $this->element('link', null, $entry['link']);
+
+        # RSS only supports 1 enclosure per item
+        if(array_key_exists('enclosures', $entry) and !empty($entry['enclosures'])){
+            $enclosure = $entry['enclosures'][0];
+            $this->element('enclosure', array('url'=>$enclosure['url'],'type'=>$enclosure['mimetype'],'length'=>$enclosure['size']), null);
+        }
+
+        if(array_key_exists('tags', $entry)){
+            foreach($entry['tags'] as $tag){
+                $this->element('category', null,$tag);
+            }
+        }
+
+        $this->showGeoRSS($entry['geo']);
+        $this->elementEnd('item');
+    }
+
+    function showJsonObjects($objects)
+    {
+        print(json_encode($objects));
+    }
+
+    function showSingleXmlStatus($notice)
+    {
+        $this->initDocument('xml');
+        $twitter_status = $this->twitterStatusArray($notice);
+        $this->showTwitterXmlStatus($twitter_status);
+        $this->endDocument('xml');
+    }
+
+    function show_single_json_status($notice)
+    {
+        $this->initDocument('json');
+        $status = $this->twitterStatusArray($notice);
+        $this->showJsonObjects($status);
+        $this->endDocument('json');
+    }
+
+    function showXmlTimeline($notice)
+    {
+
+        $this->initDocument('xml');
+        $this->elementStart('statuses', array('type' => 'array'));
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitterStatusArray($n);
+                $this->showTwitterXmlStatus($twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitterStatusArray($notice);
+                $this->showTwitterXmlStatus($twitter_status);
+            }
+        }
+
+        $this->elementEnd('statuses');
+        $this->endDocument('xml');
+    }
+
+    function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null, $logo=null)
+    {
+
+        $this->initDocument('rss');
+
+        $this->element('title', null, $title);
+        $this->element('link', null, $link);
+        if (!is_null($suplink)) {
+            // For FriendFeed's SUP protocol
+            $this->element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
+                                         'rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+
+        if (!is_null($logo)) {
+            $this->elementStart('image');
+            $this->element('link', null, $link);
+            $this->element('title', null, $title);
+            $this->element('url', null, $logo);
+            $this->elementEnd('image');
+        }
+
+        $this->element('description', null, $subtitle);
+        $this->element('language', null, 'en-us');
+        $this->element('ttl', null, '40');
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $entry = $this->twitterRssEntryArray($n);
+                $this->showTwitterRssItem($entry);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $entry = $this->twitterRssEntryArray($notice);
+                $this->showTwitterRssItem($entry);
+            }
+        }
+
+        $this->endTwitterRss();
+    }
+
+    function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null, $logo=null)
+    {
+
+        $this->initDocument('atom');
+
+        $this->element('title', null, $title);
+        $this->element('id', null, $id);
+        $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
+
+        if (!is_null($logo)) {
+            $this->element('logo',null,$logo);
+        }
+
+        if (!is_null($suplink)) {
+            # For FriendFeed's SUP protocol
+            $this->element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+
+        if (!is_null($selfuri)) {
+            $this->element('link', array('href' => $selfuri,
+                'rel' => 'self', 'type' => 'application/atom+xml'), null);
+        }
+
+        $this->element('updated', null, common_date_iso8601('now'));
+        $this->element('subtitle', null, $subtitle);
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $this->raw($n->asAtomEntry());
+            }
+        } else {
+            while ($notice->fetch()) {
+                $this->raw($notice->asAtomEntry());
+            }
+        }
+
+        $this->endDocument('atom');
+
+    }
+
+    function showRssGroups($group, $title, $link, $subtitle)
+    {
+
+        $this->initDocument('rss');
+
+        $this->element('title', null, $title);
+        $this->element('link', null, $link);
+        $this->element('description', null, $subtitle);
+        $this->element('language', null, 'en-us');
+        $this->element('ttl', null, '40');
+
+        if (is_array($group)) {
+            foreach ($group as $g) {
+                $twitter_group = $this->twitterRssGroupArray($g);
+                $this->showTwitterRssItem($twitter_group);
+            }
+        } else {
+            while ($group->fetch()) {
+                $twitter_group = $this->twitterRssGroupArray($group);
+                $this->showTwitterRssItem($twitter_group);
+            }
+        }
+
+        $this->endTwitterRss();
+    }
+
+    function showTwitterAtomEntry($entry)
+    {
+        $this->elementStart('entry');
+        $this->element('title', null, $entry['title']);
+        $this->element('content', array('type' => 'html'), $entry['content']);
+        $this->element('id', null, $entry['id']);
+        $this->element('published', null, $entry['published']);
+        $this->element('updated', null, $entry['updated']);
+        $this->element('link', array('type' => 'text/html',
+                                     'href' => $entry['link'],
+                                     'rel' => 'alternate'));
+        $this->element('link', array('type' => $entry['avatar-type'],
+                                     'href' => $entry['avatar'],
+                                     'rel' => 'image'));
+        $this->elementStart('author');
+
+        $this->element('name', null, $entry['author-name']);
+        $this->element('uri', null, $entry['author-uri']);
+
+        $this->elementEnd('author');
+        $this->elementEnd('entry');
+    }
+
+    function showXmlDirectMessage($dm)
+    {
+        $this->elementStart('direct_message');
+        foreach($dm as $element => $value) {
+            switch ($element) {
+            case 'sender':
+            case 'recipient':
+                $this->showTwitterXmlUser($value, $element);
+                break;
+            case 'text':
+                $this->element($element, null, common_xml_safe_str($value));
+                break;
+            default:
+                $this->element($element, null, $value);
+                break;
+            }
+        }
+        $this->elementEnd('direct_message');
+    }
+
+    function directMessageArray($message)
+    {
+        $dmsg = array();
+
+        $from_profile = $message->getFrom();
+        $to_profile = $message->getTo();
+
+        $dmsg['id'] = $message->id;
+        $dmsg['sender_id'] = $message->from_profile;
+        $dmsg['text'] = trim($message->content);
+        $dmsg['recipient_id'] = $message->to_profile;
+        $dmsg['created_at'] = $this->dateTwitter($message->created);
+        $dmsg['sender_screen_name'] = $from_profile->nickname;
+        $dmsg['recipient_screen_name'] = $to_profile->nickname;
+        $dmsg['sender'] = $this->twitterUserArray($from_profile, false);
+        $dmsg['recipient'] = $this->twitterUserArray($to_profile, false);
+
+        return $dmsg;
+    }
+
+    function rssDirectMessageArray($message)
+    {
+        $entry = array();
+
+        $from = $message->getFrom();
+
+        $entry['title'] = sprintf('Message from %1$s to %2$s',
+            $from->nickname, $message->getTo()->nickname);
+
+        $entry['content'] = common_xml_safe_str($message->rendered);
+        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
+        $entry['published'] = common_date_iso8601($message->created);
+
+        $taguribase = TagURI::base();
+
+        $entry['id'] = "tag:$taguribase:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        $entry['author-name'] = $from->getBestName();
+        $entry['author-uri'] = $from->homepage;
+
+        $avatar = $from->getAvatar(AVATAR_STREAM_SIZE);
+
+        $entry['avatar']      = (!empty($avatar)) ? $avatar->url : Avatar::defaultImage(AVATAR_STREAM_SIZE);
+        $entry['avatar-type'] = (!empty($avatar)) ? $avatar->mediatype : 'image/png';
+
+        // RSS item specific
+
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($message->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function showSingleXmlDirectMessage($message)
+    {
+        $this->initDocument('xml');
+        $dmsg = $this->directMessageArray($message);
+        $this->showXmlDirectMessage($dmsg);
+        $this->endDocument('xml');
+    }
+
+    function showSingleJsonDirectMessage($message)
+    {
+        $this->initDocument('json');
+        $dmsg = $this->directMessageArray($message);
+        $this->showJsonObjects($dmsg);
+        $this->endDocument('json');
+    }
+
+    function showAtomGroups($group, $title, $id, $link, $subtitle=null, $selfuri=null)
+    {
+
+        $this->initDocument('atom');
+
+        $this->element('title', null, $title);
+        $this->element('id', null, $id);
+        $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
+
+        if (!is_null($selfuri)) {
+            $this->element('link', array('href' => $selfuri,
+                'rel' => 'self', 'type' => 'application/atom+xml'), null);
+        }
+
+        $this->element('updated', null, common_date_iso8601('now'));
+        $this->element('subtitle', null, $subtitle);
+
+        if (is_array($group)) {
+            foreach ($group as $g) {
+                $this->raw($g->asAtomEntry());
+            }
+        } else {
+            while ($group->fetch()) {
+                $this->raw($group->asAtomEntry());
+            }
+        }
+
+        $this->endDocument('atom');
+
+    }
+
+    function showJsonTimeline($notice)
+    {
+
+        $this->initDocument('json');
+
+        $statuses = array();
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitterStatusArray($n);
+                array_push($statuses, $twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitterStatusArray($notice);
+                array_push($statuses, $twitter_status);
+            }
+        }
+
+        $this->showJsonObjects($statuses);
+
+        $this->endDocument('json');
+    }
+
+    function showJsonGroups($group)
+    {
+
+        $this->initDocument('json');
+
+        $groups = array();
+
+        if (is_array($group)) {
+            foreach ($group as $g) {
+                $twitter_group = $this->twitterGroupArray($g);
+                array_push($groups, $twitter_group);
+            }
+        } else {
+            while ($group->fetch()) {
+                $twitter_group = $this->twitterGroupArray($group);
+                array_push($groups, $twitter_group);
+            }
+        }
+
+        $this->showJsonObjects($groups);
+
+        $this->endDocument('json');
+    }
+
+    function showXmlGroups($group)
+    {
+
+        $this->initDocument('xml');
+        $this->elementStart('groups', array('type' => 'array'));
+
+        if (is_array($group)) {
+            foreach ($group as $g) {
+                $twitter_group = $this->twitterGroupArray($g);
+                $this->showTwitterXmlGroup($twitter_group);
+            }
+        } else {
+            while ($group->fetch()) {
+                $twitter_group = $this->twitterGroupArray($group);
+                $this->showTwitterXmlGroup($twitter_group);
+            }
+        }
+
+        $this->elementEnd('groups');
+        $this->endDocument('xml');
+    }
+
+    function showTwitterXmlUsers($user)
+    {
+
+        $this->initDocument('xml');
+        $this->elementStart('users', array('type' => 'array'));
+
+        if (is_array($user)) {
+            foreach ($user as $u) {
+                $twitter_user = $this->twitterUserArray($u);
+                $this->showTwitterXmlUser($twitter_user);
+            }
+        } else {
+            while ($user->fetch()) {
+                $twitter_user = $this->twitterUserArray($user);
+                $this->showTwitterXmlUser($twitter_user);
+            }
+        }
+
+        $this->elementEnd('users');
+        $this->endDocument('xml');
+    }
+
+    function showJsonUsers($user)
+    {
+
+        $this->initDocument('json');
+
+        $users = array();
+
+        if (is_array($user)) {
+            foreach ($user as $u) {
+                $twitter_user = $this->twitterUserArray($u);
+                array_push($users, $twitter_user);
+            }
+        } else {
+            while ($user->fetch()) {
+                $twitter_user = $this->twitterUserArray($user);
+                array_push($users, $twitter_user);
+            }
+        }
+
+        $this->showJsonObjects($users);
+
+        $this->endDocument('json');
+    }
+
+    function showSingleJsonGroup($group)
+    {
+        $this->initDocument('json');
+        $twitter_group = $this->twitterGroupArray($group);
+        $this->showJsonObjects($twitter_group);
+        $this->endDocument('json');
+    }
+
+    function showSingleXmlGroup($group)
+    {
+        $this->initDocument('xml');
+        $twitter_group = $this->twitterGroupArray($group);
+        $this->showTwitterXmlGroup($twitter_group);
+        $this->endDocument('xml');
+    }
+
+    function dateTwitter($dt)
+    {
+        $dateStr = date('d F Y H:i:s', strtotime($dt));
+        $d = new DateTime($dateStr, new DateTimeZone('UTC'));
+        $d->setTimezone(new DateTimeZone(common_timezone()));
+        return $d->format('D M d H:i:s O Y');
+    }
+
+    function initDocument($type='xml')
+    {
+        switch ($type) {
+        case 'xml':
+            header('Content-Type: application/xml; charset=utf-8');
+            $this->startXML();
+            break;
+        case 'json':
+            header('Content-Type: application/json; charset=utf-8');
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print $callback . '(';
+            }
+            break;
+        case 'rss':
+            header("Content-Type: application/rss+xml; charset=utf-8");
+            $this->initTwitterRss();
+            break;
+        case 'atom':
+            header('Content-Type: application/atom+xml; charset=utf-8');
+            $this->initTwitterAtom();
+            break;
+        default:
+            $this->clientError(_('Not a supported data format.'));
+            break;
+        }
+
+        return;
+    }
+
+    function endDocument($type='xml')
+    {
+        switch ($type) {
+        case 'xml':
+            $this->endXML();
+            break;
+        case 'json':
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print ')';
+            }
+            break;
+        case 'rss':
+            $this->endTwitterRss();
+            break;
+        case 'atom':
+            $this->endTwitterRss();
+            break;
+        default:
+            $this->clientError(_('Not a supported data format.'));
+            break;
+        }
+        return;
+    }
+
+    function clientError($msg, $code = 400, $format = 'xml')
+    {
+        $action = $this->trimmed('action');
+
+        common_debug("User error '$code' on '$action': $msg", __FILE__);
+
+        if (!array_key_exists($code, ClientErrorAction::$status)) {
+            $code = 400;
+        }
+
+        $status_string = ClientErrorAction::$status[$code];
+
+        header('HTTP/1.1 '.$code.' '.$status_string);
+
+        if ($format == 'xml') {
+            $this->initDocument('xml');
+            $this->elementStart('hash');
+            $this->element('error', null, $msg);
+            $this->element('request', null, $_SERVER['REQUEST_URI']);
+            $this->elementEnd('hash');
+            $this->endDocument('xml');
+        } elseif ($format == 'json'){
+            $this->initDocument('json');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+            $this->endDocument('json');
+        } else {
+
+            // If user didn't request a useful format, throw a regular client error
+            throw new ClientException($msg, $code);
+        }
+    }
+
+    function serverError($msg, $code = 500, $content_type = 'xml')
+    {
+        $action = $this->trimmed('action');
+
+        common_debug("Server error '$code' on '$action': $msg", __FILE__);
+
+        if (!array_key_exists($code, ServerErrorAction::$status)) {
+            $code = 400;
+        }
+
+        $status_string = ServerErrorAction::$status[$code];
+
+        header('HTTP/1.1 '.$code.' '.$status_string);
+
+        if ($content_type == 'xml') {
+            $this->initDocument('xml');
+            $this->elementStart('hash');
+            $this->element('error', null, $msg);
+            $this->element('request', null, $_SERVER['REQUEST_URI']);
+            $this->elementEnd('hash');
+            $this->endDocument('xml');
+        } else {
+            $this->initDocument('json');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+            $this->endDocument('json');
+        }
+    }
+
+    function initTwitterRss()
+    {
+        $this->startXML();
+        $this->elementStart('rss', array('version' => '2.0', 'xmlns:atom'=>'http://www.w3.org/2005/Atom'));
+        $this->elementStart('channel');
+        Event::handle('StartApiRss', array($this));
+    }
+
+    function endTwitterRss()
+    {
+        $this->elementEnd('channel');
+        $this->elementEnd('rss');
+        $this->endXML();
+    }
+
+    function initTwitterAtom()
+    {
+        $this->startXML();
+        // FIXME: don't hardcode the language here!
+        $this->elementStart('feed', array('xmlns' => 'http://www.w3.org/2005/Atom',
+                                          'xml:lang' => 'en-US',
+                                          'xmlns:thr' => 'http://purl.org/syndication/thread/1.0'));
+    }
+
+    function endTwitterAtom()
+    {
+        $this->elementEnd('feed');
+        $this->endXML();
+    }
+
+    function showProfile($profile, $content_type='xml', $notice=null, $includeStatuses=true)
+    {
+        $profile_array = $this->twitterUserArray($profile, $includeStatuses);
+        switch ($content_type) {
+        case 'xml':
+            $this->showTwitterXmlUser($profile_array);
+            break;
+        case 'json':
+            $this->showJsonObjects($profile_array);
+            break;
+        default:
+            $this->clientError(_('Not a supported data format.'));
+            return;
+        }
+        return;
+    }
+
+    function getTargetUser($id)
+    {
+        if (empty($id)) {
+
+            // Twitter supports these other ways of passing the user ID
+            if (is_numeric($this->arg('id'))) {
+                return User::staticGet($this->arg('id'));
+            } else if ($this->arg('id')) {
+                $nickname = common_canonical_nickname($this->arg('id'));
+                return User::staticGet('nickname', $nickname);
+            } else if ($this->arg('user_id')) {
+                // This is to ensure that a non-numeric user_id still
+                // overrides screen_name even if it doesn't get used
+                if (is_numeric($this->arg('user_id'))) {
+                    return User::staticGet('id', $this->arg('user_id'));
+                }
+            } else if ($this->arg('screen_name')) {
+                $nickname = common_canonical_nickname($this->arg('screen_name'));
+                return User::staticGet('nickname', $nickname);
+            } else {
+                // Fall back to trying the currently authenticated user
+                return $this->auth_user;
+            }
+
+        } else if (is_numeric($id)) {
+            return User::staticGet($id);
+        } else {
+            $nickname = common_canonical_nickname($id);
+            return User::staticGet('nickname', $nickname);
+        }
+    }
+
+    function getTargetGroup($id)
+    {
+        if (empty($id)) {
+            if (is_numeric($this->arg('id'))) {
+                return User_group::staticGet($this->arg('id'));
+            } else if ($this->arg('id')) {
+                $nickname = common_canonical_nickname($this->arg('id'));
+                $local = Local_group::staticGet('nickname', $nickname);
+                if (empty($local)) {
+                    return null;
+                } else {
+                    return User_group::staticGet('id', $local->id);
+                }
+            } else if ($this->arg('group_id')) {
+                // This is to ensure that a non-numeric user_id still
+                // overrides screen_name even if it doesn't get used
+                if (is_numeric($this->arg('group_id'))) {
+                    return User_group::staticGet('id', $this->arg('group_id'));
+                }
+            } else if ($this->arg('group_name')) {
+                $nickname = common_canonical_nickname($this->arg('group_name'));
+                $local = Local_group::staticGet('nickname', $nickname);
+                if (empty($local)) {
+                    return null;
+                } else {
+                    return User_group::staticGet('id', $local->id);
+                }
+            }
+
+        } else if (is_numeric($id)) {
+            return User_group::staticGet($id);
+        } else {
+            $nickname = common_canonical_nickname($id);
+            $local = Local_group::staticGet('nickname', $nickname);
+            if (empty($local)) {
+                return null;
+            } else {
+                return User_group::staticGet('id', $local->group_id);
+            }
+        }
+    }
+
+    function sourceLink($source)
+    {
+        $source_name = _($source);
+        switch ($source) {
+        case 'web':
+        case 'xmpp':
+        case 'mail':
+        case 'omb':
+        case 'api':
+            break;
+        default:
+
+            $name = null;
+            $url  = null;
+
+            $ns = Notice_source::staticGet($source);
+
+            if ($ns) {
+                $name = $ns->name;
+                $url  = $ns->url;
+            } else {
+                $app = Oauth_application::staticGet('name', $source);
+                if ($app) {
+                    $name = $app->name;
+                    $url  = $app->source_url;
+                }
+            }
+
+            if (!empty($name) && !empty($url)) {
+                $source_name = '<a href="' . $url . '">' . $name . '</a>';
+            }
+
+            break;
+        }
+        return $source_name;
+    }
+
+    /**
+     * Returns query argument or default value if not found. Certain
+     * parameters used throughout the API are lightly scrubbed and
+     * bounds checked.  This overrides Action::arg().
+     *
+     * @param string $key requested argument
+     * @param string $def default value to return if $key is not provided
+     *
+     * @return var $var
+     */
+    function arg($key, $def=null)
+    {
+
+        // XXX: Do even more input validation/scrubbing?
+
+        if (array_key_exists($key, $this->args)) {
+            switch($key) {
+            case 'page':
+                $page = (int)$this->args['page'];
+                return ($page < 1) ? 1 : $page;
+            case 'count':
+                $count = (int)$this->args['count'];
+                if ($count < 1) {
+                    return 20;
+                } elseif ($count > 200) {
+                    return 200;
+                } else {
+                    return $count;
+                }
+            case 'since_id':
+                $since_id = (int)$this->args['since_id'];
+                return ($since_id < 1) ? 0 : $since_id;
+            case 'max_id':
+                $max_id = (int)$this->args['max_id'];
+                return ($max_id < 1) ? 0 : $max_id;
+            default:
+                return parent::arg($key, $def);
+            }
+        } else {
+            return $def;
+        }
+    }
+
+    function getSelfUri($action, $aargs)
+    {
+        parse_str($_SERVER['QUERY_STRING'], $params);
+        $pstring = '';
+        if (!empty($params)) {
+            unset($params['p']);
+            $pstring = http_build_query($params);
+        }
+
+        $uri = common_local_url($action, $aargs);
+
+        if (!empty($pstring)) {
+            $uri .= '?' . $pstring;
+        }
+
+        return $uri;
+    }
+
+}
index 25e2196cf2c4bc0e004d5eb930146961c35112ab..5090871cfe18a931600558e06c202b68e437d08b 100644 (file)
@@ -38,7 +38,6 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
-require_once INSTALLDIR . '/lib/api.php';
 require_once INSTALLDIR . '/lib/apioauth.php';
 
 /**
index 5710c80fc59d24be39b933da47a1056211b4b262..f8f16d5946bc31bf784005e2526b06daa59bf282 100644 (file)
@@ -27,8 +27,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET')
-{
+if (!defined('STATUSNET')) {
     exit(1);
 }
 
@@ -87,7 +86,7 @@ class Atom10Entry extends XMLStringer
      *
      * @return void
      */
-    function validate
+    function validate()
     {
 
     }
index 14a3beb83e3116dcd539fd6932a0cd16df6cf10c..8842840d568ef862d387ecac72b9c8cfcbf2553b 100644 (file)
@@ -78,7 +78,7 @@ class Atom10Feed extends XMLStringer
         $this->authors    = array();
         $this->links      = array();
         $this->entries    = array();
-        $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom');
+        $this->addNamespace('', 'http://www.w3.org/2005/Atom');
     }
 
     /**
@@ -109,11 +109,11 @@ class Atom10Feed extends XMLStringer
             );
         }
 
-        if (!is_null($uri)) {
+        if (isset($uri)) {
             $xs->element('uri', null, $uri);
         }
 
-        if (!is_null(email)) {
+        if (isset($email)) {
             $xs->element('email', null, $email);
         }
 
@@ -162,7 +162,14 @@ class Atom10Feed extends XMLStringer
     {
         $this->xw->startDocument('1.0', 'UTF-8');
         $commonAttrs = array('xml:lang' => 'en-US');
-        $commonAttrs = array_merge($commonAttrs, $this->namespaces);
+        foreach ($this->namespaces as $prefix => $uri) {
+            if ($prefix == '') {
+                $attr = 'xmlns';
+            } else {
+                $attr = 'xmlns:' . $prefix;
+            }
+            $commonAttrs[$attr] = $uri;
+        }
         $this->elementStart('feed', $commonAttrs);
 
         $this->element('id', null, $this->id);
index b7a60bde6ebae19b93b38eb97c34ea4a5c385242..3c3556cb95c789c59c951440cf73c6b12ad64801 100644 (file)
@@ -50,23 +50,33 @@ class AtomNoticeFeed extends Atom10Feed
         // Feeds containing notice info use these namespaces
 
         $this->addNamespace(
-            'xmlns:thr',
+            'thr',
             'http://purl.org/syndication/thread/1.0'
         );
 
         $this->addNamespace(
-            'xmlns:georss',
+            'georss',
             'http://www.georss.org/georss'
         );
 
         $this->addNamespace(
-            'xmlns:activity',
+            'activity',
             'http://activitystrea.ms/spec/1.0/'
         );
 
+        $this->addNamespace(
+            'media',
+            'http://purl.org/syndication/atommedia'
+        );
+
+        $this->addNamespace(
+            'poco',
+            'http://portablecontacts.net/spec/1.0'
+        );
+
         // XXX: What should the uri be?
         $this->addNamespace(
-            'xmlns:ostatus',
+            'ostatus',
             'http://ostatus.org/schema/1.0'
         );
     }
index 9f224325c63b03d52773c4fd3f35acc70c44a83a..2ad8de4550d1a3c3aac8b694f974a4ebf9e19c2d 100644 (file)
@@ -54,9 +54,14 @@ class AtomUserNoticeFeed extends AtomNoticeFeed
      *
      * @return void
      */
+
     function __construct($user = null, $indent = true) {
         parent::__construct($indent);
         $this->user = $user;
+        if (!empty($user)) {
+            $profile = $user->getProfile();
+            $this->addAuthor($profile->nickname, $user->uri);
+        }
     }
 
     function getUser()
index 5be3ea5b90795c360f3865e506f9f265b835135d..0a3763e2e4644d895095876acf13934393559f42 100644 (file)
@@ -79,7 +79,7 @@ abstract class AuthenticationPlugin extends Plugin
             $nickname = $username;
         }
         $registration_data = array();
-        $registration_data['nickname'] = $nickname ;
+        $registration_data['nickname'] = $nickname;
         return User::register($registration_data);
     }
 
@@ -101,12 +101,14 @@ abstract class AuthenticationPlugin extends Plugin
     * 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 $username;
+        return common_nicknamize($username);
     }
 
     //------------Below are the methods that connect StatusNet to the implementing Auth plugin------------\\
@@ -129,7 +131,7 @@ abstract class AuthenticationPlugin extends Plugin
             $test_user = User::staticGet('nickname', $suggested_nickname);
             if($test_user) {
                 //someone already exists with the suggested nickname, so used the passed nickname
-                $suggested_nickname = $nickname;
+                $suggested_nickname = common_nicknamize($nickname);
             }
             $test_user = User::staticGet('nickname', $suggested_nickname);
             if($test_user) {
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) {
index 2a51fd6872835781c424cf7e718f226e73b2a79f..db8e8003041f0d2cdfc35cc10d8a259b42364e7a 100644 (file)
@@ -548,12 +548,19 @@ class SubCommand extends Command
             return;
         }
 
-        $result = subs_subscribe_user($this->user, $this->other);
+        $otherUser = User::staticGet('nickname', $this->other);
 
-        if ($result == 'true') {
+        if (empty($otherUser)) {
+            $channel->error($this->user, _('No such user'));
+            return;
+        }
+
+        try {
+            Subscription::start($this->user->getProfile(),
+                                $otherUser->getProfile());
             $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
-        } else {
-            $channel->error($this->user, $result);
+        } catch (Exception $e) {
+            $channel->error($this->user, $e->getMessage());
         }
     }
 }
@@ -576,12 +583,18 @@ class UnsubCommand extends Command
             return;
         }
 
-        $result=subs_unsubscribe_user($this->user, $this->other);
+        $otherUser = User::staticGet('nickname', $this->other);
 
-        if ($result) {
+        if (empty($otherUser)) {
+            $channel->error($this->user, _('No such user'));
+        }
+
+        try {
+            Subscription::cancel($this->user->getProfile(),
+                                 $otherUser->getProfile());
             $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
-        } else {
-            $channel->error($this->user, $result);
+        } catch (Exception $e) {
+            $channel->error($this->user, $e->getMessage());
         }
     }
 }
@@ -655,6 +668,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=subs_unsubscribe_from($this->user, $this->other);
+
+        if ($result) {
+            $channel->output($this->user, sprintf(_('Unsubscribed  %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
+}
+
 class SubscriptionsCommand extends Command
 {
     function execute($channel)
@@ -737,6 +778,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 b95cd11752c1281f902c492a2e99da771f778699..6c01c7db490f56854364022f014fcc0c780c1049 100644 (file)
@@ -22,7 +22,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 //exit with 200 response, if this is checking fancy from the installer
 if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') {  exit; }
 
-define('STATUSNET_VERSION', '0.9.0beta5');
+define('STATUSNET_VERSION', '0.9.0beta6+bugfix1');
 define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility
 
 define('STATUSNET_CODENAME', 'Stand');
@@ -71,6 +71,7 @@ if (!function_exists('dl')) {
 # global configuration object
 
 require_once('PEAR.php');
+require_once('PEAR/Exception.php');
 require_once('DB/DataObject.php');
 require_once('DB/DataObject/Cast.php'); # for dates
 
@@ -123,10 +124,22 @@ 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';
 
+
+//set PEAR error handling to use regular PHP exceptions
+function PEAR_ErrorToPEAR_Exception($err)
+{
+    if ($err->getCode()) {
+        throw new PEAR_Exception($err->getMessage(), $err->getCode());
+    }
+    throw new PEAR_Exception($err->getMessage());
+}
+PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'PEAR_ErrorToPEAR_Exception');
+
 try {
     StatusNet::init(@$server, @$path, @$conffile);
 } catch (NoConfigException $e) {
index 37eb6cafa2bd0b9cf60e558ba92eadff27d3fefe..7b97c7dda874d5470a7a35039d34bec70c036295 100644 (file)
@@ -175,10 +175,10 @@ $default =
         array('enabled' => false),
         'integration' =>
         array('source' => 'StatusNet', # source attribute for Twitter
-              'taguri' => $_server.',2009'), # base for tag URIs
+              'taguri' => null), # base for tag URIs
         'twitter' =>
-        array('enabled'       => true,
-              'consumer_key'    => null,
+        array('signin' => true,
+              'consumer_key' => null,
               'consumer_secret' => null),
         'cache' =>
         array('base' => null),
@@ -278,9 +278,7 @@ $default =
                                  'TightUrl' => array('shortenerName' => '2tu.us', 'freeService' => true,'serviceUrl'=>'http://2tu.us/?save=y&url=%1$s'),
                                  'Geonames' => null,
                                  'Mapstraction' => null,
-                                 'Linkback' => null,
                                  'WikiHashtags' => null,
-                                 'PubSubHubBub' => null,
                                  'RSSCloud' => null,
                                  'OpenID' => null),
               ),
index 4477468d0a38d523c26163b3afcc987805bf3617..d2be7a92c72488d846374bb27413f103490fd34d 100644 (file)
@@ -63,31 +63,7 @@ class DistribQueueHandler
         // XXX: do we need to change this for remote users?
 
         try {
-            $notice->saveTags();
-        } catch (Exception $e) {
-            $this->logit($notice, $e);
-        }
-
-        try {
-            $groups = $notice->saveGroups();
-        } catch (Exception $e) {
-            $this->logit($notice, $e);
-        }
-
-        try {
-            $recipients = $notice->saveReplies();
-        } catch (Exception $e) {
-            $this->logit($notice, $e);
-        }
-
-        try {
-            $notice->addToInboxes($groups, $recipients);
-        } catch (Exception $e) {
-            $this->logit($notice, $e);
-        }
-
-        try {
-            $notice->saveUrls();
+            $notice->addToInboxes();
         } catch (Exception $e) {
             $this->logit($notice, $e);
         }
@@ -107,7 +83,7 @@ class DistribQueueHandler
 
         return true;
     }
-    
+
     protected function logit($notice, $e)
     {
         common_log(LOG_ERR, "Distrib queue exception saving notice $notice->id: " .
index 6bc8e599b3022f7aa29d9c80045157989f627293..7b047945528ec4dffa331b09849b9f2db82663fd 100644 (file)
@@ -99,6 +99,10 @@ class ImageFile
 
         if ($info[2] !== IMAGETYPE_GIF &&
             $info[2] !== IMAGETYPE_JPEG &&
+            $info[2] !== IMAGETYPE_BMP &&
+            $info[2] !== IMAGETYPE_WBMP &&
+            $info[2] !== IMAGETYPE_XBM &&
+            $info[2] !== IMAGETYPE_XPM &&
             $info[2] !== IMAGETYPE_PNG) {
 
             @unlink($_FILES[$param]['tmp_name']);
@@ -146,6 +150,18 @@ 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;
+         case IMAGETYPE_XPM:
+            $image_src = imagecreatefromxpm($this->filepath);
+            break;
          default:
             throw new Exception(_('Unknown file type'));
             return;
@@ -153,7 +169,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 +192,24 @@ 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;
+        } else if($this->type == IMAGETYPE_XPM) {
+            //we don't want to save XPM... 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 +279,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 aefb553aac928b311ace9b44aa65f324adab002c..aa8bc20e24511c5078b55c6ffc63c9e10bef2c9a 100644 (file)
@@ -100,7 +100,7 @@ class JoinForm extends Form
     function action()
     {
         return common_local_url('joingroup',
-                                array('nickname' => $this->group->nickname));
+                                array('id' => $this->group->id));
     }
 
     /**
index e63d96ee8080148a183d855dce49c84344d86a39..5469b5704c0afcad57095b5b9bf52f38a786e6d6 100644 (file)
@@ -100,7 +100,7 @@ class LeaveForm extends Form
     function action()
     {
         return common_local_url('leavegroup',
-                                array('nickname' => $this->group->nickname));
+                                array('id' => $this->group->id));
     }
 
     /**
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 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 837cb90faa13bb29a9fdfe0f5734c569995c0650..88a9252414325ba8d38cb2f0f327770ff186133a 100644 (file)
@@ -380,12 +380,12 @@ class NoticeListItem extends Widget
 
     function showNoticeLink()
     {
-        if($this->notice->is_local == Notice::LOCAL_PUBLIC || $this->notice->is_local == Notice::LOCAL_NONPUBLIC){
-            $noticeurl = common_local_url('shownotice',
-                                      array('notice' => $this->notice->id));
-        }else{
-            $noticeurl = $this->notice->uri;
-        }
+        $noticeurl = $this->notice->bestUrl();
+
+        // above should always return an URL
+
+        assert(!empty($noticeurl));
+
         $this->out->elementStart('a', array('rel' => 'bookmark',
                                             'class' => 'timestamp',
                                             'href' => $noticeurl));
@@ -438,14 +438,15 @@ class NoticeListItem extends Widget
         $this->out->text(_('at'));
         $this->out->text(' ');
         if (empty($url)) {
-            $this->out->element('span', array('class' => 'geo',
+            $this->out->element('abbr', array('class' => 'geo',
                                               'title' => $latlon),
                                 $name);
         } else {
-            $this->out->element('a', array('class' => 'geo',
-                                           'title' => $latlon,
-                                           'href' => $url),
+            $this->out->elementStart('a', array('href' => $url));
+            $this->out->element('abbr', array('class' => 'geo',
+                                              'title' => $latlon),
                                 $name);
+            $this->out->elementEnd('a');
         }
         $this->out->elementEnd('span');
     }
@@ -539,22 +540,40 @@ class NoticeListItem extends Widget
     function showContext()
     {
         $hasConversation = false;
-        if( !empty($this->notice->conversation)
-            && $this->notice->conversation != $this->notice->id){
-            $hasConversation = true;
-        }else{
-            $conversation = Notice::conversationStream($this->notice->id, 1, 1);
-            if($conversation->N > 0){
+        if (!empty($this->notice->conversation)) {
+            $conversation = Notice::conversationStream(
+                $this->notice->conversation,
+                1,
+                1
+            );
+            if ($conversation->N > 0) {
                 $hasConversation = true;
             }
         }
-        if ($hasConversation){
-            $this->out->text(' ');
-            $convurl = common_local_url('conversation',
-                                         array('id' => $this->notice->conversation));
-            $this->out->element('a', array('href' => $convurl.'#notice-'.$this->notice->id,
-                                           'class' => 'response'),
-                                _('in context'));
+        if ($hasConversation) {
+            $conv = Conversation::staticGet(
+                'id',
+                $this->notice->conversation
+            );
+            $convurl = $conv->uri;
+            if (!empty($convurl)) {
+                $this->out->text(' ');
+                $this->out->element(
+                    'a',
+                    array(
+                    'href' => $convurl.'#notice-'.$this->notice->id,
+                    'class' => 'response'),
+                    _('in context')
+                );
+            } else {
+                $msg = sprintf(
+                    "Couldn't find Conversation ID %d to make 'in context'"
+                    . "link for Notice ID %d",
+                    $this->notice->conversation,
+                    $this->notice->id
+                );
+                common_log(LOG_WARNING, $msg);
+            }
         }
     }
 
index eabe37f9fa4a944d76f99c91c9a57de69c6c0f23..a6a6de7505c946bbdd0a24b7760dea3ff8abb940 100644 (file)
@@ -390,7 +390,7 @@ class StatusNetOAuthDataStore extends OAuthDataStore
         $sub->subscribed = $user->id;
 
         if (!$sub->find(true)) {
-            return 0;
+            return array();
         }
 
         /* Since we do not use OMB_Service_Provider’s action methods, there
index 0f38a49369fc34c8de680a0b5fe90236c65fe161..db60fa0ef2d0a122a65805cffe1154713df02658 100644 (file)
@@ -29,11 +29,9 @@ require_once 'Auth/Yadis/Yadis.php';
 
 function omb_oauth_consumer()
 {
-    static $con = null;
-    if (is_null($con)) {
-        $con = new OAuthConsumer(common_root_url(), '');
-    }
-    return $con;
+    // Don't try to make this static. Leads to issues in
+    // multi-site setups - Z
+    return new OAuthConsumer(common_root_url(), '');
 }
 
 function omb_oauth_server()
@@ -79,7 +77,7 @@ function omb_broadcast_notice($notice)
     /* Get remote users subscribed to this profile. */
     $rp = new Remote_profile();
 
-    $rp->query('SELECT postnoticeurl, token, secret ' .
+    $rp->query('SELECT remote_profile.*, secret, token ' .
                'FROM subscription JOIN remote_profile ' .
                'ON subscription.subscriber = remote_profile.id ' .
                'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
@@ -95,7 +93,8 @@ function omb_broadcast_notice($notice)
 
         /* Post notice. */
         $service = new StatusNet_OMB_Service_Consumer(
-                     array(OMB_ENDPOINT_POSTNOTICE => $rp->postnoticeurl));
+                     array(OMB_ENDPOINT_POSTNOTICE => $rp->postnoticeurl),
+                                                      $rp->uri);
         try {
             $service->setToken($rp->token, $rp->secret);
             $service->postNotice($omb_notice);
@@ -127,7 +126,7 @@ function omb_broadcast_profile($profile)
     /* Get remote users subscribed to this profile. */
     $rp = new Remote_profile();
 
-    $rp->query('SELECT updateprofileurl, token, secret ' .
+    $rp->query('SELECT remote_profile.*, secret, token ' .
                'FROM subscription JOIN remote_profile ' .
                'ON subscription.subscriber = remote_profile.id ' .
                'WHERE subscription.subscribed = ' . $profile->id . ' ');
@@ -143,7 +142,8 @@ function omb_broadcast_profile($profile)
 
         /* Update profile. */
         $service = new StatusNet_OMB_Service_Consumer(
-                     array(OMB_ENDPOINT_UPDATEPROFILE => $rp->updateprofileurl));
+                     array(OMB_ENDPOINT_UPDATEPROFILE => $rp->updateprofileurl),
+                                                      $rp->uri);
         try {
             $service->setToken($rp->token, $rp->secret);
             $service->updateProfile($omb_profile);
@@ -161,13 +161,14 @@ function omb_broadcast_profile($profile)
 }
 
 class StatusNet_OMB_Service_Consumer extends OMB_Service_Consumer {
-    public function __construct($urls)
+    public function __construct($urls, $listener_uri=null)
     {
         $this->services       = $urls;
         $this->datastore      = omb_oauth_datastore();
         $this->oauth_consumer = omb_oauth_consumer();
         $this->fetcher        = Auth_Yadis_Yadis::getHTTPFetcher();
         $this->fetcher->timeout = intval(common_config('omb', 'timeout'));
+        $this->listener_uri   = $listener_uri;
     }
 
 }
index 693cd64492b26fde8c0a6e0a639ea7db43137a50..4f1e84a6af11e0af9097eebad916bea83da7e30a 100644 (file)
@@ -273,13 +273,18 @@ class ProfileListItem extends Widget
                 $usf = new UnsubscribeForm($this->out, $this->profile);
                 $usf->show();
             } else {
-                // Is it a local user? can't remote sub from a list
-                // XXX: make that possible!
                 $other = User::staticGet('id', $this->profile->id);
                 if (!empty($other)) {
                     $sf = new SubscribeForm($this->out, $this->profile);
                     $sf->show();
                 }
+                else {
+                    $url = common_local_url('remotesubscribe',
+                                            array('nickname' => $this->profile->nickname));
+                    $this->out->element('a', array('href' => $url,
+                                              'class' => 'entity_remote_subscribe'),
+                                   _('Subscribe'));
+                }
             }
             $this->out->elementEnd('li');
         }
diff --git a/lib/profilequeuehandler.php b/lib/profilequeuehandler.php
new file mode 100644 (file)
index 0000000..6ce9322
--- /dev/null
@@ -0,0 +1,52 @@
+<?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/>.
+ */
+
+/**
+ * @package QueueHandler
+ * @maintainer Brion Vibber <brion@status.net>
+ */
+
+class ProfileQueueHandler extends QueueHandler
+{
+
+    function transport()
+    {
+        return 'profile';
+    }
+
+    function handle($profile)
+    {
+        if (!($profile instanceof Profile)) {
+            common_log(LOG_ERR, "Got a bogus profile, not broadcasting");
+            return true;
+        }
+
+        if (Event::handle('StartBroadcastProfile', array($profile))) {
+            require_once(INSTALLDIR.'/lib/omb.php');
+            try {
+                omb_broadcast_profile($profile);
+            } catch (Exception $e) {
+                common_log(LOG_ERR, "Failed sending OMB profiles: " . $e->getMessage());
+            }
+        }
+        Event::handle('EndBroadcastProfile', array($profile));
+        return true;
+    }
+
+}
index 710829e497902f5f61731298b448f6ae39e37b62..87bd356aa2b0d7ea43c959513bda4e0001958884 100644 (file)
@@ -264,6 +264,9 @@ abstract class QueueManager extends IoManager
                 $this->connect('sms', 'SmsQueueHandler');
             }
 
+            // Broadcasting profile updates to OMB remote subscribers
+            $this->connect('profile', 'ProfileQueueHandler');
+
             // XMPP output handlers...
             if (common_config('xmpp', 'enabled')) {
                 // Delivery prep, read by queuedaemon.php:
index 987d0152e462e266a8ddc40d169e66882a990c79..abbce041dbfe5ac5ac504491fa1c4e5b128708b0 100644 (file)
@@ -247,6 +247,9 @@ class Router
                 $m->connect('group/:nickname/'.$v,
                             array('action' => $v.'group'),
                             array('nickname' => '[a-zA-Z0-9]+'));
+                $m->connect('group/:id/id/'.$v,
+                            array('action' => $v.'group'),
+                            array('id' => '[0-9]+'));
             }
 
             foreach (array('members', 'logo', 'rss', 'designsettings') as $n) {
@@ -668,7 +671,7 @@ class Router
 
                 foreach (array('subscriptions', 'subscribers',
                                'all', 'foaf', 'xrds',
-                               'replies', 'microsummary') as $a) {
+                               'replies', 'microsummary', 'hcard') as $a) {
                     $m->connect($a,
                                 array('action' => $a,
                                       'nickname' => $nickname));
@@ -734,7 +737,7 @@ class Router
 
                 foreach (array('subscriptions', 'subscribers',
                                'nudge', 'all', 'foaf', 'xrds',
-                               'replies', 'inbox', 'outbox', 'microsummary') as $a) {
+                               'replies', 'inbox', 'outbox', 'microsummary', 'hcard') as $a) {
                     $m->connect(':nickname/'.$a,
                                 array('action' => $a),
                                 array('nickname' => '[a-zA-Z0-9]{1,64}'));
index 5ac1a75a5ce80aecf1fa70221451aa5edb0c3ae3..e2ce0667eb19f78e3c2e9f5aed9fb0fdcc76df47 100644 (file)
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-require_once('XMPPHP/XMPP.php');
-
-/* Subscribe $user to nickname $other_nickname
-  Returns true or an error message.
-*/
-
-function subs_subscribe_user($user, $other_nickname)
-{
-
-    $other = User::staticGet('nickname', $other_nickname);
-
-    if (!$other) {
-        return _('No such user.');
-    }
-
-    return subs_subscribe_to($user, $other);
-}
-
 /* Subscribe user $user to other user $other.
  * Note: $other must be a local user, not a remote profile.
  * Because the other way is quite a bit more complicated.
@@ -44,111 +26,40 @@ function subs_subscribe_user($user, $other_nickname)
 
 function subs_subscribe_to($user, $other)
 {
-    if (!$user->hasRight(Right::SUBSCRIBE)) {
-        return _('You have been banned from subscribing.');
-    }
-
-    if ($user->isSubscribed($other)) {
-        return _('Already subscribed!');
-    }
-
-    if ($other->hasBlocked($user)) {
-        return _('User has blocked you.');
-    }
-
     try {
-        if (Event::handle('StartSubscribe', array($user, $other))) {
-
-            if (!$user->subscribeTo($other)) {
-                return _('Could not subscribe.');
-                return;
-            }
-
-            subs_notify($other, $user);
-
-            $cache = common_memcache();
-
-            if ($cache) {
-                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-            }
-
-            $profile = $user->getProfile();
-
-            $profile->blowSubscriptionsCount();
-            $other->blowSubscribersCount();
-
-            if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
-                if (!$other->subscribeTo($user)) {
-                    return _('Could not subscribe other to you.');
-                }
-                $cache = common_memcache();
-
-                if ($cache) {
-                    $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
-                }
-
-                subs_notify($user, $other);
-            }
-
-            Event::handle('EndSubscribe', array($user, $other));
-        }
+        Subscription::start($user->getProfile(), $other);
+        return true;
     } catch (Exception $e) {
         return $e->getMessage();
     }
-
-    return true;
-}
-
-function subs_notify($listenee, $listener)
-{
-    # XXX: add other notifications (Jabber, SMS) here
-    # XXX: queue this and handle it offline
-    # XXX: Whatever happens, do it in Twitter-like API, too
-    subs_notify_email($listenee, $listener);
 }
 
-function subs_notify_email($listenee, $listener)
-{
-    mail_subscribe_notify($listenee, $listener);
-}
-
-/* Unsubscribe $user from nickname $other_nickname
-  Returns true or an error message.
-*/
-
-function subs_unsubscribe_user($user, $other_nickname)
-{
-
-    $other = User::staticGet('nickname', $other_nickname);
-
-    if (!$other) {
-        return _('No such user.');
-    }
-
-    return subs_unsubscribe_to($user, $other->getProfile());
-}
-
-/* Unsubscribe user $user from profile $other
- * NB: other can be a remote user. */
-
 function subs_unsubscribe_to($user, $other)
 {
-    if (!$user->isSubscribed($other))
-        return _('Not subscribed!');
-
-    // Don't allow deleting self subs
-
-    if ($user->id == $other->id) {
-        return _('Couldn\'t delete self-subscription.');
+    try {
+        Subscription::cancel($user->getProfile(), $other);
+        return true;
+    } catch (Exception $e) {
+        return $e->getMessage();
     }
+}
 
+function subs_unsubscribe_from($user, $other){
+   $local = User::staticGet("nickname",$other);
+   if($local){
+     return subs_unsubscribe_to($local,$user);
+   } else {
     try {
-        if (Event::handle('StartUnsubscribe', array($user, $other))) {
+        $remote = Profile::staticGet("nickname",$other);
+        if(is_string($remote)){
+          return $remote;
+        }
+        if (Event::handle('StartUnsubscribe', array($remote,$user))) {
 
             $sub = DB_DataObject::factory('subscription');
 
-            $sub->subscriber = $user->id;
-            $sub->subscribed = $other->id;
+            $sub->subscriber = $remote->id;
+            $sub->subscribed = $user->id;
 
             $sub->find(true);
 
@@ -160,20 +71,18 @@ function subs_unsubscribe_to($user, $other)
             $cache = common_memcache();
 
             if ($cache) {
-                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $remote->id));
             }
 
-            $profile = $user->getProfile();
 
-            $profile->blowSubscriptionsCount();
-            $other->blowSubscribersCount();
+            $user->blowSubscribersCount();
+            $remote->blowSubscribersCount();
 
-            Event::handle('EndUnsubscribe', array($user, $other));
+            Event::handle('EndUnsubscribe', array($remote, $user));
         }
     } catch (Exception $e) {
         return $e->getMessage();
     }
-
-    return true;
+   }
 }
 
diff --git a/lib/taguri.php b/lib/taguri.php
new file mode 100644 (file)
index 0000000..d8398ed
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Utility for creating new tag: URIs
+ *
+ * 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  URI
+ * @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/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Mint tag: URIs
+ *
+ * tag: URIs are unique identifiers according to http://tools.ietf.org/html/rfc4151.
+ *
+ * We use them for creating URIs for things that can't be HTTP retrieved.
+ *
+ * @category URI
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class TagURI
+{
+    /**
+     * Return the base part of a tag URI
+     *
+     * Note: use mint() instead.
+     *
+     * @return string Tag URI base to use
+     */
+
+    static function base()
+    {
+        $base = common_config('integration', 'taguri');
+
+        if (empty($base)) {
+
+            $base = common_config('site', 'server').','.date('Y-m-d');
+
+            $pathPart = trim(common_config('site', 'path'), '/');
+
+            if (!empty($pathPart)) {
+                $base .= ':'.str_replace('/', ':', $pathPart);
+            }
+        }
+
+        return $base;
+    }
+
+    /**
+     * Make a new tag URI
+     *
+     * Builds the proper base and creates all the parts
+     *
+     * @return string minted URI
+     */
+
+    static function mint()
+    {
+        $base = self::base();
+
+        $args = func_get_args();
+
+        $format = array_shift($args);
+
+        $extra = vsprintf($format, $args);
+
+        return 'tag:'.$base.':'.$extra;
+    }
+}
index ef7852953e160d5a2a073380f300745b9880c62f..add1b0ae67e4ec5512713244627e2d5a4deac2d2 100644 (file)
@@ -134,7 +134,7 @@ function common_check_user($nickname, $password)
     $authenticatedUser = false;
 
     if (Event::handle('StartCheckPassword', array($nickname, $password, &$authenticatedUser))) {
-        $user = User::staticGet('nickname', $nickname);
+        $user = User::staticGet('nickname', common_canonical_nickname($nickname));
         if (!empty($user)) {
             if (!empty($password)) { // never allow login with blank password
                 if (0 == strcmp(common_munge_password($password, $user->id),
@@ -426,13 +426,187 @@ function common_render_content($text, $notice)
 {
     $r = common_render_text($text);
     $id = $notice->profile_id;
-    $r = preg_replace('/(^|\s+)@(['.NICKNAME_FMT.']{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r);
-    $r = preg_replace('/^T ([A-Z0-9]{1,64}) /e', "'T '.common_at_link($id, '\\1').' '", $r);
-    $r = preg_replace('/(^|[\s\.\,\:\;]+)@#([A-Za-z0-9]{1,64})/e', "'\\1@#'.common_at_hash_link($id, '\\2')", $r);
+    $r = common_linkify_mentions($r, $notice);
     $r = preg_replace('/(^|[\s\.\,\:\;]+)!([A-Za-z0-9]{1,64})/e', "'\\1!'.common_group_link($id, '\\2')", $r);
     return $r;
 }
 
+function common_linkify_mentions($text, $notice)
+{
+    $mentions = common_find_mentions($text, $notice);
+
+    // We need to go through in reverse order by position,
+    // so our positions stay valid despite our fudging with the
+    // string!
+
+    $points = array();
+
+    foreach ($mentions as $mention)
+    {
+        $points[$mention['position']] = $mention;
+    }
+
+    krsort($points);
+
+    foreach ($points as $position => $mention) {
+
+        $linkText = common_linkify_mention($mention);
+
+        $text = substr_replace($text, $linkText, $position, mb_strlen($mention['text']));
+    }
+
+    return $text;
+}
+
+function common_linkify_mention($mention)
+{
+    $output = null;
+
+    if (Event::handle('StartLinkifyMention', array($mention, &$output))) {
+
+        $xs = new XMLStringer(false);
+
+        $attrs = array('href' => $mention['url'],
+                       'class' => 'url');
+
+        if (!empty($mention['title'])) {
+            $attrs['title'] = $mention['title'];
+        }
+
+        $xs->elementStart('span', 'vcard');
+        $xs->elementStart('a', $attrs);
+        $xs->element('span', 'fn nickname', $mention['text']);
+        $xs->elementEnd('a');
+        $xs->elementEnd('span');
+
+        $output = $xs->getString();
+
+        Event::handle('EndLinkifyMention', array($mention, &$output));
+    }
+
+    return $output;
+}
+
+function common_find_mentions($text, $notice)
+{
+    $mentions = array();
+
+    $sender = Profile::staticGet('id', $notice->profile_id);
+
+    if (empty($sender)) {
+        return $mentions;
+    }
+
+    if (Event::handle('StartFindMentions', array($sender, $text, &$mentions))) {
+
+        // Get the context of the original notice, if any
+
+        $originalAuthor   = null;
+        $originalNotice   = null;
+        $originalMentions = array();
+
+        // Is it a reply?
+
+        if (!empty($notice) && !empty($notice->reply_to)) {
+            $originalNotice = Notice::staticGet('id', $notice->reply_to);
+            if (!empty($originalNotice)) {
+                $originalAuthor = Profile::staticGet('id', $originalNotice->profile_id);
+
+                $ids = $originalNotice->getReplies();
+
+                foreach ($ids as $id) {
+                    $repliedTo = Profile::staticGet('id', $id);
+                    if (!empty($repliedTo)) {
+                        $originalMentions[$repliedTo->nickname] = $repliedTo;
+                    }
+                }
+            }
+        }
+
+        preg_match_all('/^T ([A-Z0-9]{1,64}) /',
+                       $text,
+                       $tmatches,
+                       PREG_OFFSET_CAPTURE);
+
+        preg_match_all('/(?:^|\s+)@(['.NICKNAME_FMT.']{1,64})/',
+                       $text,
+                       $atmatches,
+                       PREG_OFFSET_CAPTURE);
+
+        $matches = array_merge($tmatches[1], $atmatches[1]);
+
+        foreach ($matches as $match) {
+
+            $nickname = common_canonical_nickname($match[0]);
+
+            // Try to get a profile for this nickname.
+            // Start with conversation context, then go to
+            // sender context.
+
+            if (!empty($originalAuthor) && $originalAuthor->nickname == $nickname) {
+
+                $mentioned = $originalAuthor;
+
+            } else if (!empty($originalMentions) &&
+                       array_key_exists($nickname, $originalMentions)) {
+
+                $mentioned = $originalMentions[$nickname];
+            } else {
+                $mentioned = common_relative_profile($sender, $nickname);
+            }
+
+            if (!empty($mentioned)) {
+
+                $user = User::staticGet('id', $mentioned->id);
+
+                if ($user) {
+                    $url = common_local_url('userbyid', array('id' => $user->id));
+                } else {
+                    $url = $mentioned->profileurl;
+                }
+
+                $mention = array('mentioned' => array($mentioned),
+                                 'text' => $match[0],
+                                 'position' => $match[1],
+                                 'url' => $url);
+
+                if (!empty($mentioned->fullname)) {
+                    $mention['title'] = $mentioned->fullname;
+                }
+
+                $mentions[] = $mention;
+            }
+        }
+
+        // @#tag => mention of all subscriptions tagged 'tag'
+
+        preg_match_all('/(?:^|[\s\.\,\:\;]+)@#([\pL\pN_\-\.]{1,64})/',
+                       $text,
+                       $hmatches,
+                       PREG_OFFSET_CAPTURE);
+
+        foreach ($hmatches[1] as $hmatch) {
+
+            $tag = common_canonical_tag($hmatch[0]);
+
+            $tagged = Profile_tag::getTagged($sender->id, $tag);
+
+            $url = common_local_url('subscriptions',
+                                    array('nickname' => $sender->nickname,
+                                          'tag' => $tag));
+
+            $mentions[] = array('mentioned' => $tagged,
+                                'text' => $hmatch[0],
+                                'position' => $hmatch[1],
+                                'url' => $url);
+        }
+
+        Event::handle('EndFindMentions', array($sender, $text, &$mentions));
+    }
+
+    return $mentions;
+}
+
 function common_render_text($text)
 {
     $r = htmlspecialchars($text);
@@ -628,8 +802,28 @@ function common_shorten_links($text)
 
 function common_xml_safe_str($str)
 {
-    // Neutralize control codes and surrogates
-       return preg_replace('/[\p{Cc}\p{Cs}]/u', '*', $str);
+    // Replace common eol and extra whitespace input chars
+    $unWelcome = array(
+        "\t",  // tab
+        "\n",  // newline
+        "\r",  // cr
+        "\0",  // null byte eos
+        "\x0B" // vertical tab
+    );
+
+    $replacement = array(
+        ' ', // single space
+        ' ',
+        '',  // nothing
+        '',
+        ' '
+    );
+
+    $str = str_replace($unWelcome, $replacement, $str);
+
+    // Neutralize any additional control codes and UTF-16 surrogates
+    // (Twitter uses '*')
+    return preg_replace('/[\p{Cc}\p{Cs}]/u', '*', $str);
 }
 
 function common_tag_link($tag)
@@ -656,37 +850,6 @@ function common_valid_profile_tag($str)
     return preg_match('/^[A-Za-z0-9_\-\.]{1,64}$/', $str);
 }
 
-function common_at_link($sender_id, $nickname)
-{
-    $sender = Profile::staticGet($sender_id);
-    if (!$sender) {
-        return $nickname;
-    }
-    $recipient = common_relative_profile($sender, common_canonical_nickname($nickname));
-    if ($recipient) {
-        $user = User::staticGet('id', $recipient->id);
-        if ($user) {
-            $url = common_local_url('userbyid', array('id' => $user->id));
-        } else {
-            $url = $recipient->profileurl;
-        }
-        $xs = new XMLStringer(false);
-        $attrs = array('href' => $url,
-                       'class' => 'url');
-        if (!empty($recipient->fullname)) {
-            $attrs['title'] = $recipient->fullname . ' (' . $recipient->nickname . ')';
-        }
-        $xs->elementStart('span', 'vcard');
-        $xs->elementStart('a', $attrs);
-        $xs->element('span', 'fn nickname', $nickname);
-        $xs->elementEnd('a');
-        $xs->elementEnd('span');
-        return $xs->getString();
-    } else {
-        return $nickname;
-    }
-}
-
 function common_group_link($sender_id, $nickname)
 {
     $sender = Profile::staticGet($sender_id);
@@ -709,29 +872,6 @@ function common_group_link($sender_id, $nickname)
     }
 }
 
-function common_at_hash_link($sender_id, $tag)
-{
-    $user = User::staticGet($sender_id);
-    if (!$user) {
-        return $tag;
-    }
-    $tagged = Profile_tag::getTagged($user->id, common_canonical_tag($tag));
-    if ($tagged) {
-        $url = common_local_url('subscriptions',
-                                array('nickname' => $user->nickname,
-                                      'tag' => $tag));
-        $xs = new XMLStringer();
-        $xs->elementStart('span', 'tag');
-        $xs->element('a', array('href' => $url,
-                                'rel' => $tag),
-                     $tag);
-        $xs->elementEnd('span');
-        return $xs->getString();
-    } else {
-        return $tag;
-    }
-}
-
 function common_relative_profile($sender, $nickname, $dt=null)
 {
     // Try to find profiles this profile is subscribed to that have this nickname
@@ -768,7 +908,7 @@ function common_relative_profile($sender, $nickname, $dt=null)
     return null;
 }
 
-function common_local_url($action, $args=null, $params=null, $fragment=null)
+function common_local_url($action, $args=null, $params=null, $fragment=null, $addSession=true)
 {
     $r = Router::get();
     $path = $r->build($action, $args, $params, $fragment);
@@ -776,12 +916,12 @@ function common_local_url($action, $args=null, $params=null, $fragment=null)
     $ssl = common_is_sensitive($action);
 
     if (common_config('site','fancy')) {
-        $url = common_path(mb_substr($path, 1), $ssl);
+        $url = common_path(mb_substr($path, 1), $ssl, $addSession);
     } else {
         if (mb_strpos($path, '/index.php') === 0) {
-            $url = common_path(mb_substr($path, 1), $ssl);
+            $url = common_path(mb_substr($path, 1), $ssl, $addSession);
         } else {
-            $url = common_path('index.php'.$path, $ssl);
+            $url = common_path('index.php'.$path, $ssl, $addSession);
         }
     }
     return $url;
@@ -800,7 +940,7 @@ function common_is_sensitive($action)
     return $ssl;
 }
 
-function common_path($relative, $ssl=false)
+function common_path($relative, $ssl=false, $addSession=true)
 {
     $pathpart = (common_config('site', 'path')) ? common_config('site', 'path')."/" : '';
 
@@ -824,7 +964,9 @@ function common_path($relative, $ssl=false)
         }
     }
 
-    $relative = common_inject_session($relative, $serverpart);
+    if ($addSession) {
+        $relative = common_inject_session($relative, $serverpart);
+    }
 
     return $proto.'://'.$serverpart.'/'.$pathpart.$relative;
 }
@@ -1031,25 +1173,30 @@ function common_enqueue_notice($notice)
     return true;
 }
 
-function common_broadcast_profile($profile)
+/**
+ * Broadcast profile updates to OMB and other remote subscribers.
+ *
+ * Since this may be slow with a lot of subscribers or bad remote sites,
+ * this is run through the background queues if possible.
+ */
+function common_broadcast_profile(Profile $profile)
 {
-    // XXX: optionally use a queue system like http://code.google.com/p/microapps/wiki/NQDQ
-    require_once(INSTALLDIR.'/lib/omb.php');
-    omb_broadcast_profile($profile);
-    // XXX: Other broadcasts...?
+    $qm = QueueManager::get();
+    $qm->enqueue($profile, "profile");
     return true;
 }
 
 function common_profile_url($nickname)
 {
-    return common_local_url('showstream', array('nickname' => $nickname));
+    return common_local_url('showstream', array('nickname' => $nickname),
+                            null, null, false);
 }
 
 // Should make up a reasonable root URL
 
 function common_root_url($ssl=false)
 {
-    $url = common_path('', $ssl);
+    $url = common_path('', $ssl, false);
     $i = strpos($url, '?');
     if ($i !== false) {
         $url = substr($url, 0, $i);
@@ -1334,7 +1481,8 @@ function common_remove_magic_from_request()
 
 function common_user_uri(&$user)
 {
-    return common_local_url('userbyid', array('id' => $user->id));
+    return common_local_url('userbyid', array('id' => $user->id),
+                            null, null, false);
 }
 
 function common_notice_uri(&$notice)
@@ -1514,6 +1662,7 @@ function common_database_tablename($tablename)
  */
 function common_shorten_url($long_url)
 {
+    $long_url = trim($long_url);
     $user = common_current_user();
     if (empty($user)) {
         // common current user does not find a user when called from the XMPP daemon
@@ -1528,7 +1677,7 @@ function common_shorten_url($long_url)
         return $long_url;
     }else{
         //URL was shortened, so return the result
-        return $shortenedUrl;
+        return trim($shortenedUrl);
     }
 }
 
@@ -1605,7 +1754,8 @@ function common_url_to_nickname($url)
             # Strip starting, ending slashes
             $path = preg_replace('@/$@', '', $parts['path']);
             $path = preg_replace('@^/@', '', $path);
-            if (strpos($path, '/') === false) {
+            $path = basename($path);
+            if ($path) {
                 return common_nicknamize($path);
             }
         }
index c7276b56f7a39b0ff001b232821c8734e2b51282..578f0d25092dc04c800e2f3e66f0480651e10809 100644 (file)
@@ -9,76 +9,83 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:05:58+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:06+0000\n"
 "Language-Team: Arabic\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "نفاذ"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "إعدادات الوصول إلى الموقع"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "تسجيل"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "خاص"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "بالدعوة فقط"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "خاص"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "مُغلق"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "بالدعوة فقط"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "عطّل التسجيل الجديد."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "أرسل"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "مُغلق"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "حفظ إعدادت الوصول"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "أرسل"
+
+#. 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 "لا صفحة كهذه"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -92,73 +99,82 @@ msgstr "لا صفحة كهذه"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "لا مستخدم كهذا."
 
-#: actions/all.php:84
+#. 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 والأصدقاء, الصفحة %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s والأصدقاء"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr ""
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "أنت والأصدقاء"
 
@@ -176,20 +192,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "لم يتم العثور على وسيلة API."
 
@@ -221,8 +237,9 @@ msgstr "تعذّر تحديث المستخدم."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "ليس للمستخدم ملف شخصي."
 
@@ -246,7 +263,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -356,68 +373,68 @@ msgstr "تعذّر تحديد المستخدم المصدر."
 msgid "Could not find target user."
 msgstr "تعذّر إيجاد المستخدم الهدف."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "الاسم المستعار مستخدم بالفعل. جرّب اسمًا آخرًا."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "ليس اسمًا مستعارًا صحيحًا."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "الصفحة الرئيسية ليست عنونًا صالحًا."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "الاسم الكامل طويل جدا (الأقصى 255 حرفًا)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr ""
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 ""
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "كنيات كيرة! العدد الأقصى هو %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "كنية غير صالحة: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr ""
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -428,15 +445,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "لم توجد المجموعة!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr ""
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعة %2$s."
@@ -445,7 +462,7 @@ msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعة %2$s."
 msgid "You are not a member of this group."
 msgstr "لست عضوًا في هذه المجموعة"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "لم يمكن إزالة المستخدم %1$s من المجموعة %2$s."
@@ -477,7 +494,7 @@ msgstr "حجم غير صالح."
 #: 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:309
+#: 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
@@ -486,7 +503,7 @@ msgstr "حجم غير صالح."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -520,7 +537,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -543,13 +560,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "الحساب"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -631,12 +648,12 @@ msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "مسار %s الزمني"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -672,7 +689,7 @@ msgstr "كرر إلى %s"
 msgid "Repeats of %s"
 msgstr "تكرارات %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "الإشعارات الموسومة ب%s"
@@ -693,8 +710,7 @@ msgstr "لا مرفق كهذا."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "لا اسم مستعار."
 
@@ -706,7 +722,7 @@ msgstr "لا حجم."
 msgid "Invalid size."
 msgstr "حجم غير صالح."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "أفتار"
@@ -714,7 +730,7 @@ msgstr "أفتار"
 #: actions/avatarsettings.php:78
 #, php-format
 msgid "You can upload your personal avatar. The maximum file size is %s."
-msgstr ""
+msgstr "بإمكانك رفع أفتارك الشخصي. أقصى حجم للملف هو %s."
 
 #: actions/avatarsettings.php:106 actions/avatarsettings.php:185
 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72
@@ -723,30 +739,30 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "إعدادات الأفتار"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
-msgstr "الأصلي"
+msgstr "الأصل"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
-msgstr "عاين"
+msgstr "معاينة"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "احذف"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "ارفع"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -754,7 +770,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -786,22 +802,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "لا"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "لا تمنع هذا المستخدم"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "نعم"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "امنع هذا المستخدم"
 
@@ -809,39 +825,43 @@ msgstr "امنع هذا المستخدم"
 msgid "Failed to save block information."
 msgstr "فشل حفظ معلومات المنع."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "لا مجموعة كهذه."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s ملفات ممنوعة, الصفحة %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "ألغ منع المستخدم من المجموعة"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "ألغِ المنع"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "ألغِ منع هذا المستخدم"
 
@@ -918,14 +938,13 @@ msgstr "أنت لست مالك هذا التطبيق."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
 #: actions/deleteapplication.php:123 actions/deleteapplication.php:147
-#, fuzzy
 msgid "Delete application"
-msgstr "عدÙ\91Ù\84 التطبيق"
+msgstr "احذÙ\81 Ù\87ذا التطبيق"
 
 #: actions/deleteapplication.php:149
 msgid ""
@@ -935,21 +954,20 @@ msgid ""
 msgstr ""
 
 #: actions/deleteapplication.php:156
-#, fuzzy
 msgid "Do not delete this application"
-msgstr "Ù\84ا ØªØ­Ø°Ù\81 Ù\87ذا Ø§Ù\84إشعار"
+msgstr "Ù\84ا ØªØ­Ø°Ù\81 Ù\87ذا Ø§Ù\84تطبÙ\8aÙ\82"
 
 #: actions/deleteapplication.php:160
-#, fuzzy
 msgid "Delete this application"
-msgstr "احذÙ\81 Ù\87ذا Ø§Ù\84إشعار"
+msgstr "احذÙ\81 Ù\87ذا Ø§Ù\84تطبÙ\8aÙ\82"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "لست والجًا."
@@ -976,7 +994,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟"
 msgid "Do not delete this notice"
 msgstr "لا تحذف هذا الإشعار"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "احذف هذا الإشعار"
 
@@ -992,18 +1010,18 @@ msgstr "يمكنك حذف المستخدمين المحليين فقط."
 msgid "Delete user"
 msgstr "احذف المستخدم"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "احذف هذا المستخدم"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "التصميم"
 
@@ -1054,7 +1072,7 @@ msgstr "الخلفية"
 msgid ""
 "You can upload a background image for the site. The maximum file size is %1"
 "$s."
-msgstr ""
+msgstr "بإمكانك رفع صورة خلفية للموقع. أقصى حجم للملف هو %1$s."
 
 #: actions/designadminpanel.php:457 lib/designsettings.php:139
 msgid "On"
@@ -1104,6 +1122,17 @@ msgstr "استعد التصميمات المبدئية"
 msgid "Reset back to default"
 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/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 "أرسل"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "احفظ التصميم"
@@ -1117,12 +1146,11 @@ msgid "Add to favorites"
 msgstr "أضف إلى المفضلات"
 
 #: actions/doc.php:158
-#, fuzzy, php-format
+#, php-format
 msgid "No such document \"%s\""
-msgstr "لا مستند كهذا."
+msgstr "لا مستند باسم \"%s\""
 
 #: actions/editapplication.php:54
-#, fuzzy
 msgid "Edit Application"
 msgstr "عدّل التطبيق"
 
@@ -1196,29 +1224,29 @@ msgstr "عدّل مجموعة %s"
 msgid "You must be logged in to create a group."
 msgstr "يجب أن تكون والجًا لتنشئ مجموعة."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "يجب أن تكون إداريا لتعدل المجموعة."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "استخدم هذا النموذج لتعديل المجموعة."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr ""
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعة."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "حُفظت الخيارات."
 
@@ -1302,15 +1330,15 @@ msgstr "أرسل لي بريدًا إلكرتونيًا عندما يضيف أح
 
 #: actions/emailsettings.php:169
 msgid "Send me email when someone sends me a private message."
-msgstr ""
+msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحد رسالة خاصة."
 
 #: actions/emailsettings.php:174
 msgid "Send me email when someone sends me an \"@-reply\"."
-msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحدهم \"@-رد\"."
+msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحد \"@-رد\"."
 
 #: actions/emailsettings.php:179
 msgid "Allow friends to nudge me and send me an email."
-msgstr ""
+msgstr "اسمح لأصدقائي بتنبيهي ومراسلتي عبر البريد الإلكتروني."
 
 #: actions/emailsettings.php:185
 msgid "I want to post notices by email."
@@ -1318,7 +1346,7 @@ msgstr "أريد أن أرسل الملاحظات عبر البريد الإلك
 
 #: actions/emailsettings.php:191
 msgid "Publish a MicroID for my email address."
-msgstr ""
+msgstr "انشر هوية مصغّرة لعنوان بريدي الإلكتروني."
 
 #: actions/emailsettings.php:302 actions/imsettings.php:264
 #: actions/othersettings.php:180 actions/smssettings.php:284
@@ -1387,7 +1415,7 @@ msgstr "لا عنوان بريد إلكتروني وارد."
 #: actions/emailsettings.php:456 actions/emailsettings.php:478
 #: actions/smssettings.php:528 actions/smssettings.php:552
 msgid "Couldn't update user record."
-msgstr ""
+msgstr "تعذّر تحديث سجل المستخدم."
 
 #: actions/emailsettings.php:459 actions/smssettings.php:531
 msgid "Incoming email address removed."
@@ -1547,7 +1575,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr "المستخدم ليس عضوًا في المجموعة."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "امنع المستخدم من المجموعة"
 
@@ -1579,86 +1607,86 @@ msgstr "لا هوية."
 msgid "You must be logged in to edit a group."
 msgstr "يجب أن تلج لتُعدّل المجموعات."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "تصميم المجموعة"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "تعذّر تحديث تصميمك."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "شعار المجموعة"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
-msgstr ""
+msgstr "بإمكانك رفع صورة شعار مجموعتك. أقصى حجم للملف هو %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "المستخدم بدون ملف مطابق."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "حُدّث الشعار."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "فشل رفع الشعار."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "أعضاء مجموعة %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s أعضاء المجموعة, الصفحة %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "قائمة بمستخدمي هذه المجموعة."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "إداري"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "امنع"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "اجعل هذا المستخدم إداريًا"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
@@ -1816,16 +1844,16 @@ msgstr "هذه ليست هويتك في جابر."
 #: actions/inbox.php:59
 #, php-format
 msgid "Inbox for %1$s - page %2$d"
-msgstr ""
+msgstr "صندوق %1$s الوارد - صفحة %2$d"
 
 #: actions/inbox.php:62
 #, php-format
 msgid "Inbox for %s"
-msgstr ""
+msgstr "صندوق %s الوارد"
 
 #: actions/inbox.php:115
 msgid "This is your inbox, which lists your incoming private messages."
-msgstr ""
+msgstr "هذا صندوق بريدك الوارد، والذي يسرد رسائلك الخاصة الواردة."
 
 #: actions/invite.php:39
 msgid "Invites have been disabled."
@@ -1876,7 +1904,7 @@ msgstr ""
 #: actions/invite.php:162
 msgid ""
 "Use this form to invite your friends and colleagues to use this service."
-msgstr ""
+msgstr "استخدم هذا النموذج لدعوة أصدقائك وزملائك لاستخدام هذه الخدمة."
 
 #: actions/invite.php:187
 msgid "Email addresses"
@@ -1894,16 +1922,19 @@ msgstr "رسالة شخصية"
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "أرسل"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1938,7 +1969,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "يجب أن تلج لتنضم إلى مجموعة."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "لا اسم مستعار."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s انضم للمجموعة %2$s"
@@ -1947,11 +1983,11 @@ msgstr "%1$s انضم للمجموعة %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "يجب أن تلج لتغادر مجموعة."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "لست عضوا في تلك المجموعة."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s ترك المجموعة %2$s"
@@ -1968,8 +2004,7 @@ msgstr "اسم المستخدم أو كلمة السر غير صحيحان."
 msgid "Error setting user. You are probably not authorized."
 msgstr "خطأ أثناء ضبط المستخدم. لست مُصرحًا على الأرجح."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "لُج"
 
@@ -1983,7 +2018,7 @@ msgstr "تذكّرني"
 
 #: actions/login.php:237 actions/register.php:480
 msgid "Automatically login in the future; not for shared computers!"
-msgstr ""
+msgstr "لُج تلقائيًا في المستقبل؛ هذا الخيار ليس مُعدًا للحواسيب المشتركة!"
 
 #: actions/login.php:247
 msgid "Lost or forgotten password?"
@@ -1994,6 +2029,7 @@ msgid ""
 "For security reasons, please re-enter your user name and password before "
 "changing your settings."
 msgstr ""
+"لأسباب أمنية، من فضلك أعد إدخال اسم مستخدمك وكلمة سرك قبل تغيير إعداداتك."
 
 #: actions/login.php:270
 #, php-format
@@ -2026,7 +2062,6 @@ msgid "No current status"
 msgstr "لا حالة حالية"
 
 #: actions/newapplication.php:52
-#, fuzzy
 msgid "New Application"
 msgstr "تطبيق جديد"
 
@@ -2211,8 +2246,8 @@ msgstr "نوع المحتوى "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "ليس نسق بيانات مدعوم."
 
@@ -2279,20 +2314,20 @@ msgstr "توكن الدخول انتهى."
 #: actions/outbox.php:58
 #, php-format
 msgid "Outbox for %1$s - page %2$d"
-msgstr ""
+msgstr "صندوق %1$s الصادر - صفحة %2$d"
 
 #: actions/outbox.php:61
 #, php-format
 msgid "Outbox for %s"
-msgstr ""
+msgstr "صندوق %s الصادر"
 
 #: actions/outbox.php:116
 msgid "This is your outbox, which lists private messages you have sent."
-msgstr ""
+msgstr "هذا صندوق بريدك الصادر، والذي يسرد الرسائل الخاصة التي أرسلتها."
 
 #: actions/passwordsettings.php:58
 msgid "Change password"
-msgstr "غÙ\8aÙ\91ر كلمة السر"
+msgstr "تغÙ\8aÙ\8aر كلمة السر"
 
 #: actions/passwordsettings.php:69
 msgid "Change your password."
@@ -2312,7 +2347,7 @@ msgstr "كلمة سر جديدة"
 
 #: actions/passwordsettings.php:109
 msgid "6 or more characters"
-msgstr ""
+msgstr "6 أحرف أو أكثر"
 
 #: actions/passwordsettings.php:112 actions/recoverpassword.php:239
 #: actions/register.php:433 actions/smssettings.php:134
@@ -2351,7 +2386,7 @@ msgstr "تعذّر حفظ كلمة السر الجديدة."
 msgid "Password saved."
 msgstr "حُفظت كلمة السر."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "المسارات"
 
@@ -2384,7 +2419,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "الموقع"
 
@@ -2549,10 +2583,10 @@ msgstr "معلومات الملف الشخصي"
 
 #: actions/profilesettings.php:108 lib/groupeditform.php:154
 msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
-msgstr ""
+msgstr "1-64 حرفًا إنجليزيًا أو رقمًا بدون نقاط أو مسافات"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "الاسم الكامل"
@@ -2580,7 +2614,7 @@ msgid "Bio"
 msgstr "السيرة"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2645,23 +2679,24 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "وسم غير صالح: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "لم يمكن حفظ تفضيلات الموقع."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "تعذّر حفظ الملف الشخصي."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "تعذّر حفظ الوسوم."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "حُفظت الإعدادات."
 
@@ -2674,45 +2709,45 @@ msgstr "وراء حد الصفحة (%s)"
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "المسار الزمني العام، صفحة %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "المسار الزمني العام"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "كن أول من يُرسل!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2725,7 +2760,7 @@ msgstr ""
 "الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! "
 "([اقرأ المزيد](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2896,8 +2931,7 @@ msgstr "عذرا، رمز دعوة غير صالح."
 msgid "Registration successful"
 msgstr "نجح التسجيل"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "سجّل"
 
@@ -3020,7 +3054,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "اشترك"
 
@@ -3056,7 +3090,7 @@ msgstr "لا يمكنك تكرار ملاحظتك الشخصية."
 msgid "You already repeated that notice."
 msgstr "أنت كررت هذه الملاحظة بالفعل."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "مكرر"
 
@@ -3064,47 +3098,47 @@ msgstr "مكرر"
 msgid "Repeated!"
 msgstr "مكرر!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "الردود على %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "الردود على %s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr ""
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr ""
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr ""
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3129,7 +3163,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "الجلسات"
 
@@ -3155,7 +3188,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "مكّن تنقيح مُخرجات الجلسة."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "اذف إعدادت الموقع"
 
@@ -3185,7 +3218,7 @@ msgstr "المنظمة"
 msgid "Description"
 msgstr "الوصف"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "إحصاءات"
@@ -3247,28 +3280,28 @@ msgstr "إشعارات %s المُفضلة"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr ""
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3277,7 +3310,7 @@ msgstr ""
 "%s لم يضف أي إشعارات إلى مفضلته إلى الآن. أرسل شيئًا شيقًا ليضيفه إلى "
 "مفضلته. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3287,7 +3320,7 @@ msgstr ""
 "%s لم يضف أي إشعارات إلى مفضلته إلى الآن. لمّ لا [تسجل حسابًا](%%%%action."
 "register%%%%) وترسل شيئًا شيقًا ليضيفه إلى مفضلته. :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "إنها إحدى وسائل مشاركة ما تحب."
 
@@ -3301,67 +3334,67 @@ msgstr "مجموعة %s"
 msgid "%1$s group, page %2$d"
 msgstr "%1$s أعضاء المجموعة, الصفحة %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "ملف المجموعة الشخصي"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "مسار"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "ملاحظة"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "الكنى"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "الأعضاء"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(لا شيء)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "جميع الأعضاء"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "أنشئ"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3371,7 +3404,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3380,7 +3413,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "الإداريون"
 
@@ -3697,7 +3730,7 @@ msgstr ""
 
 #: actions/smssettings.php:374
 msgid "That is the wrong confirmation number."
-msgstr ""
+msgstr "إن رقم التأكيد هذا خاطئ."
 
 #: actions/smssettings.php:405
 msgid "That is not your phone number."
@@ -3720,21 +3753,30 @@ msgstr ""
 
 #: actions/smssettings.php:498
 msgid "No code entered"
-msgstr ""
+msgstr "لم تدخل رمزًا"
 
 #: actions/subedit.php:70
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "تعذّر حفظ الاشتراك."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "ليس مُستخدمًا محليًا."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "هذا الإجراء يقبل طلبات POST فقط."
+
+#: 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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "مُشترك"
 
@@ -3794,7 +3836,7 @@ msgstr "هؤلاء الأشخاص الذي تستمع إليهم."
 msgid "These are the people whose notices %s listens to."
 msgstr "هؤلاء الأشخاص الذي يستمع %s إليهم."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3804,35 +3846,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "جابر"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "رسائل قصيرة"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "الإشعارات الموسومة ب%s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -3882,7 +3924,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "لا وسم كهذا."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -3912,70 +3954,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "المستخدم"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "رسالة ترحيب غير صالحة. أقصى طول هو 255 حرف."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "الملف الشخصي"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "حد السيرة"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "مستخدمون جدد"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "ترحيب المستخدمين الجدد"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "نص الترحيب بالمستخدمين الجدد (255 حرفًا كحد أقصى)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "الاشتراك المبدئي"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "أشرك المستخدمين الجدد بهذا المستخدم تلقائيًا."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "الدعوات"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "الدعوات مُفعلة"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4080,7 +4124,7 @@ msgstr "تصميم الملف الشخصي"
 msgid ""
 "Customize the way your profile looks with a background image and a colour "
 "palette of your choice."
-msgstr ""
+msgstr "خصّص أسلوب عرض ملفك بصورة خلفية ومخطط ألوان من اختيارك."
 
 #: actions/userdesignsettings.php:282
 msgid "Enjoy your hotdog!"
@@ -4098,7 +4142,7 @@ msgstr "ابحث عن المزيد من المجموعات"
 #: actions/usergroups.php:153
 #, php-format
 msgid "%s is not a member of any group."
-msgstr ""
+msgstr "%s ليس عضوًا في أي مجموعة."
 
 #: actions/usergroups.php:158
 #, php-format
@@ -4116,10 +4160,12 @@ msgid ""
 "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, "
 "Inc. and contributors."
 msgstr ""
+"هذا الموقع يشغله %1$s النسخة %2$s، حقوق النشر 2008-2010 StatusNet, Inc "
+"ومساهموها."
 
 #: actions/version.php:161
 msgid "Contributors"
-msgstr ""
+msgstr "المساهمون"
 
 #: actions/version.php:168
 msgid ""
@@ -4146,9 +4192,9 @@ msgstr ""
 
 #: actions/version.php:189
 msgid "Plugins"
-msgstr "ملحقات"
+msgstr "الملحقات"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "النسخة"
 
@@ -4185,6 +4231,10 @@ msgstr "ليس جزءا من المجموعة."
 msgid "Group leave failed."
 msgstr "ترك المجموعة فشل."
 
+#: 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"
@@ -4202,66 +4252,95 @@ msgstr "تعذّر إدراج الرسالة."
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "مشكلة في حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكلة في حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "مشكلة أثناء حفظ الإشعار."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشكلة أثناء حفظ الإشعار."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr ""
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "آر تي @%1$s %2$s"
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "تعذّر حذف الاشتراك."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم في %1$s يا @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعة."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "تعذّر ضبط عضوية المجموعة."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضوية المجموعة."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "تعذّر حفظ الاشتراك."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "غيّر إعدادات ملفك الشخصي"
@@ -4303,120 +4382,190 @@ msgstr "صفحة غير مُعنونة"
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "الرئيسية"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "الملف الشخصي ومسار الأصدقاء الزمني"
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "شخصية"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "اتصل"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "غير كلمة سرّك"
 
-#: lib/action.php:444
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "الحساب"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr ""
+msgstr "اتصالات"
+
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "اتصل"
 
-#: lib/action.php:448
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "غيّر ضبط الموقع"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "ادعُ"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "إداري"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
-msgstr ""
+msgstr "استخدم هذا النموذج لدعوة أصدقائك وزملائك لاستخدام هذه الخدمة."
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "اخرج"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "ادعُ"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "اخرج من الموقع"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "اخرج"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "أنشئ حسابًا"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "سجّل"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "لُج إلى الموقع"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "مساعدة"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "لُج"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "ساعدني!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "ابحث"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "مساعدة"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "ابحث عن أشخاص أو نص"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "ابحث"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "إشعار الموقع"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "المشاهدات المحلية"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "إشعار الصفحة"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "مساعدة"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "عن"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "الأسئلة المكررة"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "الشروط"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "خصوصية"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "المصدر"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "اتصل"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
-msgstr ""
+msgstr "الجسر"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "رخصة برنامج StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4425,12 +4574,12 @@ msgstr ""
 "**%%site.name%%** خدمة تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4441,96 +4590,159 @@ msgstr ""
 "المتوفر تحت [رخصة غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
 "agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "رخصة محتوى الموقع"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "الرخصة."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "قبل"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "التغييرات لهذه اللوحة غير مسموح بها."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "تعذّر حذف إعدادات التصميم."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "ضبط الموقع الأساسي"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "الموقع"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "ضبط التصميم"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "التصميم"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "ضبط المسارات"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
 #, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "المستخدم"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
-msgstr "ضبط Ø§Ù\84تصÙ\85Ù\8aÙ\85"
+msgstr "ضبط Ø§Ù\84حساب"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "ضبط المسارات"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
-msgstr "ضبط التصميم"
+msgstr "ضبط الجلسات"
+
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "الجلسات"
 
-#: lib/apiauth.php:95
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4620,11 +4832,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr "وسوم هذا المرفق"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "تغيير كلمة السر فشل"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "تغيير كلمة السر غير مسموح به"
 
@@ -4775,54 +4987,64 @@ msgstr "خطأ أثناء حفظ الإشعار."
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "لا مستخدم كهذا."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "مُشترك ب%s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "ألغِ الاشتراك"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "لست مُشتركًا بأي أحد."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "لست مشتركًا بأحد."
@@ -4832,11 +5054,11 @@ msgstr[3] "أنت مشترك بهؤلاء الأشخاص:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "لا أحد مشترك بك."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "لا أحد مشترك بك."
@@ -4846,11 +5068,11 @@ msgstr[3] "هؤلاء الأشخاص مشتركون بك:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "لست عضوًا في أي مجموعة."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "لست عضوًا في أي مجموعة."
@@ -4860,7 +5082,7 @@ msgstr[3] "أنت عضو في هذه المجموعات:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4874,6 +5096,7 @@ msgid ""
 "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"
@@ -4901,19 +5124,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "اذهب إلى المُثبّت."
 
@@ -5099,23 +5322,23 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr ""
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "نوع ملف غير معروف"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "ميجابايت"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "كيلوبايت"
 
@@ -5329,7 +5552,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "من"
 
@@ -5418,6 +5641,12 @@ msgstr "إلى"
 msgid "Available characters"
 msgstr "المحارف المتوفرة"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "أرسل"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "أرسل إشعارًا"
@@ -5449,48 +5678,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "ش"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "ج"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "ر"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "غ"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "في"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "في السياق"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "مكرر بواسطة"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "رُد على هذا الإشعار"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "رُد"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "الإشعار مكرر"
 
@@ -5522,10 +5751,6 @@ msgstr "خطأ أثناء إدراج الملف الشخصي البعيد"
 msgid "Duplicate notice"
 msgstr "ضاعف الإشعار"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "تعذّر إدراج اشتراك جديد."
@@ -5542,6 +5767,10 @@ msgstr "الردود"
 msgid "Favorites"
 msgstr "المفضلات"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "المستخدم"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق الوارد"
@@ -5565,7 +5794,7 @@ msgstr "وسوم في إشعارات %s"
 
 #: lib/plugin.php:114
 msgid "Unknown"
-msgstr "غير معروف"
+msgstr "غير معروفة"
 
 #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
 msgid "Subscriptions"
@@ -5631,7 +5860,7 @@ msgstr "أأكرّر هذا الإشعار؟ّ"
 msgid "Repeat this notice"
 msgstr "كرّر هذا الإشعار"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5651,6 +5880,10 @@ msgstr "ابحث في الموقع"
 msgid "Keyword(s)"
 msgstr "الكلمات المفتاحية"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "ابحث"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "ابحث في المساعدة"
@@ -5702,34 +5935,15 @@ msgstr "الأشخاص المشتركون ب%s"
 msgid "Groups %s is a member of"
 msgstr "المجموعات التي %s عضو فيها"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "مُشترك أصلا!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "لقد منعك المستخدم."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "تعذّر الاشتراك."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "ادعُ"
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "غير مشترك!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "لم يمكن حذف اشتراك ذاتي."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "تعذّر حذف الاشتراك."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5780,67 +5994,67 @@ msgstr "عدّل الأفتار"
 msgid "User actions"
 msgstr "تصرفات المستخدم"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "عدّل إعدادات الملف الشخصي"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "عدّل"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "أرسل رسالة مباشرة إلى هذا المستخدم"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "رسالة"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "قبل دقيقة تقريبًا"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "قبل ساعة تقريبًا"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "قبل سنة تقريبًا"
 
index 2940486d81b301f7efde98de5e18675a7637210d..3ce1fbc4efcc7659a8fbe3840e65322b8eeab6b0 100644 (file)
@@ -10,79 +10,86 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:06:01+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:09+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.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "نفاذ"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "اذف إعدادت الموقع"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "سجّل"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "خاص"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "بالدعوه فقط"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "خاص"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "مُغلق"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "بالدعوه فقط"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "عطّل التسجيل الجديد."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "أرسل"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "مُغلق"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "اذف إعدادت الموقع"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "أرسل"
+
+#. 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 "لا صفحه كهذه"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -96,73 +103,82 @@ msgstr "لا صفحه كهذه"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "لا مستخدم كهذا."
 
-#: actions/all.php:84
+#. 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 و الصحاب, صفحه %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s والأصدقاء"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr ""
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "أنت والأصدقاء"
 
@@ -180,22 +196,22 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
-msgstr "لم يتم العثور على وسيله API."
+msgstr "الـ API method مش موجوده."
 
 #: actions/apiaccountupdatedeliverydevice.php:85
 #: actions/apiaccountupdateprofile.php:89
@@ -225,8 +241,9 @@ msgstr "تعذّر تحديث المستخدم."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "ليس للمستخدم ملف شخصى."
 
@@ -250,7 +267,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -263,7 +280,7 @@ msgstr "تعذّر تحديث تصميمك."
 
 #: actions/apiblockcreate.php:105
 msgid "You cannot block yourself!"
-msgstr "Ù\84ا Ù\8aÙ\85Ù\83Ù\86Ù\83 منع نفسك!"
+msgstr "Ù\85ا Ù\8aÙ\86Ù\81عش Øªمنع نفسك!"
 
 #: actions/apiblockcreate.php:126
 msgid "Block user failed."
@@ -360,68 +377,68 @@ msgstr ""
 msgid "Could not find target user."
 msgstr "تعذّر إيجاد المستخدم الهدف."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 ""
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "ليس اسمًا مستعارًا صحيحًا."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "الصفحه الرئيسيه ليست عنونًا صالحًا."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "الاسم الكامل طويل جدا (الأقصى 255 حرفًا)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr ""
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 ""
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "كنيه غير صالحة: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr ""
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -432,15 +449,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "لم توجد المجموعة!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr ""
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "ما نفعش يضم %1$s للجروپ %2$s."
@@ -449,7 +466,7 @@ msgstr "ما نفعش يضم %1$s للجروپ %2$s."
 msgid "You are not a member of this group."
 msgstr ""
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "ما نفعش يتشال اليوزر %1$s من الجروپ %2$s."
@@ -481,7 +498,7 @@ msgstr "حجم غير صالح."
 #: 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:309
+#: 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
@@ -490,7 +507,7 @@ msgstr "حجم غير صالح."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -524,7 +541,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -547,13 +564,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "الحساب"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -591,11 +608,11 @@ msgstr "لا إشعار كهذا."
 
 #: actions/apistatusesretweet.php:83
 msgid "Cannot repeat your own notice."
-msgstr "Ù\84ا Ù\8aÙ\85Ù\83Ù\86Ù\83 ØªÙ\83رار Ù\85Ù\84Ø­Ù\88ظتÙ\83 Ø§Ù\84خاصÙ\87."
+msgstr "Ù\85Ø´ Ù\86اÙ\81عÙ\87 ØªØªÙ\83رر Ø§Ù\84Ù\85Ù\84احظتÙ\83 Ø¨ØªØ§Ø¹ØªÙ\83."
 
 #: actions/apistatusesretweet.php:91
 msgid "Already repeated that notice."
-msgstr "كرر بالفعل هذه الملاحظه."
+msgstr "الملاحظه اتكررت فعلا."
 
 #: actions/apistatusesshow.php:138
 msgid "Status deleted."
@@ -635,12 +652,12 @@ msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "مسار %s الزمني"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -676,7 +693,7 @@ msgstr "كرر إلى %s"
 msgid "Repeats of %s"
 msgstr "تكرارات %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "الإشعارات الموسومه ب%s"
@@ -697,8 +714,7 @@ msgstr "لا مرفق كهذا."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "لا اسم مستعار."
 
@@ -710,7 +726,7 @@ msgstr "لا حجم."
 msgid "Invalid size."
 msgstr "حجم غير صالح."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "أفتار"
@@ -727,30 +743,30 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "إعدادات الأفتار"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "الأصلي"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "عاين"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "احذف"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "ارفع"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -758,7 +774,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -790,22 +806,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "لا"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "لا تمنع هذا المستخدم"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "نعم"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "امنع هذا المستخدم"
 
@@ -813,39 +829,43 @@ msgstr "امنع هذا المستخدم"
 msgid "Failed to save block information."
 msgstr "فشل حفظ معلومات المنع."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "لا مجموعه كهذه."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s فايلات معمول ليها بلوك, الصفحه %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "ألغ منع المستخدم من المجموعة"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "ألغِ المنع"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "ألغِ منع هذا المستخدم"
 
@@ -922,7 +942,7 @@ msgstr "انت مش بتملك الapplication دى."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -948,12 +968,13 @@ msgstr "لا تحذف هذا الإشعار"
 msgid "Delete this application"
 msgstr "احذف هذا الإشعار"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "لست والجًا."
@@ -980,7 +1001,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟"
 msgid "Do not delete this notice"
 msgstr "لا تحذف هذا الإشعار"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "احذف هذا الإشعار"
 
@@ -996,18 +1017,18 @@ msgstr "يمكنك حذف المستخدمين المحليين فقط."
 msgid "Delete user"
 msgstr "احذف المستخدم"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "احذف هذا المستخدم"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "التصميم"
 
@@ -1108,6 +1129,17 @@ msgstr "استعد التصميمات المبدئية"
 msgid "Reset back to default"
 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/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 "أرسل"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "احفظ التصميم"
@@ -1200,29 +1232,29 @@ msgstr "عدّل مجموعه %s"
 msgid "You must be logged in to create a group."
 msgstr "يجب أن تكون والجًا لتنشئ مجموعه."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "لازم تكون ادارى علشان تعدّل الجروپ."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "استخدم هذا النموذج لتعديل المجموعه."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr ""
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعه."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "حُفظت الخيارات."
 
@@ -1468,11 +1500,11 @@ msgstr "اختيار لبعض المستخدمين المتميزين على %s"
 
 #: actions/file.php:34
 msgid "No notice ID."
-msgstr "Ù\84ا Ø±Ù\82Ù\85 Ù\85Ù\84احظÙ\87."
+msgstr "Ù\85ا Ù\81Ù\8aØ´ Ù\85Ù\84احظة ID."
 
 #: actions/file.php:38
 msgid "No notice."
-msgstr "Ù\84ا ملاحظه."
+msgstr "Ù\85ا Ù\81Ù\8aØ´ ملاحظه."
 
 #: actions/file.php:42
 msgid "No attachments."
@@ -1480,7 +1512,7 @@ msgstr "لا مرفقات."
 
 #: actions/file.php:51
 msgid "No uploaded attachments."
-msgstr "Ù\84ا Ù\85رÙ\81Ù\82ات Ù\85رÙ\81Ù\88عÙ\87."
+msgstr "Ù\85ا Ù\81Ù\8aØ´ Ù\81اÙ\8aÙ\84ات Ø§ØªØ¹Ù\85Ù\84Ù\84Ù\87ا upload."
 
 #: actions/finishremotesubscribe.php:69
 msgid "Not expecting this response!"
@@ -1551,7 +1583,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr "المستخدم ليس عضوًا فى المجموعه."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "امنع المستخدم من المجموعة"
 
@@ -1583,86 +1615,86 @@ msgstr "لا هويه."
 msgid "You must be logged in to edit a group."
 msgstr "يجب أن تلج لتُعدّل المجموعات."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "تصميم المجموعة"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "تعذّر تحديث تصميمك."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "شعار المجموعة"
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "يوزر من-غير پروفايل زيّه."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "حُدّث الشعار."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "فشل رفع الشعار."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "أعضاء مجموعه %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s اعضاء الجروپ, صفحه %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "قائمه بمستخدمى هذه المجموعه."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "إداري"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "امنع"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "اجعل هذا المستخدم إداريًا"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
@@ -1898,16 +1930,19 @@ msgstr "رساله شخصية"
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "أرسل"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1942,7 +1977,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "لا اسم مستعار."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s دخل جروپ %2$s"
@@ -1951,11 +1991,11 @@ msgstr "%1$s دخل جروپ %2$s"
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "لست عضوا فى تلك المجموعه."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s ساب جروپ %2$s"
@@ -1972,8 +2012,7 @@ msgstr "اسم المستخدم أو كلمه السر غير صحيحان."
 msgid "Error setting user. You are probably not authorized."
 msgstr "خطأ أثناء ضبط المستخدم. لست مُصرحًا على الأرجح."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "لُج"
 
@@ -2213,8 +2252,8 @@ msgstr "نوع المحتوى "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr " مش نظام بيانات مدعوم."
 
@@ -2353,7 +2392,7 @@ msgstr "تعذّر حفظ كلمه السر الجديده."
 msgid "Password saved."
 msgstr "حُفظت كلمه السر."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "المسارات"
 
@@ -2386,7 +2425,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "الموقع"
 
@@ -2554,7 +2592,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr ""
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "الاسم الكامل"
@@ -2582,7 +2620,7 @@ msgid "Bio"
 msgstr "السيرة"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2646,23 +2684,24 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "وسم غير صالح: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "لم يمكن حفظ تفضيلات الموقع."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "تعذّر حفظ الملف الشخصى."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "تعذّر حفظ الوسوم."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "حُفظت الإعدادات."
 
@@ -2675,45 +2714,45 @@ msgstr "وراء حد الصفحه (%s)"
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "المسار الزمنى العام، صفحه %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "المسار الزمنى العام"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "كن أول من يُرسل!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2726,7 +2765,7 @@ msgstr ""
 "الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! "
 "([اقرأ المزيد](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2897,8 +2936,7 @@ msgstr "عذرا، رمز دعوه غير صالح."
 msgid "Registration successful"
 msgstr "نجح التسجيل"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "سجّل"
 
@@ -3021,7 +3059,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "اشترك"
 
@@ -3047,17 +3085,17 @@ msgstr ""
 
 #: actions/repeat.php:64 actions/repeat.php:71
 msgid "No notice specified."
-msgstr "Ù\84ا Ù\85Ù\84احظÙ\87 Ù\85حدده."
+msgstr "Ù\85ا Ù\81Ù\8aØ´ Ù\85Ù\84احظÙ\87 Ù\85تحدده."
 
 #: actions/repeat.php:76
 msgid "You can't repeat your own notice."
-msgstr "Ù\84ا Ù\8aÙ\85Ù\83Ù\86Ù\83 ØªÙ\83رار Ù\85Ù\84احظتÙ\83 Ø§Ù\84شخصÙ\8aÙ\87."
+msgstr "Ù\85ا Ù\8aÙ\86Ù\81عش ØªÙ\83رر Ø§Ù\84Ù\85Ù\84احظÙ\87 Ø¨ØªØ§Ø¹ØªÙ\83."
 
 #: actions/repeat.php:90
 msgid "You already repeated that notice."
-msgstr "Ø£Ù\86ت Ù\83ررت Ù\87Ø°Ù\87 Ø§Ù\84Ù\85Ù\84احظÙ\87 Ø¨Ø§Ù\84Ù\81عÙ\84."
+msgstr "اÙ\86ت Ø¹Ù\8aدت Ø§Ù\84Ù\85Ù\84احظÙ\87 Ø¯Ù\89 Ù\81عÙ\84ا."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "مكرر"
 
@@ -3065,47 +3103,47 @@ msgstr "مكرر"
 msgid "Repeated!"
 msgstr "مكرر!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "الردود على %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "الردود على %s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr ""
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr ""
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr ""
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3130,7 +3168,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "الجلسات"
 
@@ -3156,7 +3193,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "مكّن تنقيح مُخرجات الجلسه."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "اذف إعدادت الموقع"
 
@@ -3186,7 +3223,7 @@ msgstr "المنظمه"
 msgid "Description"
 msgstr "الوصف"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "إحصاءات"
@@ -3248,28 +3285,28 @@ msgstr "إشعارات %s المُفضلة"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr ""
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3278,7 +3315,7 @@ msgstr ""
 "%s لم يضف أى إشعارات إلى مفضلته إلى الآن. أرسل شيئًا شيقًا ليضيفه إلى "
 "مفضلته. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3288,7 +3325,7 @@ msgstr ""
 "%s لم يضف أى إشعارات إلى مفضلته إلى الآن. لمّ لا [تسجل حسابًا](%%%%action."
 "register%%%%) وترسل شيئًا شيقًا ليضيفه إلى مفضلته. :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "إنها إحدى وسائل مشاركه ما تحب."
 
@@ -3302,67 +3339,67 @@ msgstr "مجموعه %s"
 msgid "%1$s group, page %2$d"
 msgstr "%1$s أعضاء المجموعة, الصفحه %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "ملف المجموعه الشخصي"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "مسار"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "ملاحظة"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "الكنى"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "الأعضاء"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(لا شيء)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "جميع الأعضاء"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "أنشئ"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3372,7 +3409,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3381,7 +3418,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "الإداريون"
 
@@ -3727,15 +3764,25 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "تعذّر حفظ الاشتراك."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "ليس مُستخدمًا محليًا."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "مُشترك"
 
@@ -3795,7 +3842,7 @@ msgstr "هؤلاء الأشخاص الذى تستمع إليهم."
 msgid "These are the people whose notices %s listens to."
 msgstr "هؤلاء الأشخاص الذى يستمع %s إليهم."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3805,35 +3852,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "جابر"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "رسائل قصيرة"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "الإشعارات الموسومه ب%s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -3858,7 +3905,7 @@ msgstr "صورة"
 
 #: actions/tagother.php:141
 msgid "Tag user"
-msgstr "اوسم المستخدم"
+msgstr "اعمل tag لليوزر"
 
 #: actions/tagother.php:151
 msgid ""
@@ -3883,7 +3930,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "لا وسم كهذا."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -3893,7 +3940,7 @@ msgstr "لم تمنع هذا المستخدم."
 
 #: actions/unsandbox.php:72
 msgid "User is not sandboxed."
-msgstr "اÙ\84Ù\85ستخدÙ\85 Ù\84Ù\8aس Ù\81Ù\89 ØµÙ\86دÙ\88Ù\82 Ø§Ù\84رÙ\85Ù\84."
+msgstr "اÙ\84Ù\8aÙ\88زر Ù\85Ø´ Ù\81Ù\89 Ø§Ù\84سبÙ\88رÙ\87."
 
 #: actions/unsilence.php:72
 msgid "User is not silenced."
@@ -3913,70 +3960,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "المستخدم"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "رساله ترحيب غير صالحه. أقصى طول هو 255 حرف."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "الملف الشخصي"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "حد السيرة"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "مستخدمون جدد"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "ترحيب المستخدمين الجدد"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "نص الترحيب بالمستخدمين الجدد (255 حرفًا كحد أقصى)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "الاشتراك المبدئي"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "أشرك المستخدمين الجدد بهذا المستخدم تلقائيًا."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "الدعوات"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "الدعوات مُفعلة"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4149,7 +4198,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "النسخه"
 
@@ -4186,10 +4235,15 @@ msgstr "مش جزء من الجروپ."
 msgid "Group leave failed."
 msgstr "الخروج من الجروپ فشل."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "تعذر تحديث المجموعه."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
-msgstr "Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 Ø¥Ù\86شاء ØªÙ\88Ù\83Ù\86 Ø§Ù\84Ù\88Ù\84Ù\88ج Ù\84%s"
+msgstr "Ù\85ا Ù\86Ù\81عش Ù\8aتعÙ\85Ù\84 Ø§Ù\85ارة ØªØ³Ø¬Ù\8aÙ\84 Ø¯Ø®Ù\88Ù\84 Ù\84Ù\80 %s"
 
 #: classes/Message.php:45
 msgid "You are banned from sending direct messages."
@@ -4203,66 +4257,95 @@ msgstr "تعذّر إدراج الرساله."
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "مشكله فى حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكله فى حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "مشكله أثناء حفظ الإشعار."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشكله أثناء حفظ الإشعار."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr ""
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "آر تى @%1$s %2$s"
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "تعذّر حذف الاشتراك."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم فى %1$s يا @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعه."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "تعذّر ضبط عضويه المجموعه."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضويه المجموعه."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "تعذّر حفظ الاشتراك."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "غيّر إعدادات ملفك الشخصي"
@@ -4304,120 +4387,190 @@ msgstr "صفحه غير مُعنونة"
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "الرئيسية"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "الملف الشخصى ومسار الأصدقاء الزمني"
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "شخصية"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "اتصل"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "غير كلمه سرّك"
 
-#: lib/action.php:444
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "الحساب"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr ""
+msgstr "كونيكشونات (Connections)"
+
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "اتصل"
 
-#: lib/action.php:448
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "غيّر ضبط الموقع"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "ادعُ"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "إداري"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "اخرج"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "ادعُ"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "اخرج من الموقع"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "اخرج"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "أنشئ حسابًا"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "سجّل"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "لُج إلى الموقع"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "مساعدة"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "لُج"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "ساعدني!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "ابحث"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "مساعدة"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "ابحث عن أشخاص أو نص"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "ابحث"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "إشعار الموقع"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "المشاهدات المحلية"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "إشعار الصفحة"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "مساعدة"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "عن"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "الأسئله المكررة"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "الشروط"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "خصوصية"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "المصدر"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "اتصل"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4426,12 +4579,12 @@ msgstr ""
 "**%%site.name%%** خدمه تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4442,96 +4595,161 @@ msgstr ""
 "المتوفر تحت [رخصه غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
 "agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "رخصه محتوى الموقع"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "الرخصه."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "قبل"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "التغييرات مش مسموحه للـ لوحه دى."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "تعذّر حذف إعدادات التصميم."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "ضبط الموقع الأساسي"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "الموقع"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "ضبط التصميم"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "التصميم"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "ضبط المسارات"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "المستخدم"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "ضبط التصميم"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "ضبط المسارات"
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "ضبط التصميم"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "الجلسات"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4621,11 +4839,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr "وسوم هذا المرفق"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "تغيير الپاسوورد فشل"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "تغيير الپاسوورد مش مسموح"
 
@@ -4776,54 +4994,64 @@ msgstr "خطأ أثناء حفظ الإشعار."
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "لا مستخدم كهذا."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "مُشترك ب%s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "ألغِ الاشتراك"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "لست مُشتركًا بأى أحد."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "لست مشتركًا بأحد."
@@ -4833,11 +5061,11 @@ msgstr[3] "أنت مشترك بهؤلاء الأشخاص:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "لا أحد مشترك بك."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "لا أحد مشترك بك."
@@ -4847,11 +5075,11 @@ msgstr[3] "هؤلاء الأشخاص مشتركون بك:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "لست عضوًا فى أى مجموعه."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "لست عضوًا فى أى مجموعه."
@@ -4861,7 +5089,7 @@ msgstr[3] "أنت عضو فى هذه المجموعات:"
 msgstr[4] ""
 msgstr[5] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4875,6 +5103,7 @@ msgid ""
 "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"
@@ -4902,19 +5131,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "اذهب إلى المُثبّت."
 
@@ -5100,23 +5329,23 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr ""
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "نوع ملف غير معروف"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "ميجابايت"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "كيلوبايت"
 
@@ -5320,7 +5549,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "من"
 
@@ -5409,6 +5638,12 @@ msgstr "إلى"
 msgid "Available characters"
 msgstr "المحارف المتوفرة"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "أرسل"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "أرسل إشعارًا"
@@ -5440,48 +5675,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "ش"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "ج"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "ر"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "غ"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "في"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "فى السياق"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
-msgstr "مكرر بواسطة"
+msgstr "متكرر من"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "رُد على هذا الإشعار"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "رُد"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "الإشعار مكرر"
 
@@ -5513,10 +5748,6 @@ msgstr "خطأ أثناء إدراج الملف الشخصى البعيد"
 msgid "Duplicate notice"
 msgstr "ضاعف الإشعار"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "تعذّر إدراج اشتراك جديد."
@@ -5533,6 +5764,10 @@ msgstr "الردود"
 msgid "Favorites"
 msgstr "المفضلات"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "المستخدم"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق الوارد"
@@ -5622,7 +5857,7 @@ msgstr "كرر هذا الإشعار؟"
 msgid "Repeat this notice"
 msgstr "كرر هذا الإشعار"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5642,6 +5877,10 @@ msgstr "ابحث فى الموقع"
 msgid "Keyword(s)"
 msgstr "الكلمات المفتاحية"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "ابحث"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "ابحث فى المساعدة"
@@ -5693,34 +5932,15 @@ msgstr "الأشخاص المشتركون ب%s"
 msgid "Groups %s is a member of"
 msgstr "المجموعات التى %s عضو فيها"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "مُشترك أصلا!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "لقد منعك المستخدم."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "تعذّر الاشتراك."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "ادعُ"
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "غير مشترك!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "لم يمكن حذف اشتراك ذاتى."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "تعذّر حذف الاشتراك."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5771,67 +5991,67 @@ msgstr "عدّل الأفتار"
 msgid "User actions"
 msgstr "تصرفات المستخدم"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "عدّل إعدادات الملف الشخصي"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "عدّل"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "أرسل رساله مباشره إلى هذا المستخدم"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "رسالة"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "قبل دقيقه تقريبًا"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "قبل ساعه تقريبًا"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "قبل سنه تقريبًا"
 
index efe49b56ab42c3adca1750f6f7563cdc7d066c79..abf1998d84ff63d5c9870a911fa6753f38f0ffcb 100644 (file)
@@ -9,77 +9,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:17+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:12+0000\n"
 "Language-Team: Bulgarian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Достъп"
 
-#: actions/accessadminpanel.php:65
-#, fuzzy
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
-msgstr "Ð\97апазване Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° сайта"
+msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойки Ð·Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ сайта"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Регистриране"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Частен"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "Само с покани"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Частен"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Новите регистрации да са само с покани."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Затворен"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Само с покани"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Изключване на новите регистрации."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Запазване"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Затворен"
 
-#: actions/accessadminpanel.php:189
-#, fuzzy
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
-msgstr "Запазване настройките на сайта"
+msgstr "Запазване настройките за достъп"
+
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Запазване"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#. 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 "Няма такака страница."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,78 +98,87 @@ msgstr "Няма такака страница."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Няма такъв потребител"
 
-#: actions/all.php:84
+#. 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 и приятели, страница %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s и приятели"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Емисия с приятелите на %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Емисия с приятелите на %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Емисия с приятелите на %s (Atom)"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Вие и приятелите"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Бележки от %1$s и приятели в %2$s."
@@ -177,20 +191,20 @@ msgstr "Бележки от %1$s и приятели в %2$s."
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Не е открит методът в API."
 
@@ -222,8 +236,9 @@ msgstr "Грешка при обновяване на потребителя."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Потребителят няма профил."
 
@@ -247,7 +262,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -365,7 +380,7 @@ msgstr "Грешка при изтегляне на общия поток"
 msgid "Could not find target user."
 msgstr "Целевият потребител не беше открит."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -373,62 +388,62 @@ msgstr ""
 "Псевдонимът може да съдържа само малки букви, числа и никакво разстояние "
 "между тях."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Опитайте друг псевдоним, този вече е зает."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Неправилен псевдоним."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Адресът на личната страница не е правилен URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Пълното име е твърде дълго (макс. 255 знака)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Описанието е твърде дълго (до %d символа)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Името на местоположението е твърде дълго (макс. 255 знака)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Неправилен псевдоним: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Псевдонимът \"%s\" вече е зает. Опитайте друг."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -439,15 +454,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Групата не е открита."
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Вече членувате в тази група."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Грешка при проследяване — потребителят не е намерен."
@@ -456,7 +471,7 @@ msgstr "Грешка при проследяване — потребителя
 msgid "You are not a member of this group."
 msgstr "Не членувате в тази група."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Грешка при проследяване — потребителят не е намерен."
@@ -488,7 +503,7 @@ msgstr "Неправилен размер."
 #: 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:309
+#: 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
@@ -497,7 +512,7 @@ msgstr "Неправилен размер."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -532,7 +547,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -555,13 +570,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Сметка"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -638,18 +653,18 @@ msgstr "Неподдържан формат."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Отбелязани като любими от %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Поток на %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +680,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Общ поток на %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -680,17 +695,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "Повторено за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Повторения на %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Бележки с етикет %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Бележки от %1$s в %2$s."
@@ -707,8 +722,7 @@ msgstr "Няма такъв документ."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Няма псевдоним."
 
@@ -720,7 +734,7 @@ msgstr "Няма размер."
 msgid "Invalid size."
 msgstr "Неправилен размер."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Аватар"
@@ -738,30 +752,30 @@ msgid "User without matching profile"
 msgstr "Потребител без съответстващ профил"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Настройки за аватар"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Оригинал"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Преглед"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Изтриване"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Качване"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Изрязване"
 
@@ -769,7 +783,7 @@ msgstr "Изрязване"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Изберете квадратна област от изображението за аватар"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -801,22 +815,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Не"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Да не се блокира този потребител"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Да"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Блокиране на потребителя"
 
@@ -824,40 +838,44 @@ msgstr "Блокиране на потребителя"
 msgid "Failed to save block information."
 msgstr "Грешка при записване данните за блокирането."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Няма такава група"
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "Блокирани за %s"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Блокирани за %s, страница %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 #, fuzzy
 msgid "A list of the users blocked from joining this group."
 msgstr "Списък с потребителите в тази група."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Разблокиране на потребителя от групата"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Разблокиране"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Разблокиране на този потребител"
 
@@ -936,7 +954,7 @@ msgstr "Не членувате в тази група."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Имаше проблем със сесията ви в сайта."
 
@@ -962,12 +980,13 @@ msgstr "Да не се изтрива бележката"
 msgid "Delete this application"
 msgstr "Изтриване на бележката"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Не сте влезли в системата."
@@ -994,7 +1013,7 @@ msgstr "Наистина ли искате да изтриете тази бел
 msgid "Do not delete this notice"
 msgstr "Да не се изтрива бележката"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Изтриване на бележката"
 
@@ -1010,18 +1029,18 @@ msgstr "Може да изтривате само локални потреби
 msgid "Delete user"
 msgstr "Изтриване на потребител"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Изтриване на този потребител"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1127,6 +1146,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Запазване"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1229,36 +1259,35 @@ msgstr "Редактиране на групата %s"
 msgid "You must be logged in to create a group."
 msgstr "За да създавате група, трябва да сте влезли."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "За да редактирате групата, трябва да сте й администратор."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Описанието е твърде дълго (до %d символа)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Грешка при обновяване на групата."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Грешка при отбелязване като любима."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Настройките са запазени."
 
 #: actions/emailsettings.php:60
-#, fuzzy
 msgid "Email settings"
 msgstr "Настройки на е-поща"
 
@@ -1297,9 +1326,8 @@ msgid "Cancel"
 msgstr "Отказ"
 
 #: actions/emailsettings.php:121
-#, fuzzy
 msgid "Email address"
-msgstr "Адреси на е-поща"
+msgstr "Адрес на е-поща"
 
 #: actions/emailsettings.php:123
 msgid "Email address, like \"UserName@example.org\""
@@ -1596,7 +1624,7 @@ msgstr "Потребителят вече е блокиран за групат
 msgid "User is not a member of group."
 msgstr "Потребителят не членува в групата."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Блокиране на потребителя"
@@ -1631,92 +1659,92 @@ msgstr "Липсва ID."
 msgid "You must be logged in to edit a group."
 msgstr "За да редактирате група, трябва да сте влезли."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "Групи"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Грешка при обновяване на потребителя."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Настройките са запазени."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Лого на групата"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, fuzzy, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "Може да качите лого за групата ви."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Потребител без съответстващ профил"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 #, fuzzy
 msgid "Pick a square area of the image to be the logo."
 msgstr "Изберете квадратна област от изображението за аватар"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Лотого е обновено."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Неуспешно обновяване на логото."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Членове на групата %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Членове на групата %s, страница %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Списък с потребителите в тази група."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Настройки"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Блокиране"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 #, fuzzy
 msgid "Make user an admin of the group"
 msgstr "За да редактирате групата, трябва да сте й администратор."
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Бележки от %1$s в %2$s."
@@ -1971,16 +1999,19 @@ msgstr "Лично съобщение"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Може да добавите и лично съобщение към поканата."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Прати"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s ви кани да ползвате заедно %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2041,7 +2072,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "За да се присъедините към група, трябва да сте влезли."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Няма псевдоним."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s се присъедини към групата %s"
@@ -2050,11 +2086,11 @@ msgstr "%s се присъедини към групата %s"
 msgid "You must be logged in to leave a group."
 msgstr "За напуснете група, трябва да сте влезли."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Не членувате в тази група."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s напусна групата %2$s"
@@ -2072,14 +2108,13 @@ msgstr "Грешно име или парола."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Забранено."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Вход"
 
 #: actions/login.php:227
 msgid "Login to site"
-msgstr ""
+msgstr "Вход в сайта"
 
 #: actions/login.php:236 actions/register.php:478
 msgid "Remember me"
@@ -2327,8 +2362,8 @@ msgstr "вид съдържание "
 msgid "Only "
 msgstr "Само "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Неподдържан формат на данните"
 
@@ -2474,7 +2509,7 @@ msgstr "Грешка при запазване на новата парола."
 msgid "Password saved."
 msgstr "Паролата е записана."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Пътища"
 
@@ -2507,7 +2542,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Сайт"
 
@@ -2677,7 +2711,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "От 1 до 64 малки букви или цифри, без пунктоация и интервали"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Пълно име"
@@ -2705,7 +2739,7 @@ msgid "Bio"
 msgstr "За мен"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2771,24 +2805,25 @@ msgstr "Името на езика е твърде дълго (може да е
 msgid "Invalid tag: \"%s\""
 msgstr "Неправилен етикет: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Грешка при запазване етикетите."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Грешка при запазване на профила."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Грешка при запазване етикетите."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Настройките са запазени."
 
@@ -2801,45 +2836,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Грешка при изтегляне на общия поток"
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Общ поток, страница %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Общ поток"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Емисия на общия поток (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Емисия на общия поток (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Емисия на общия поток (Atom)"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2848,7 +2883,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3021,8 +3056,7 @@ msgstr "Грешка в кода за потвърждение."
 msgid "Registration successful"
 msgstr "Записването е успешно."
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Регистриране"
 
@@ -3168,7 +3202,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Адрес на профила ви в друга, съвместима услуга за микроблогване"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Абониране"
 
@@ -3206,7 +3240,7 @@ msgstr "Не можете да повтаряте собствена бележ
 msgid "You already repeated that notice."
 msgstr "Вече сте повторили тази бележка."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3214,47 +3248,47 @@ msgstr "Повторено"
 msgid "Repeated!"
 msgstr "Повторено!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Отговори на %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Отговори до %1$s в %2$s!"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Емисия с отговори на %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Емисия с отговори на %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Емисия с отговори на %s (Atom)"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3267,9 +3301,8 @@ msgid "Replies to %1$s on %2$s!"
 msgstr "Отговори до %1$s в %2$s!"
 
 #: actions/rsd.php:146 actions/version.php:157
-#, fuzzy
 msgid "StatusNet"
-msgstr "Бележката е изтрита."
+msgstr "StatusNet"
 
 #: actions/sandbox.php:65 actions/unsandbox.php:65
 #, fuzzy
@@ -3282,7 +3315,6 @@ msgid "User is already sandboxed."
 msgstr "Потребителят ви е блокирал."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Сесии"
 
@@ -3308,7 +3340,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Запазване настройките на сайта"
 
@@ -3340,7 +3372,7 @@ msgstr "Организация"
 msgid "Description"
 msgstr "Описание"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Статистики"
@@ -3403,35 +3435,35 @@ msgstr "Любими бележки на %1$s, страница %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Грешка при изтегляне на любимите бележки"
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Емисия с приятелите на %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Емисия с приятелите на %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Емисия с приятелите на %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3439,7 +3471,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Така можете да споделите какво харесвате."
 
@@ -3453,67 +3485,67 @@ msgstr "Група %s"
 msgid "%1$s group, page %2$d"
 msgstr "Членове на групата %s, страница %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Профил на групата"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Бележка"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Псевдоними"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Изходяща кутия за %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Членове"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Всички членове"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Създадена на"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3523,7 +3555,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3532,7 +3564,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Администратори"
 
@@ -3564,9 +3596,9 @@ msgid " tagged %s"
 msgstr "Бележки с етикет %s"
 
 #: actions/showstream.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s, page %2$d"
-msgstr "Блокирани за %s, страница %d"
+msgstr "%1$s, страница %2$d"
 
 #: actions/showstream.php:122
 #, fuzzy, php-format
@@ -3785,7 +3817,6 @@ msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
 #: actions/smssettings.php:58
-#, fuzzy
 msgid "SMS settings"
 msgstr "Настройки за SMS"
 
@@ -3816,7 +3847,6 @@ msgid "Enter the code you received on your phone."
 msgstr "Въведете кода, който получихте по телефона."
 
 #: actions/smssettings.php:138
-#, fuzzy
 msgid "SMS phone number"
 msgstr "Телефонен номер за SMS"
 
@@ -3891,16 +3921,27 @@ msgstr "Не е въведен код."
 msgid "You are not subscribed to that profile."
 msgstr "Не сте абонирани за този профил"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Грешка при създаване на нов абонамент."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Не е локален потребител."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Няма такъв файл."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Не сте абонирани за този профил"
+
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "Абониране"
@@ -3961,7 +4002,7 @@ msgstr "Няма хора, чийто бележки четете."
 msgid "These are the people whose notices %s listens to."
 msgstr "Хора, чийто бележки %s чете."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3971,35 +4012,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s не получава ничии бележки."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Бележки с етикет %s, страница %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Емисия с бележки на %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Емисия с бележки на %s"
@@ -4051,7 +4092,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Няма такъв етикет."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Методът в API все още се разработва."
 
@@ -4084,74 +4125,76 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Потребител"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Профил"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Нови потребители"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Всички абонаменти"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Автоматично абониране за всеки, който се абонира за мен (подходящо за "
 "ботове)."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Покани"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Поканите са включени"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4279,9 +4322,8 @@ msgid "%1$s groups, page %2$d"
 msgstr "Членове на групата %s, страница %d"
 
 #: actions/usergroups.php:130
-#, fuzzy
 msgid "Search for more groups"
-msgstr "ТÑ\8aÑ\80Ñ\81ене Ð·Ð° Ñ\85оÑ\80а Ð¸Ð»Ð¸ Ð±ÐµÐ»ÐµÐ¶Ðºи"
+msgstr "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ð¾Ñ\89е Ð³Ñ\80Ñ\83пи"
 
 #: actions/usergroups.php:153
 #, php-format
@@ -4336,7 +4378,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Приставки"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Версия"
 
@@ -4376,6 +4418,11 @@ msgstr "Грешка при обновяване на групата."
 msgid "Group leave failed."
 msgstr "Профил на групата"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Грешка при обновяване на групата."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4394,28 +4441,28 @@ msgstr "Грешка при вмъкване на съобщението."
 msgid "Could not update message with new URI."
 msgstr "Грешка при обновяване на бележката с нов URL-адрес."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Грешка при записване на бележката. Непознат потребител."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4424,43 +4471,75 @@ msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Забранено ви е да публикувате бележки в този сайт."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Грешка в базата от данни — отговор при вмъкването: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Не сте абонирани!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Грешка при изтриване на абонамента."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Грешка при изтриване на абонамента."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добре дошли в %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Грешка при създаване на групата."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Грешка при създаване на нов абонамент."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Грешка при създаване на нов абонамент."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Грешка при създаване на нов абонамент."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Промяна настройките на профила"
@@ -4491,9 +4570,9 @@ msgid "Other options"
 msgstr "Други настройки"
 
 #: 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"
@@ -4503,124 +4582,192 @@ msgstr "Неозаглавена страница"
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Начало"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Лично"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Промяна на поща, аватар, парола, профил"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Свързване"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Сметка"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Свързване към услуги"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Свързване"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Промяна настройките на сайта"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Покани"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Настройки"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Поканете приятели и колеги да се присъединят към вас в %s"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Изход"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Покани"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Излизане от сайта"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Изход"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Създаване на нова сметка"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Регистриране"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Влизане в сайта"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Помощ"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Вход"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Помощ"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Търсене"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Помощ"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Търсене за хора или бележки"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Търсене"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "Нова бележка"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "Нова бележка"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Абонаменти"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Помощ"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Относно"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Въпроси"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Условия"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Поверителност"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Изходен код"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Табелка"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Лиценз на програмата StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4629,12 +4776,12 @@ msgstr ""
 "**%%site.name%%** е услуга за микроблогване, предоставена ви от [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** е услуга за микроблогване. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4645,100 +4792,165 @@ msgstr ""
 "достъпна под [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Лиценз на съдържанието"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Всички "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "лиценз."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Страниране"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "След"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Преди"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Не можете да променяте този сайт."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Записването не е позволено."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Командата все още не се поддържа."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Командата все още не се поддържа."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Грешка при записване настройките за Twitter"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Основна настройка на сайта"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Сайт"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Настройка на оформлението"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Версия"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Настройка на пътищата"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Потребител"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Настройка на оформлението"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Настройка на пътищата"
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Настройка на оформлението"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Сесии"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4833,12 +5045,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Паролата е записана."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Паролата е записана."
@@ -4993,80 +5205,89 @@ msgstr "Грешка при записване на бележката."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Уточнете името на потребителя, за когото се абонирате."
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Няма такъв потребител"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Абонирани сте за %s."
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Уточнете името на потребителя, от когото се отписвате."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Отписани сте от %s."
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Командата все още не се поддържа."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Уведомлението е изключено."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Грешка при изключване на уведомлението."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Уведомлението е включено."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Грешка при включване на уведомлението."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Отписани сте от %s."
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Не сте абонирани за никого."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Вече сте абонирани за следните потребители:"
 msgstr[1] "Вече сте абонирани за следните потребители:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Никой не е абониран за вас."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Грешка при абониране на друг потребител за вас."
 msgstr[1] "Грешка при абониране на друг потребител за вас."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Не членувате в нито една група."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Не членувате в тази група."
 msgstr[1] "Не членувате в тази група."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5080,6 +5301,7 @@ msgid ""
 "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"
@@ -5107,19 +5329,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Не е открит файл с настройки. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Влизане в сайта"
@@ -5311,24 +5533,24 @@ msgstr "Системна грешка при качване на файл."
 msgid "Not an image or corrupt file."
 msgstr "Файлът не е изображение или е повреден."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Форматът на файла с изображението не се поддържа."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Няма такава бележка."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Неподдържан вид файл"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5542,7 +5764,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "от"
 
@@ -5632,6 +5854,12 @@ msgstr "До"
 msgid "Available characters"
 msgstr "Налични знаци"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Прати"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Изпращане на бележка"
@@ -5665,48 +5893,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "С"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "Ю"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "И"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "З"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "в контекст"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Повторено от"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Отговаряне на тази бележка"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Отговор"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Бележката е повторена."
 
@@ -5739,11 +5967,6 @@ msgstr "Грешка при вмъкване на отдалечен профи
 msgid "Duplicate notice"
 msgstr "Изтриване на бележката"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Потребителят е забранил да се абонирате за него."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Грешка при добавяне на нов абонамент."
@@ -5760,6 +5983,10 @@ msgstr "Отговори"
 msgid "Favorites"
 msgstr "Любими"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Потребител"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Входящи"
@@ -5852,7 +6079,7 @@ msgstr "Повтаряне на тази бележка"
 msgid "Repeat this notice"
 msgstr "Повтаряне на тази бележка"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5875,6 +6102,10 @@ msgstr "Търсене"
 msgid "Keyword(s)"
 msgstr "Ключови думи"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Търсене"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -5927,35 +6158,14 @@ msgstr "Абонирани за %s"
 msgid "Groups %s is a member of"
 msgstr "Групи, в които участва %s"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Потребителят ви е блокирал."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Грешка при абониране."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Грешка при абониране на друг потребител за вас."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Не сте абонирани!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Грешка при изтриване на абонамента."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Покани"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Грешка при изтриване на абонамента."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Поканете приятели и колеги да се присъединят към вас в %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6009,67 +6219,67 @@ msgstr "Редактиране на аватара"
 msgid "User actions"
 msgstr "Потребителски действия"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Редактиране на профила"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Редактиране"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Изпращате на пряко съобщение до този потребител."
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Съобщение"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "преди няколко секунди"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "преди около минута"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "преди около %d минути"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "преди около час"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "преди около %d часа"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "преди около ден"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "преди около %d дни"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "преди около месец"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "преди около %d месеца"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "преди около година"
 
index d0b228c08c882cf30adebb270e4dc2949fac6453..8b12f44a94181b556cf327f54d2c8a68da275411 100644 (file)
@@ -10,80 +10,87 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:20+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:15+0000\n"
 "Language-Team: Catalan\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Accés"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Desa els paràmetres del lloc"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Registre"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privat"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr ""
 "Voleu prohibir als usuaris anònims (que no han iniciat cap sessió) "
 "visualitzar el lloc?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Només invitació"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privat"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Fes que el registre sigui només amb invitacions."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Tancat"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Només invitació"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Inhabilita els nous registres."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Guardar"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Tancat"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Desa els paràmetres del lloc"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Guardar"
+
+#. 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 "No existeix la pàgina."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -97,46 +104,53 @@ msgstr "No existeix la pàgina."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "No existeix aquest usuari."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s perfils blocats, pàgina %d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s i amics"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Canal dels amics de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Canal dels amics de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Canal dels amics de %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -144,33 +158,35 @@ msgstr ""
 "Aquesta és la línia temporal de %s i amics, però ningú hi ha enviat res "
 "encara."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Un mateix i amics"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Actualitzacions de %1$s i amics a %2$s!"
@@ -183,20 +199,20 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "No s'ha trobat el mètode API!"
@@ -230,8 +246,9 @@ msgstr "No s'ha pogut actualitzar l'usuari."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "L'usuari no té perfil."
 
@@ -256,7 +273,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -377,7 +394,7 @@ msgstr "No s'ha pogut determinar l'usuari d'origen."
 msgid "Could not find target user."
 msgstr "No es pot trobar cap estatus."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -385,62 +402,62 @@ msgstr ""
 "El sobrenom ha de tenir només lletres minúscules i números i no pot tenir "
 "espais."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Aquest sobrenom ja existeix. Prova un altre. "
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Sobrenom no vàlid."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "La pàgina personal no és un URL vàlid."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "El teu nom és massa llarg (màx. 255 caràcters)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "La descripció és massa llarga (màx. %d caràcters)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "La ubicació és massa llarga (màx. 255 caràcters)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Hi ha massa àlies! Màxim %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "L'àlies no és vàlid «%s»"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "L'àlies «%s» ja està en ús. Proveu-ne un altre."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "L'àlies no pot ser el mateix que el sobrenom."
@@ -451,15 +468,15 @@ msgstr "L'àlies no pot ser el mateix que el sobrenom."
 msgid "Group not found!"
 msgstr "No s'ha trobat el grup!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Ja sou membre del grup."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "L'administrador us ha blocat del grup."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "No s'ha pogut afegir l'usuari %s al grup %s."
@@ -468,7 +485,7 @@ msgstr "No s'ha pogut afegir l'usuari %s al grup %s."
 msgid "You are not a member of this group."
 msgstr "No sou un membre del grup."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "No s'ha pogut suprimir l'usuari %s del grup %s."
@@ -500,7 +517,7 @@ msgstr "Mida invàlida."
 #: 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:309
+#: 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
@@ -509,7 +526,7 @@ msgstr "Mida invàlida."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -546,7 +563,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -569,13 +586,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Compte"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -655,18 +672,18 @@ msgstr "El format no està implementat."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Preferits de %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s línia temporal"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -682,12 +699,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s línia temporal pública"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s notificacions de tots!"
@@ -697,17 +714,17 @@ msgstr "%s notificacions de tots!"
 msgid "Repeated to %s"
 msgstr "Respostes a %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Repeticions de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Aviso etiquetats amb %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualitzacions etiquetades amb %1$s el %2$s!"
@@ -723,8 +740,7 @@ msgstr "No existeix l'adjunció."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Cap sobrenom."
 
@@ -736,7 +752,7 @@ msgstr "Cap mida."
 msgid "Invalid size."
 msgstr "Mida invàlida."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -754,30 +770,30 @@ msgid "User without matching profile"
 msgstr "Usuari sense perfil coincident"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Configuració de l'avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Vista prèvia"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Suprimeix"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Puja"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Retalla"
 
@@ -787,7 +803,7 @@ msgstr ""
 "Selecciona un quadrat de l'àrea de la imatge que vols que sigui el teu "
 "avatar."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "S'ha perdut el nostre fitxer de dades."
 
@@ -819,22 +835,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "No bloquis l'usuari"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Sí"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Bloquejar aquest usuari"
 
@@ -842,40 +858,44 @@ msgstr "Bloquejar aquest usuari"
 msgid "Failed to save block information."
 msgstr "Error al guardar la informació del block."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "No s'ha trobat el grup."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s perfils blocats"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s perfils blocats, pàgina %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 #, fuzzy
 msgid "A list of the users blocked from joining this group."
 msgstr "La llista dels usuaris d'aquest grup."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Desbloca l'usuari del grup"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Desbloca"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Desbloca l'usuari"
 
@@ -954,7 +974,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Ha ocorregut algun problema amb la teva sessió."
 
@@ -980,12 +1000,13 @@ msgstr "No es pot esborrar la notificació."
 msgid "Delete this application"
 msgstr "Eliminar aquesta nota"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "No heu iniciat una sessió."
@@ -1016,7 +1037,7 @@ msgstr "N'estàs segur que vols eliminar aquesta notificació?"
 msgid "Do not delete this notice"
 msgstr "No es pot esborrar la notificació."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Eliminar aquesta nota"
 
@@ -1033,18 +1054,18 @@ msgstr "No pots eliminar l'estatus d'un altre usuari."
 msgid "Delete user"
 msgstr "Suprimeix l'usuari"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Suprimeix l'usuari"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Disseny"
 
@@ -1145,6 +1166,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Guardar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Desa el disseny"
@@ -1247,30 +1279,30 @@ msgstr "Editar el grup %s"
 msgid "You must be logged in to create a group."
 msgstr "Has d'haver entrat per crear un grup."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Has de ser admin per editar aquest grup"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Utilitza aquest formulari per editar el grup."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "la descripció és massa llarga (màx. %d caràcters)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "No s'ha pogut actualitzar el grup."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "No s'han pogut crear els àlies."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Configuració guardada."
 
@@ -1614,7 +1646,7 @@ msgstr "Un usuari t'ha bloquejat."
 msgid "User is not a member of group."
 msgstr "L'usuari no és membre del grup."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Bloca l'usuari del grup"
 
@@ -1649,11 +1681,11 @@ msgstr "No ID"
 msgid "You must be logged in to edit a group."
 msgstr "Heu d'iniciar una sessió per editar un grup."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Disseny de grup"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1661,77 +1693,77 @@ msgstr ""
 "Personalitzeu l'aspecte del vostre grup amb una imatge de fons i una paleta "
 "de colors de la vostra elecció."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "No s'ha pogut actualitzar el vostre disseny."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "S'han desat les preferències de disseny."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo del grup"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, fuzzy, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "Pots pujar una imatge de logo per al grup."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Usuari sense perfil coincident"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Trieu una àrea quadrada de la imatge perquè en sigui el logotip."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo actualitzat."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Error en actualitzar logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s membre/s en el grup"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%s membre/s en el grup, pàgina %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "La llista dels usuaris d'aquest grup."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Admin"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloca"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Fes l'usuari un administrador del grup"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Fes-lo administrador"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Fes l'usuari administrador"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1990,16 +2022,19 @@ msgstr "Missatge personal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Opcionalment pots afegir un missatge a la invitació."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Envia"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, fuzzy, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s t'ha convidat us ha convidat a unir-te al grup %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2060,7 +2095,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Has d'haver entrat per participar en un grup."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Cap sobrenom."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s s'ha unit al grup %2$s"
@@ -2069,11 +2109,11 @@ msgstr "%1$s s'ha unit al grup %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Has d'haver entrat per a poder marxar d'un grup."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "No ets membre d'aquest grup."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s ha abandonat el grup %s"
@@ -2091,8 +2131,7 @@ msgstr "Nom d'usuari o contrasenya incorrectes."
 msgid "Error setting user. You are probably not authorized."
 msgstr "No autoritzat."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Inici de sessió"
 
@@ -2214,9 +2253,9 @@ msgid "Message sent"
 msgstr "S'ha enviat el missatge"
 
 #: actions/newmessage.php:185
-#, fuzzy, php-format
+#, php-format
 msgid "Direct message to %s sent."
-msgstr "Missatge directe per a %s enviat"
+msgstr "S'ha enviat un missatge directe a %s."
 
 #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170
 msgid "Ajax Error"
@@ -2294,9 +2333,8 @@ msgid "You must be logged in to list your applications."
 msgstr "Heu d'iniciar una sessió per editar un grup."
 
 #: actions/oauthappssettings.php:74
-#, fuzzy
 msgid "OAuth applications"
-msgstr "Altres opcions"
+msgstr "Aplicacions OAuth"
 
 #: actions/oauthappssettings.php:85
 msgid "Applications you have registered"
@@ -2316,9 +2354,8 @@ msgid "You have allowed the following applications to access you account."
 msgstr ""
 
 #: actions/oauthconnectionssettings.php:175
-#, fuzzy
 msgid "You are not a user of that application."
-msgstr "No ets membre d'aquest grup."
+msgstr "No sou usuari de l'aplicació."
 
 #: actions/oauthconnectionssettings.php:186
 msgid "Unable to revoke access for app: "
@@ -2350,8 +2387,8 @@ msgstr "tipus de contingut "
 msgid "Only "
 msgstr "Només "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Format de data no suportat."
 
@@ -2364,9 +2401,8 @@ msgid "Notice Search"
 msgstr "Cerca de notificacions"
 
 #: actions/othersettings.php:60
-#, fuzzy
 msgid "Other settings"
-msgstr "Altres configuracions"
+msgstr "Altres paràmetres"
 
 #: actions/othersettings.php:71
 msgid "Manage various other options."
@@ -2398,9 +2434,8 @@ msgstr ""
 "El servei d'auto-escurçament d'URL és massa llarga (màx. 50 caràcters)."
 
 #: actions/otp.php:69
-#, fuzzy
 msgid "No user ID specified."
-msgstr "No s'ha especificat cap grup."
+msgstr "No s'ha especificat cap ID d'usuari."
 
 #: actions/otp.php:83
 #, fuzzy
@@ -2499,7 +2534,7 @@ msgstr "No es pot guardar la nova contrasenya."
 msgid "Password saved."
 msgstr "Contrasenya guardada."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Camins"
 
@@ -2532,7 +2567,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Lloc"
 
@@ -2707,7 +2741,7 @@ msgstr ""
 "1-64 lletres en minúscula o números, sense signes de puntuació o espais"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nom complet"
@@ -2736,7 +2770,7 @@ msgid "Bio"
 msgstr "Biografia"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2804,23 +2838,24 @@ msgstr "L'idioma és massa llarg (màx 50 caràcters)."
 msgid "Invalid tag: \"%s\""
 msgstr "Etiqueta no vàlida: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "No es pot actualitzar l'usuari per autosubscriure."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "No s'han pogut desar les preferències d'ubicació."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "No s'ha pogut guardar el perfil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "No s'han pogut guardar les etiquetes."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Configuració guardada."
 
@@ -2833,28 +2868,28 @@ msgstr "Més enllà del límit de la pàgina (%s)"
 msgid "Could not retrieve public stream."
 msgstr "No s'ha pogut recuperar la conversa pública."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Línia temporal pública, pàgina %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Línia temporal pública"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Flux de canal públic (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Flux de canal públic (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Flux de canal públic (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2863,11 +2898,11 @@ msgstr ""
 "Aquesta és la línia temporal pública de %%site.name%%, però ningú no hi ha "
 "enviat res encara."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Sigueu el primer en escriure-hi!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2875,7 +2910,7 @@ msgstr ""
 "Per què no [registreu un compte](%%action.register%%) i sou el primer en "
 "escriure-hi!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2884,7 +2919,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3061,8 +3096,7 @@ msgstr "El codi d'invitació no és vàlid."
 msgid "Registration successful"
 msgstr "Registre satisfactori"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registre"
 
@@ -3210,7 +3244,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subscriure's"
 
@@ -3253,7 +3287,7 @@ msgstr "No pots registrar-te si no estàs d'acord amb la llicència."
 msgid "You already repeated that notice."
 msgstr "Ja heu blocat l'usuari."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repetit"
 
@@ -3261,33 +3295,33 @@ msgstr "Repetit"
 msgid "Repeated!"
 msgstr "Repetit!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Respostes a %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Respostes a %1$s el %2$s!"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Feed d'avisos de %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Feed d'avisos de %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Feed d'avisos de %s"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3296,14 +3330,14 @@ msgstr ""
 "Aquesta és la línia temporal de %s i amics, però ningú hi ha enviat res "
 "encara."
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3331,7 +3365,6 @@ msgid "User is already sandboxed."
 msgstr "Un usuari t'ha bloquejat."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessions"
 
@@ -3357,7 +3390,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Desa els paràmetres del lloc"
 
@@ -3390,7 +3423,7 @@ msgstr "Paginació"
 msgid "Description"
 msgstr "Descripció"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Estadístiques"
@@ -3453,35 +3486,35 @@ msgstr "%s's notes favorites"
 msgid "Could not retrieve favorite notices."
 msgstr "No s'han pogut recuperar els avisos preferits."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed per a amics de %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed per a amics de %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed per a amics de %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3489,7 +3522,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "És una forma de compartir allò que us agrada."
 
@@ -3503,67 +3536,67 @@ msgstr "%s grup"
 msgid "%1$s group, page %2$d"
 msgstr "%s membre/s en el grup, pàgina %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Perfil del grup"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Avisos"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Àlies"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Accions del grup"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed d'avisos del grup %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Safata de sortida per %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membres"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Cap)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Tots els membres"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "S'ha creat"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3573,7 +3606,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3584,7 +3617,7 @@ msgstr ""
 "**%s** és un grup d'usuaris a %%%%site.name%%%%, un servei de [microblogging]"
 "(http://ca.wikipedia.org/wiki/Microblogging)"
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administradors"
 
@@ -3949,15 +3982,26 @@ msgstr "No hi ha cap codi entrat"
 msgid "You are not subscribed to that profile."
 msgstr "No estàs subscrit a aquest perfil."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "No s'ha pogut guardar la subscripció."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "No existeix aquest usuari."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "No existeix el fitxer."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "No estàs subscrit a aquest perfil."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subscrit"
 
@@ -4021,7 +4065,7 @@ msgstr "Aquestes són les persones que escoltes."
 msgid "These are the people whose notices %s listens to."
 msgstr "Aquestes són les persones que %s escolta."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4031,35 +4075,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s no escolta a ningú."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Usuaris que s'han etiquetat %s - pàgina %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Feed d'avisos de %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Feed d'avisos de %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Feed d'avisos de %s"
@@ -4116,7 +4160,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "No existeix aquesta etiqueta."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Mètode API en construcció."
 
@@ -4147,70 +4191,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Usuari"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Perfil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Límit de la biografia"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Límit màxim de la biografia d'un perfil (en caràcters)."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Usuaris nous"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Benvinguda als usuaris nous"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Subscripció per defecte"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Subscriviu automàticament els usuaris nous a aquest usuari."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Invitacions"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "S'han habilitat les invitacions"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4396,7 +4442,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Connectors"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Sessions"
@@ -4438,6 +4484,11 @@ msgstr "No s'ha pogut actualitzar el grup."
 msgid "Group leave failed."
 msgstr "Perfil del grup"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "No s'ha pogut actualitzar el grup."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4455,28 +4506,28 @@ msgstr "No s'ha pogut inserir el missatge."
 msgid "Could not update message with new URI."
 msgstr "No s'ha pogut inserir el missatge amb la nova URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Hashtag de l'error de la base de dades:%s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema al guardar la notificació. Usuari desconegut."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4485,42 +4536,73 @@ msgstr ""
 "Masses notificacions massa ràpid; pren un respir i publica de nou en uns "
 "minuts."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Ha estat bandejat de publicar notificacions en aquest lloc."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Error de BD en inserir resposta: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Se us ha banejat la subscripció."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Ja hi esteu subscrit!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Un usuari t'ha bloquejat."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "No estàs subscrit!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "No s'ha pogut eliminar la subscripció."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "No s'ha pogut eliminar la subscripció."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Us donem la benvinguda a %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "No s'ha pogut crear el grup."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "No s'ha pogut establir la pertinença d'aquest grup."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "No s'ha pogut establir la pertinença d'aquest grup."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "No s'ha pogut guardar la subscripció."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Canvieu els paràmetres del vostre perfil"
@@ -4563,121 +4645,190 @@ msgstr "Pàgina sense titol"
 msgid "Primary site navigation"
 msgstr "Navegació primària del lloc"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Inici"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil personal i línia temporal dels amics"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Canviar correu electrònic, avatar, contrasenya, perfil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Connexió"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Compte"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "No s'ha pogut redirigir al servidor: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Connexió"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Canvia la configuració del lloc"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Convida"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Admin"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Finalitza la sessió"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Convida"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Finalitza la sessió del lloc"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Finalitza la sessió"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crea un compte"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registre"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Inicia una sessió al lloc"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Ajuda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Inici de sessió"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajuda'm"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Cerca"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Ajuda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cerca gent o text"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Cerca"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Avís del lloc"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Vistes locals"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Notificació pàgina"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navegació del lloc secundària"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Ajuda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Quant a"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Preguntes més freqüents"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privadesa"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Font"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contacte"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Insígnia"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Llicència del programari StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4686,12 +4837,12 @@ msgstr ""
 "**%%site.name%%** és un servei de microblogging de [%%site.broughtby%%**](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** és un servei de microblogging."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4702,100 +4853,165 @@ msgstr ""
 "%s, disponible sota la [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Llicència de contingut del lloc"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Tot "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "llicència."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginació"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Posteriors"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Anteriors"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "No podeu fer canvis al lloc."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Registre no permès."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Comanda encara no implementada."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Comanda encara no implementada."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "No s'ha pogut guardar la teva configuració de Twitter!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configuració bàsica del lloc"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Lloc"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configuració del disseny"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Disseny"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Configuració dels camins"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Usuari"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Configuració del disseny"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configuració dels camins"
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Configuració del disseny"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessions"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4890,11 +5106,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr "Etiquetes de l'adjunció"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "El canvi de contrasenya ha fallat"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Contrasenya canviada."
@@ -5048,82 +5264,91 @@ msgstr "Problema en guardar l'avís."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Especifica el nom de l'usuari a que vols subscriure't"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "No existeix aquest usuari."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Subscrit a %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Especifica el nom de l'usuari del que vols deixar d'estar subscrit"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Has deixat d'estar subscrit a %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Comanda encara no implementada."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificacions off."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "No es poden posar en off les notificacions."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificacions on."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "No es poden posar en on les notificacions."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Has deixat d'estar subscrit a %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "No estàs subscrit a aquest perfil."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Ja estàs subscrit a aquests usuaris:"
 msgstr[1] "Ja estàs subscrit a aquests usuaris:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "No pots subscriure a un altre a tu mateix."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "No pots subscriure a un altre a tu mateix."
 msgstr[1] "No pots subscriure a un altre a tu mateix."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "No sou membre de cap grup."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Sou un membre d'aquest grup:"
 msgstr[1] "Sou un membre d'aquests grups:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5137,6 +5362,7 @@ msgid ""
 "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"
@@ -5164,19 +5390,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "No s'ha trobat cap fitxer de configuració. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Podeu voler executar l'instal·lador per a corregir-ho."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Vés a l'instal·lador."
 
@@ -5364,23 +5590,23 @@ msgstr "Error del sistema en pujar el fitxer."
 msgid "Not an image or corrupt file."
 msgstr "No és una imatge o és un fitxer corrupte."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Format d'imatge no suportat."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Hem perdut el nostre arxiu."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tipus de fitxer desconegut"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5600,7 +5826,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "de"
 
@@ -5690,6 +5916,12 @@ msgstr "A"
 msgid "Available characters"
 msgstr "Caràcters disponibles"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Envia"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Enviar notificació"
@@ -5723,49 +5955,49 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "No"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "en context"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Repetit per"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "respondre a aquesta nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Respon"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Notificació publicada"
@@ -5799,10 +6031,6 @@ msgstr "Error en inserir perfil remot"
 msgid "Duplicate notice"
 msgstr "Eliminar nota."
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Se us ha banejat la subscripció."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "No s'ha pogut inserir una nova subscripció."
@@ -5819,6 +6047,10 @@ msgstr "Respostes"
 msgid "Favorites"
 msgstr "Preferits"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Usuari"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Safata d'entrada"
@@ -5911,7 +6143,7 @@ msgstr "Repeteix l'avís"
 msgid "Repeat this notice"
 msgstr "Repeteix l'avís"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5933,6 +6165,10 @@ msgstr "Cerca al lloc"
 msgid "Keyword(s)"
 msgstr "Paraules clau"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Cerca"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Ajuda de la cerca"
@@ -5984,35 +6220,14 @@ msgstr "Persones subscrites a %s"
 msgid "Groups %s is a member of"
 msgstr "%s grups són membres de"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Ja hi esteu subscrit!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Un usuari t'ha bloquejat."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "No pots subscriure."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "No pots subscriure a un altre a tu mateix."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "No estàs subscrit!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "No s'ha pogut eliminar la subscripció."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Convida"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "No s'ha pogut eliminar la subscripció."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Convidar amics i companys perquè participin a %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6065,67 +6280,67 @@ msgstr "Edita l'avatar"
 msgid "User actions"
 msgstr "Accions de l'usuari"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Edita la configuració del perfil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Edita"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Enviar un missatge directe a aquest usuari"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Missatge"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Modera"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "fa pocs segons"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "fa un minut"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fa %d minuts"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "fa una hora"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "fa %d hores"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "fa un dia"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "fa %d dies"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "fa un mes"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "fa %d mesos"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "fa un any"
 
index a5d6db6003143267952bd425aa210d553f24ae88..9137d37083598553f46554d547f3ddedacc4e200 100644 (file)
@@ -9,82 +9,88 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:23+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:27+0000\n"
 "Language-Team: Czech\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Přijmout"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Nastavení"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Registrovat"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Soukromí"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 msgid "Invite only"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Žádný takový uživatel."
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Uložit"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Nastavení"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Uložit"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Žádné takové oznámení."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -98,79 +104,88 @@ msgstr "Žádné takové oznámení."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Žádný takový uživatel."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s a přátelé"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s a přátelé"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s a přátelé"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -183,20 +198,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Potvrzující kód nebyl nalezen"
@@ -230,8 +245,9 @@ msgstr "Nelze aktualizovat uživatele"
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Uživatel nemá profil."
 
@@ -256,7 +272,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -373,68 +389,68 @@ msgstr "Nelze aktualizovat uživatele"
 msgid "Could not find target user."
 msgstr "Nelze aktualizovat uživatele"
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Přezdívka může obsahovat pouze malá písmena a čísla bez mezer"
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Přezdívku již někdo používá. Zkuste jinou"
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Není platnou přezdívkou."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Stránka není platnou URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Jméno je moc dlouhé (maximální délka je 255 znaků)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Umístění příliš dlouhé (maximálně 255 znaků)"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Neplatná adresa '%s'"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Přezdívku již někdo používá. Zkuste jinou"
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -446,16 +462,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Žádný požadavek nebyl nalezen!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "Již jste přihlášen"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Nelze přesměrovat na server: %s"
@@ -465,7 +481,7 @@ msgstr "Nelze přesměrovat na server: %s"
 msgid "You are not a member of this group."
 msgstr "Neodeslal jste nám profil"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Nelze vytvořit OpenID z: %s"
@@ -497,7 +513,7 @@ msgstr "Neplatná velikost"
 #: 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:309
+#: 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
@@ -506,7 +522,7 @@ msgstr "Neplatná velikost"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -541,7 +557,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -564,14 +580,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "O nás"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -652,18 +668,18 @@ msgstr "Nepodporovaný formát obrázku."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1 statusů na %2"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -679,12 +695,12 @@ msgstr "%1 statusů na %2"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -694,17 +710,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "Odpovědi na %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Odpovědi na %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Mikroblog od %s"
@@ -722,8 +738,7 @@ msgstr "Žádný takový dokument."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Žádná přezdívka."
 
@@ -735,7 +750,7 @@ msgstr "Žádná velikost"
 msgid "Invalid size."
 msgstr "Neplatná velikost"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Obrázek"
@@ -752,31 +767,31 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 #, fuzzy
 msgid "Avatar settings"
 msgstr "Nastavení"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Odstranit"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Upload"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -784,7 +799,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -818,23 +833,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Ne"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Žádný takový uživatel."
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ano"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Zablokovat tohoto uživatele"
 
@@ -842,41 +857,45 @@ msgstr "Zablokovat tohoto uživatele"
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "Žádné takové oznámení."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Uživatel nemá profil."
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s a přátelé"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "Žádný takový uživatel."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "Žádný takový uživatel."
@@ -957,7 +976,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -983,12 +1002,13 @@ msgstr "Žádné takové oznámení."
 msgid "Delete this application"
 msgstr "Odstranit toto oznámení"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Nepřihlášen"
@@ -1016,7 +1036,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "Žádné takové oznámení."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Odstranit toto oznámení"
 
@@ -1034,18 +1054,18 @@ msgstr "Můžete použít místní odebírání."
 msgid "Delete user"
 msgstr ""
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Odstranit tohoto uživatele"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Vzhled"
 
@@ -1152,6 +1172,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Uložit"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1251,31 +1282,31 @@ msgstr "Upravit %s skupinu"
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "Nelze aktualizovat uživatele"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Nelze uložin informace o obrázku"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Nastavení uloženo."
 
@@ -1619,7 +1650,7 @@ msgstr "Uživatel nemá profil."
 msgid "User is not a member of group."
 msgstr "Neodeslal jste nám profil"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Žádný takový uživatel."
@@ -1655,91 +1686,91 @@ msgstr "Žádné id"
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Nelze aktualizovat uživatele"
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Nastavení uloženo"
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo skupiny"
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Uživatel nemá profil."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "Obrázek nahrán"
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "Nahrávání obrázku selhalo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Mikroblog od %s"
@@ -1993,16 +2024,19 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Odeslat"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2037,7 +2071,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Žádná přezdívka."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2046,12 +2085,12 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "Neodeslal jste nám profil"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1 statusů na %2"
@@ -2069,8 +2108,7 @@ msgstr "Neplatné jméno nebo heslo"
 msgid "Error setting user. You are probably not authorized."
 msgstr "Neautorizován."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Přihlásit"
 
@@ -2319,8 +2357,8 @@ msgstr "Připojit"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2468,7 +2506,7 @@ msgstr "Nelze uložit nové heslo"
 msgid "Password saved."
 msgstr "Heslo uloženo"
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2501,7 +2539,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2684,7 +2721,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 znaků nebo čísel, bez teček, čárek a mezer"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Celé jméno"
@@ -2712,7 +2749,7 @@ msgid "Bio"
 msgstr "O mě"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2776,25 +2813,26 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "Neplatná adresa '%s'"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Nelze uložit profil"
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Nelze uložit profil"
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "Nelze uložit profil"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Nastavení uloženo"
 
@@ -2807,48 +2845,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "Veřejné zprávy"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Veřejné zprávy"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Veřejný Stream Feed"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Veřejný Stream Feed"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Veřejný Stream Feed"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2857,7 +2895,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3030,8 +3068,7 @@ msgstr "Chyba v ověřovacím kódu"
 msgid "Registration successful"
 msgstr "Registrace úspěšná"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrovat"
 
@@ -3161,7 +3198,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Odebírat"
 
@@ -3202,7 +3239,7 @@ msgstr "Nemůžete se registrovat, pokud nesouhlasíte s licencí."
 msgid "You already repeated that notice."
 msgstr "Již jste přihlášen"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Vytvořit"
@@ -3212,47 +3249,47 @@ msgstr "Vytvořit"
 msgid "Repeated!"
 msgstr "Vytvořit"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Odpovědi na %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Odpovědi na %s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3280,7 +3317,6 @@ msgid "User is already sandboxed."
 msgstr "Uživatel nemá profil."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3305,7 +3341,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Nastavení"
@@ -3340,7 +3376,7 @@ msgstr "Umístění"
 msgid "Description"
 msgstr "Odběry"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistiky"
@@ -3401,35 +3437,35 @@ msgstr "%s a přátelé"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed přítel uživatele: %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3437,7 +3473,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3451,70 +3487,70 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "Všechny odběry"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Žádné takové oznámení."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Poznámka"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Feed sdělení pro %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Členem od"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Vytvořit"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3524,7 +3560,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3533,7 +3569,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3890,17 +3926,27 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr "Neodeslal jste nám profil"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Nelze vytvořit odebírat"
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "Žádný takový uživatel."
+msgid "No such profile."
+msgstr "Žádné takové oznámení."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Neodeslal jste nám profil"
+
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "Odebírat"
@@ -3961,7 +4007,7 @@ msgstr "Toto jsou lidé, jejiž sdělením nasloucháte"
 msgid "These are the people whose notices %s listens to."
 msgstr "Toto jsou lidé, jejiž sdělením %s naslouchá"
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3971,36 +4017,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1 od teď naslouchá tvým sdělením v %2"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "Žádné Jabber ID."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Mikroblog od %s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Feed sdělení pro %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Feed sdělení pro %s"
@@ -4054,7 +4100,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Žádné takové oznámení."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -4089,73 +4135,74 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr ""
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Všechny odběry"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "Odběr autorizován"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Umístění"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4342,7 +4389,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Osobní"
@@ -4383,6 +4430,11 @@ msgstr "Nelze aktualizovat uživatele"
 msgid "Group leave failed."
 msgstr "Žádné takové oznámení."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Nelze aktualizovat uživatele"
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4400,70 +4452,102 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Chyba v DB při vkládání odpovědi: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "User has blocked you."
+msgstr "Uživatel nemá profil."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Nepřihlášen!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Nelze smazat odebírání"
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Nelze smazat odebírání"
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "Nelze uložin informace o obrázku"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Nelze vytvořit odebírat"
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Nelze vytvořit odebírat"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Nelze vytvořit odebírat"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4507,126 +4591,188 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Domů"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Osobní"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "Připojit"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "Změnit heslo"
 
-#: lib/action.php:444
+#: lib/action.php:447
 #, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "O nás"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Nelze přesměrovat na server: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Připojit"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Odběry"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
 msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Odhlásit"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Neplatná velikost"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Odhlásit"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Vytvořit nový účet"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrovat"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Nápověda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Přihlásit"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomoci mi!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Hledat"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Nápověda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Hledat"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "Nové sdělení"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "Nové sdělení"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Odběry"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Nápověda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "O nás"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Soukromí"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Zdroj"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4635,12 +4781,12 @@ msgstr ""
 "**%%site.name%%** je služba microblogů, kterou pro vás poskytuje [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** je služba mikroblogů."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4651,102 +4797,165 @@ msgstr ""
 "dostupná pod [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "Nové sdělení"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "« Novější"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "Starší »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Nové sdělení"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Vzhled"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Potvrzení emailové adresy"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Osobní"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4841,12 +5050,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Heslo uloženo"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Heslo uloženo"
@@ -5002,86 +5211,96 @@ msgstr "Problém při ukládání sdělení"
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Žádný takový uživatel."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Odhlásit"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Neodeslal jste nám profil"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Neodeslal jste nám profil"
 msgstr[1] "Neodeslal jste nám profil"
 msgstr[2] ""
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Vzdálený odběr"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Vzdálený odběr"
 msgstr[1] "Vzdálený odběr"
 msgstr[2] ""
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Neodeslal jste nám profil"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Neodeslal jste nám profil"
 msgstr[1] "Neodeslal jste nám profil"
 msgstr[2] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5095,6 +5314,7 @@ msgid ""
 "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"
@@ -5122,20 +5342,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Žádný potvrzující kód."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5329,24 +5549,24 @@ msgstr "Chyba systému při nahrávání souboru"
 msgid "Not an image or corrupt file."
 msgstr "Není obrázkem, nebo jde o poškozený soubor."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Nepodporovaný formát obrázku."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Žádné takové oznámení."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5559,7 +5779,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " od "
@@ -5651,6 +5871,12 @@ msgstr ""
 msgid "Available characters"
 msgstr "6 a více znaků"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Odeslat"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5685,51 +5911,51 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "Žádný obsah!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Vytvořit"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "odpověď"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Sdělení"
@@ -5763,10 +5989,6 @@ msgstr "Chyba při vkládaní vzdáleného profilu"
 msgid "Duplicate notice"
 msgstr "Nové sdělení"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Nelze vložit odebírání"
@@ -5783,6 +6005,10 @@ msgstr "Odpovědi"
 msgid "Favorites"
 msgstr "Oblíbené"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5876,7 +6102,7 @@ msgstr "Odstranit toto oznámení"
 msgid "Repeat this notice"
 msgstr "Odstranit toto oznámení"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5898,6 +6124,10 @@ msgstr "Hledat"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Hledat"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -5952,37 +6182,15 @@ msgstr "Vzdálený odběr"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-#, fuzzy
-msgid "User has blocked you."
-msgstr "Uživatel nemá profil."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Nepřihlášen!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Nelze smazat odebírání"
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Nelze smazat odebírání"
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6035,68 +6243,68 @@ msgstr "Upravit avatar"
 msgid "User actions"
 msgstr "Akce uživatele"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Nastavené Profilu"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Zpráva"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "před pár sekundami"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "asi před minutou"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "asi před %d minutami"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "asi před hodinou"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "asi před %d hodinami"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "asi přede dnem"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "před %d dny"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "asi před měsícem"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "asi před %d mesíci"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "asi před rokem"
 
index b9e53e254444a04219b9a6df253bb389a9976c19..a00ec26113d5a6cbf72548a2e0106fbd0e6d6fef 100644 (file)
@@ -4,6 +4,7 @@
 # Author@translatewiki.net: Lutzgh
 # Author@translatewiki.net: March
 # Author@translatewiki.net: McDutchie
+# Author@translatewiki.net: Michi
 # Author@translatewiki.net: Pill
 # Author@translatewiki.net: Umherirrender
 # --
@@ -13,81 +14,83 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:26+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:31+0000\n"
 "Language-Team: German\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
-#, fuzzy
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
-msgstr "Akzeptieren"
+msgstr "Zugang"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Zugangseinstellungen speichern"
 
-#: actions/accessadminpanel.php:158
-#, fuzzy
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registrieren"
 
-#: actions/accessadminpanel.php:161
-#, fuzzy
-msgid "Private"
-msgstr "Privatsphäre"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr ""
+"Anonymen (nicht eingeloggten) Nutzern das Betrachten der Seite verbieten?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
 #, fuzzy
-msgid "Invite only"
-msgstr "Einladen"
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privat"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
-msgstr ""
+msgstr "Registrierung nur bei vorheriger Einladung erlauben."
 
-#: actions/accessadminpanel.php:173
-#, fuzzy
-msgid "Closed"
-msgstr "Blockieren"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Nur auf Einladung"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
-msgstr ""
+msgstr "Neuregistrierungen deaktivieren."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Speichern"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Geschlossen"
 
-#: actions/accessadminpanel.php:189
-#, fuzzy
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
-msgstr "Site-Einstellungen speichern"
+msgstr "Zugangs-Einstellungen speichern"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Speichern"
+
+#. 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 "Seite nicht vorhanden"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -101,46 +104,53 @@ msgstr "Seite nicht vorhanden"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Unbekannter Benutzer."
 
-#: actions/all.php:84
-#, fuzzy, php-format
+#. 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 "%s blockierte Benutzerprofile, Seite %d"
+msgstr "%1$s und Freunde, Seite% 2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s und Freunde"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed der Freunde von %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed der Freunde von %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed der Freunde von %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -148,7 +158,7 @@ msgstr ""
 "Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas "
 "gepostet."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -157,7 +167,8 @@ msgstr ""
 "Abonniere doch mehr Leute, [tritt einer Gruppe bei](%%action.groups%%) oder "
 "poste selber etwas."
 
-#: actions/all.php:134
+#. 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
 msgid ""
 "You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
@@ -167,7 +178,7 @@ msgstr ""
 "posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit "
 "zu erregen."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -177,12 +188,13 @@ msgstr ""
 "gibst %s dann einen Stups oder postest ihm etwas, um seine Aufmerksamkeit zu "
 "erregen?"
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Du und Freunde"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Aktualisierungen von %1$s und Freunden auf %2$s!"
@@ -195,20 +207,20 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-Methode nicht gefunden."
 
@@ -240,8 +252,9 @@ msgstr "Konnte Benutzerdaten nicht aktualisieren."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Benutzer hat kein Profil."
 
@@ -265,7 +278,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -378,7 +391,7 @@ msgstr "Konnte öffentlichen Stream nicht abrufen."
 msgid "Could not find target user."
 msgstr "Konnte keine Statusmeldungen finden."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -386,63 +399,63 @@ msgstr ""
 "Der Nutzername darf nur aus Kleinbuchstaben und Ziffern bestehen. "
 "Leerzeichen sind nicht erlaubt."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Nutzername wird bereits verwendet. Suche dir einen anderen aus."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Ungültiger Nutzername."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 ""
 "Homepage ist keine gültige URL. URL’s müssen ein Präfix wie http enthalten."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Der vollständige Name ist zu lang (maximal 255 Zeichen)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Der eingegebene Aufenthaltsort ist zu lang (maximal 255 Zeichen)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Zu viele Pseudonyme! Maximale Anzahl ist %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Ungültiger Tag: „%s“"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Nutzername „%s“ wird bereits verwendet. Suche dir einen anderen aus."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias kann nicht das gleiche wie der Spitznamen sein."
@@ -453,15 +466,15 @@ msgstr "Alias kann nicht das gleiche wie der Spitznamen sein."
 msgid "Group not found!"
 msgstr "Gruppe nicht gefunden!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Du bist bereits Mitglied dieser Gruppe"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Der Admin dieser Gruppe hat dich gesperrt."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Konnte Benutzer %s nicht der Gruppe %s hinzufügen."
@@ -470,10 +483,10 @@ msgstr "Konnte Benutzer %s nicht der Gruppe %s hinzufügen."
 msgid "You are not a member of this group."
 msgstr "Du bist kein Mitglied dieser Gruppe."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
-#, fuzzy, php-format
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
+#, php-format
 msgid "Could not remove user %1$s from group %2$s."
-msgstr "Konnte Benutzer %s nicht aus der Gruppe %s entfernen."
+msgstr "Konnte Benutzer %1$s nicht aus der Gruppe %2$s entfernen."
 
 #: actions/apigrouplist.php:95
 #, php-format
@@ -502,7 +515,7 @@ msgstr "Ungültige Größe."
 #: 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:309
+#: 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
@@ -511,7 +524,7 @@ msgstr "Ungültige Größe."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -545,7 +558,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -568,13 +581,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -654,18 +667,18 @@ msgstr "Bildformat wird nicht unterstützt."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Favoriten von %s"
 
-#: actions/apitimelinefavorites.php:120
+#: 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s Zeitleiste"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,12 +694,12 @@ 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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s öffentliche Zeitleiste"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s Nachrichten von allen!"
@@ -696,17 +709,17 @@ msgstr "%s Nachrichten von allen!"
 msgid "Repeated to %s"
 msgstr "Antworten an %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Antworten an %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: 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:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Aktualisierungen mit %1$s getagt auf %2$s!"
@@ -722,8 +735,7 @@ msgstr "Kein solcher Anhang."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Kein Nutzername."
 
@@ -735,7 +747,7 @@ msgstr "Keine Größe."
 msgid "Invalid size."
 msgstr "Ungültige Größe."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -753,30 +765,30 @@ msgid "User without matching profile"
 msgstr "Benutzer ohne passendes Profil"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Avatar-Einstellungen"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Vorschau"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Löschen"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Hochladen"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Zuschneiden"
 
@@ -785,7 +797,7 @@ msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 "Wähle eine quadratische Fläche aus dem Bild, um dein Avatar zu speichern"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Daten verloren."
 
@@ -817,22 +829,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nein"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Diesen Benutzer freigeben"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ja"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Diesen Benutzer blockieren"
 
@@ -840,39 +852,43 @@ msgstr "Diesen Benutzer blockieren"
 msgid "Failed to save block information."
 msgstr "Konnte Blockierungsdaten nicht speichern."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Keine derartige Gruppe."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s blockierte Benutzerprofile"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s blockierte Benutzerprofile, Seite %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Liste der blockierten Benutzer in dieser Gruppe."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Sperrung des Nutzers für die Gruppe aufheben."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Freigeben"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Diesen Benutzer freigeben"
 
@@ -951,7 +967,7 @@ msgstr "Du bist kein Mitglied dieser Gruppe."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Es gab ein Problem mit deinem Sessiontoken."
 
@@ -977,12 +993,13 @@ msgstr "Diese Nachricht nicht löschen"
 msgid "Delete this application"
 msgstr "Nachricht löschen"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Nicht angemeldet."
@@ -1011,7 +1028,7 @@ msgstr "Bist du sicher, dass du diese Nachricht löschen möchtest?"
 msgid "Do not delete this notice"
 msgstr "Diese Nachricht nicht löschen"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Nachricht löschen"
 
@@ -1027,18 +1044,18 @@ msgstr "Du kannst nur lokale Benutzer löschen."
 msgid "Delete user"
 msgstr "Benutzer löschen"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Diesen Benutzer löschen"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1141,6 +1158,17 @@ msgstr "Standard-Design wiederherstellen"
 msgid "Reset back to default"
 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/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 "Speichern"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Design speichern"
@@ -1159,68 +1187,58 @@ msgid "No such document \"%s\""
 msgstr "Unbekanntes Dokument."
 
 #: actions/editapplication.php:54
-#, fuzzy
 msgid "Edit Application"
-msgstr "Sonstige Optionen"
+msgstr "Anwendung bearbeiten"
 
 #: actions/editapplication.php:66
-#, fuzzy
 msgid "You must be logged in to edit an application."
-msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten."
+msgstr "Du musst angemeldet sein, um eine Anwendung zu bearbeiten."
 
 #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166
 #: actions/showapplication.php:87
-#, fuzzy
 msgid "No such application."
-msgstr "Unbekannte Nachricht."
+msgstr "Anwendung nicht bekannt."
 
 #: actions/editapplication.php:161
-#, fuzzy
 msgid "Use this form to edit your application."
-msgstr "Benutze dieses Formular, um die Gruppe zu bearbeiten."
+msgstr "Benutze dieses Formular, um die Anwendung zu bearbeiten."
 
 #: actions/editapplication.php:177 actions/newapplication.php:159
-#, fuzzy
 msgid "Name is required."
-msgstr "Gleiches Passwort wie zuvor. Pflichteingabe."
+msgstr "Name ist erforderlich."
 
 #: actions/editapplication.php:180 actions/newapplication.php:165
-#, fuzzy
 msgid "Name is too long (max 255 chars)."
-msgstr "Der vollständige Name ist zu lang (maximal 255 Zeichen)."
+msgstr "Der Name ist zu lang (maximal 255 Zeichen)."
 
 #: actions/editapplication.php:183 actions/newapplication.php:162
-#, fuzzy
 msgid "Name already in use. Try another one."
-msgstr "Nutzername wird bereits verwendet. Suche dir einen anderen aus."
+msgstr "Der Name wird bereits verwendet. Suche dir einen anderen aus."
 
 #: actions/editapplication.php:186 actions/newapplication.php:168
-#, fuzzy
 msgid "Description is required."
-msgstr "Beschreibung"
+msgstr "Beschreibung ist erforderlich."
 
 #: actions/editapplication.php:194
 msgid "Source URL is too long."
-msgstr ""
+msgstr "Homepage ist zu lang."
 
 #: actions/editapplication.php:200 actions/newapplication.php:185
-#, fuzzy
 msgid "Source URL is not valid."
 msgstr ""
 "Homepage ist keine gültige URL. URL’s müssen ein Präfix wie http enthalten."
 
 #: actions/editapplication.php:203 actions/newapplication.php:188
 msgid "Organization is required."
-msgstr ""
+msgstr "Organisation ist erforderlich. (Pflichtangabe)"
 
 #: actions/editapplication.php:206 actions/newapplication.php:191
-#, fuzzy
 msgid "Organization is too long (max 255 chars)."
-msgstr "Der eingegebene Aufenthaltsort ist zu lang (maximal 255 Zeichen)."
+msgstr "Die angegebene Organisation ist zu lang (maximal 255 Zeichen)."
 
 #: actions/editapplication.php:209 actions/newapplication.php:194
 msgid "Organization homepage is required."
-msgstr ""
+msgstr "Homepage der Organisation ist erforderlich (Pflichtangabe)."
 
 #: actions/editapplication.php:218 actions/newapplication.php:206
 msgid "Callback is too long."
@@ -1244,35 +1262,34 @@ msgstr "Gruppe %s bearbeiten"
 msgid "You must be logged in to create a group."
 msgstr "Du musst angemeldet sein, um eine Gruppe zu erstellen."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Benutze dieses Formular, um die Gruppe zu bearbeiten."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Konnte Gruppe nicht aktualisieren."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Konnte keinen Favoriten erstellen."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Einstellungen gespeichert."
 
 #: actions/emailsettings.php:60
-#, fuzzy
 msgid "Email settings"
 msgstr "E-Mail-Einstellungen"
 
@@ -1311,9 +1328,8 @@ msgid "Cancel"
 msgstr "Abbrechen"
 
 #: actions/emailsettings.php:121
-#, fuzzy
 msgid "Email address"
-msgstr "E-Mail-Adressen"
+msgstr "E-Mail-Adresse"
 
 #: actions/emailsettings.php:123
 msgid "Email address, like \"UserName@example.org\""
@@ -1607,7 +1623,7 @@ msgstr "Dieser Nutzer ist bereits von der Gruppe gesperrt"
 msgid "User is not a member of group."
 msgstr "Nutzer ist kein Mitglied dieser Gruppe."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Benutzerzugang zu der Gruppe blockieren"
 
@@ -1640,30 +1656,30 @@ msgstr "Keine ID"
 msgid "You must be logged in to edit a group."
 msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Gruppen-Design"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Konnte dein Design nicht aktualisieren."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Design-Einstellungen gespeichert."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Gruppen-Logo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1671,58 +1687,58 @@ msgstr ""
 "Du kannst ein Logo für Deine Gruppe hochladen. Die maximale Dateigröße ist %"
 "s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Benutzer ohne passendes Profil"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Wähle eine quadratische Fläche aus dem Bild, um das Logo zu speichern."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo aktualisiert."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Aktualisierung des Logos fehlgeschlagen."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s Gruppen-Mitglieder"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%s Gruppen-Mitglieder, Seite %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Liste der Benutzer in dieser Gruppe."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Admin"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blockieren"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Benutzer zu einem Admin dieser Gruppe ernennen"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Zum Admin ernennen"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Diesen Benutzer zu einem Admin ernennen"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Aktualisierungen von %1$s auf %2$s!"
@@ -1990,16 +2006,19 @@ msgstr ""
 "Wenn du möchtest kannst du zu der Einladung eine persönliche Nachricht "
 "anfügen."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Senden"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s hat Dich eingeladen, auch bei %2$s mitzumachen."
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2059,7 +2078,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Du musst angemeldet sein, um Mitglied einer Gruppe zu werden."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Kein Nutzername."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s ist der Gruppe %s beigetreten"
@@ -2068,11 +2092,11 @@ msgstr "%s ist der Gruppe %s beigetreten"
 msgid "You must be logged in to leave a group."
 msgstr "Du musst angemeldet sein, um aus einer Gruppe auszutreten."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Du bist kein Mitglied dieser Gruppe."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s hat die Gruppe %s verlassen"
@@ -2090,8 +2114,7 @@ msgid "Error setting user. You are probably not authorized."
 msgstr ""
 "Fehler beim setzen des Benutzers. Du bist vermutlich nicht autorisiert."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Anmelden"
 
@@ -2291,9 +2314,8 @@ msgid "You must be logged in to list your applications."
 msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten."
 
 #: actions/oauthappssettings.php:74
-#, fuzzy
 msgid "OAuth applications"
-msgstr "Sonstige Optionen"
+msgstr "OAuth-Anwendungen"
 
 #: actions/oauthappssettings.php:85
 msgid "Applications you have registered"
@@ -2347,8 +2369,8 @@ msgstr "Content-Typ "
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Kein unterstütztes Datenformat."
 
@@ -2386,7 +2408,7 @@ msgstr "Profil-Einstellungen ansehen"
 
 #: actions/othersettings.php:123
 msgid "Show or hide profile designs."
-msgstr ""
+msgstr "Prifil-Designs anzeigen oder verstecken."
 
 #: actions/othersettings.php:153
 msgid "URL shortening service is too long (max 50 chars)."
@@ -2492,7 +2514,7 @@ msgstr "Konnte neues Passwort nicht speichern"
 msgid "Password saved."
 msgstr "Passwort gespeichert."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2525,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Ungültiger SSL-Server. Die maximale Länge ist 255 Zeichen."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Seite"
 
@@ -2535,7 +2556,7 @@ msgstr "Server"
 
 #: actions/pathsadminpanel.php:238
 msgid "Site's server hostname."
-msgstr ""
+msgstr "Server Name der Seite"
 
 #: actions/pathsadminpanel.php:242
 msgid "Path"
@@ -2595,15 +2616,15 @@ msgstr "Avatarverzeichnis"
 
 #: actions/pathsadminpanel.php:301
 msgid "Backgrounds"
-msgstr ""
+msgstr "Hintergrundbilder"
 
 #: actions/pathsadminpanel.php:305
 msgid "Background server"
-msgstr ""
+msgstr "Server für Hintergrundbilder"
 
 #: actions/pathsadminpanel.php:309
 msgid "Background path"
-msgstr ""
+msgstr "Pfad zu den Hintergrundbildern"
 
 #: actions/pathsadminpanel.php:313
 msgid "Background directory"
@@ -2665,20 +2686,20 @@ msgid "Not a valid people tag: %s"
 msgstr "Ungültiger Personen-Tag: %s"
 
 #: actions/peopletag.php:144
-#, fuzzy, php-format
+#, php-format
 msgid "Users self-tagged with %1$s - page %2$d"
-msgstr "Benutzer die sich selbst mit %s getagged haben - Seite %d"
+msgstr "Benutzer die sich selbst mit %1$s getagged haben - Seite %2$d"
 
 #: actions/postnotice.php:84
 msgid "Invalid notice content"
 msgstr "Ungültiger Nachrichteninhalt"
 
 #: actions/postnotice.php:90
-#, fuzzy, php-format
+#, php-format
 msgid "Notice 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 Nachrichtenlizenz '%1$s' ist nicht kompatibel mit der Lizenz der Seite '%"
+"2$s'."
 
 #: actions/profilesettings.php:60
 msgid "Profile settings"
@@ -2700,7 +2721,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 Kleinbuchstaben oder Ziffern, keine Sonder- oder Leerzeichen"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Vollständiger Name"
@@ -2729,7 +2750,7 @@ msgid "Bio"
 msgstr "Biografie"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2741,7 +2762,7 @@ msgstr "Wo du bist, beispielsweise „Stadt, Gebiet, Land“"
 
 #: actions/profilesettings.php:138
 msgid "Share my current location when posting notices"
-msgstr ""
+msgstr "Teile meine aktuelle Position wenn ich Nachrichten sende"
 
 #: actions/profilesettings.php:145 actions/tagother.php:149
 #: actions/tagother.php:209 lib/subscriptionlist.php:106
@@ -2797,75 +2818,77 @@ msgstr "Die eingegebene Sprache ist zu lang (maximal 50 Zeichen)"
 msgid "Invalid tag: \"%s\""
 msgstr "Ungültiger Tag: „%s“"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Autosubscribe konnte nicht aktiviert werden."
 
-#: actions/profilesettings.php:359
-#, fuzzy
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
-msgstr "Konnte Tags nicht speichern."
+msgstr "Konnte Positions-Einstellungen nicht speichern."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Konnte Profil nicht speichern."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Konnte Tags nicht speichern."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Einstellungen gespeichert."
 
 #: actions/public.php:83
 #, php-format
 msgid "Beyond the page limit (%s)"
-msgstr ""
+msgstr "Jenseits des Seitenlimits (%s)"
 
 #: actions/public.php:92
 msgid "Could not retrieve public stream."
 msgstr "Konnte öffentlichen Stream nicht abrufen."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Öffentliche Zeitleiste, Seite %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Öffentliche Zeitleiste"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Feed des öffentlichen Streams (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Feed des öffentlichen Streams (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Feed des öffentlichen Streams (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
 "yet."
 msgstr ""
+"Dies ist die öffentliche Zeitlinie von %%site.name%% es wurde allerdings "
+"noch nichts gepostet."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
-msgstr ""
+msgstr "Sei der erste der etwas schreibt!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2874,7 +2897,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2898,6 +2921,8 @@ msgstr "Das sind die beliebtesten Tags auf %s "
 #, 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."
 
 #: actions/publictagcloud.php:72
 msgid "Be the first to post one!"
@@ -3048,8 +3073,7 @@ msgstr "Entschuldigung, ungültiger Bestätigungscode."
 msgid "Registration successful"
 msgstr "Registrierung erfolgreich"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrieren"
 
@@ -3200,7 +3224,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Abonnieren"
 
@@ -3238,7 +3262,7 @@ msgstr "Du kannst deine eigene Nachricht nicht wiederholen."
 msgid "You already repeated that notice."
 msgstr "Du hast diesen Benutzer bereits blockiert."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Erstellt"
@@ -3248,33 +3272,33 @@ msgstr "Erstellt"
 msgid "Repeated!"
 msgstr "Erstellt"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Antworten an %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Antworten an %1$s, Seite %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Feed der Antworten an %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Feed der Antworten an %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Feed der Nachrichten von %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3283,14 +3307,14 @@ msgstr ""
 "Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas "
 "gepostet."
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, fuzzy, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3320,7 +3344,6 @@ msgid "User is already sandboxed."
 msgstr "Dieser Benutzer hat dich blockiert."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3346,7 +3369,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Site-Einstellungen speichern"
 
@@ -3366,9 +3389,8 @@ msgstr ""
 
 #: actions/showapplication.php:169 actions/version.php:195
 #: lib/applicationeditform.php:195
-#, fuzzy
 msgid "Name"
-msgstr "Nutzername"
+msgstr "Name"
 
 #: actions/showapplication.php:178 lib/applicationeditform.php:222
 #, fuzzy
@@ -3380,7 +3402,7 @@ msgstr "Seitenerstellung"
 msgid "Description"
 msgstr "Beschreibung"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistiken"
@@ -3443,35 +3465,35 @@ msgstr "%ss favorisierte Nachrichten"
 msgid "Could not retrieve favorite notices."
 msgstr "Konnte Favoriten nicht abrufen."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed der Freunde von %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed der Freunde von %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed der Freunde von %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3479,9 +3501,9 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
-msgstr ""
+msgstr "Dies ist ein Weg Dinge zu teilen die dir gefallen."
 
 #: actions/showgroup.php:82 lib/groupnav.php:86
 #, php-format
@@ -3493,67 +3515,67 @@ msgstr "%s Gruppe"
 msgid "%1$s group, page %2$d"
 msgstr "%s Gruppen-Mitglieder, Seite %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Gruppenprofil"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Nachricht"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Gruppenaktionen"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Nachrichtenfeed der Gruppe %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Nachrichtenfeed der Gruppe %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Nachrichtenfeed der Gruppe %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Postausgang von %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Mitglieder"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Kein)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Alle Mitglieder"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Erstellt"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3563,7 +3585,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3576,7 +3598,7 @@ msgstr ""
 "Freien Software [StatusNet](http://status.net/). Seine Mitglieder erstellen "
 "kurze Nachrichten über Ihr Leben und Interessen. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administratoren"
 
@@ -3681,35 +3703,32 @@ msgstr ""
 "Software [StatusNet](http://status.net/). "
 
 #: actions/showstream.php:305
-#, fuzzy, php-format
+#, php-format
 msgid "Repeat of %s"
-msgstr "Antworten an %s"
+msgstr "Wiederholung von %s"
 
 #: actions/silence.php:65 actions/unsilence.php:65
-#, fuzzy
 msgid "You cannot silence users on this site."
-msgstr "Du kannst diesem Benutzer keine Nachricht schicken."
+msgstr "Du kannst Nutzer dieser Seite nicht ruhig stellen."
 
 #: actions/silence.php:72
-#, fuzzy
 msgid "User is already silenced."
-msgstr "Dieser Benutzer hat dich blockiert."
+msgstr "Nutzer ist bereits ruhig gestellt."
 
 #: actions/siteadminpanel.php:69
 msgid "Basic settings for this StatusNet site."
-msgstr ""
+msgstr "Grundeinstellungen für diese StatusNet Seite."
 
 #: actions/siteadminpanel.php:132
 msgid "Site name must have non-zero length."
-msgstr ""
+msgstr "Der Seiten Name darf nicht leer sein."
 
 #: actions/siteadminpanel.php:140
-#, fuzzy
 msgid "You must have a valid contact email address."
-msgstr "Du musst eine gültige E-Mail-Adresse haben"
+msgstr "Du musst eine gültige E-Mail-Adresse haben."
 
 #: actions/siteadminpanel.php:158
-#, fuzzy, php-format
+#, php-format
 msgid "Unknown language \"%s\"."
 msgstr "Unbekannte Sprache „%s“"
 
@@ -3727,7 +3746,7 @@ msgstr ""
 
 #: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
-msgstr ""
+msgstr "Minimale Textlänge ist 140 Zeichen."
 
 #: actions/siteadminpanel.php:189
 msgid "Dupe limit must 1 or more seconds."
@@ -3738,13 +3757,12 @@ msgid "General"
 msgstr ""
 
 #: actions/siteadminpanel.php:242
-#, fuzzy
 msgid "Site name"
-msgstr "Seitennachricht"
+msgstr "Seitenname"
 
 #: actions/siteadminpanel.php:243
 msgid "The name of your site, like \"Yourcompany Microblog\""
-msgstr ""
+msgstr "Der Name deiner Seite, sowas wie \"DeinUnternehmen Mircoblog\""
 
 #: actions/siteadminpanel.php:247
 msgid "Brought by"
@@ -3947,15 +3965,26 @@ msgstr "Kein Code eingegeben"
 msgid "You are not subscribed to that profile."
 msgstr "Du hast dieses Profil nicht abonniert."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Konnte Abonnement nicht erstellen."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Kein lokaler Benutzer."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Datei 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."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonniert"
 
@@ -3965,9 +3994,9 @@ msgid "%s subscribers"
 msgstr "%s Abonnenten"
 
 #: actions/subscribers.php:52
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s subscribers, page %2$d"
-msgstr "%s Abonnenten, Seite %d"
+msgstr "%1$s Abonnenten, Seite %2$d"
 
 #: actions/subscribers.php:63
 msgid "These are the people who listen to your notices."
@@ -4006,9 +4035,9 @@ msgid "%s subscriptions"
 msgstr "%s Abonnements"
 
 #: actions/subscriptions.php:54
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s subscriptions, page %2$d"
-msgstr "%s Abonnements, Seite %d"
+msgstr "%1$s Abonnements, Seite %2$d"
 
 #: actions/subscriptions.php:65
 msgid "These are the people whose notices you listen to."
@@ -4019,7 +4048,7 @@ msgstr "Dies sind die Leute, deren Nachrichten du liest."
 msgid "These are the people whose notices %s listens to."
 msgstr "Dies sind die Leute, deren Nachrichten %s liest."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4029,38 +4058,38 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
-#, fuzzy, php-format
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
+#, php-format
 msgid "%s is not listening to anyone."
-msgstr "%1$s liest ab sofort "
+msgstr "%s hat niemanden abonniert."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
-#, fuzzy, php-format
+#: actions/tag.php:69
+#, php-format
 msgid "Notices tagged with %1$s, page %2$d"
-msgstr "Benutzer die sich selbst mit %s getagged haben - Seite %d"
+msgstr "Mit %1$s gekennzeichnete Nachrichten, Seite %2$d"
 
-#: actions/tag.php:86
-#, fuzzy, php-format
+#: actions/tag.php:87
+#, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
-msgstr "Feed der Nachrichten von %s"
+msgstr "Nachrichten Feed für Tag %s (RSS 1.0)"
 
-#: actions/tag.php:92
-#, fuzzy, php-format
+#: actions/tag.php:93
+#, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
-msgstr "Feed der Nachrichten von %s"
+msgstr "Nachrichten Feed für Tag %s (RSS 2.0)"
 
-#: actions/tag.php:98
-#, fuzzy, php-format
+#: actions/tag.php:99
+#, php-format
 msgid "Notice feed for tag %s (Atom)"
-msgstr "Feed der Nachrichten von %s"
+msgstr "Nachrichten Feed für Tag %s (Atom)"
 
 #: actions/tagother.php:39
 #, fuzzy
@@ -4114,7 +4143,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Tag nicht vorhanden."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-Methode im Aufbau."
 
@@ -4128,9 +4157,8 @@ msgid "User is not sandboxed."
 msgstr "Dieser Benutzer hat dich blockiert."
 
 #: actions/unsilence.php:72
-#, fuzzy
 msgid "User is not silenced."
-msgstr "Benutzer hat kein Profil."
+msgstr "Der Benutzer ist nicht ruhig gestellt."
 
 #: actions/unsubscribe.php:77
 msgid "No profile id in request."
@@ -4148,78 +4176,74 @@ msgstr ""
 "Die Nachrichtenlizenz '%s' ist nicht kompatibel mit der Lizenz der Seite '%"
 "s'."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Benutzer"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
-msgstr ""
+msgstr "Nutzer Einstellungen dieser StatusNet Seite."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
-msgstr ""
+msgstr "Das Zeichenlimit der Biografie muss numerisch sein!"
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
-msgstr ""
+msgstr "Willkommens-Nachricht ungültig. Maximale Länge sind 255 Zeichen."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Neue Nutzer"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
-msgstr ""
+msgstr "Willkommens-Nachricht für neue Nutzer (maximal 255 Zeichen)."
 
-#: actions/useradminpanel.php:240
-#, fuzzy
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
-msgstr "Alle Abonnements"
+msgstr "Standard Abonnement"
 
-#: actions/useradminpanel.php:241
-#, fuzzy
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
-msgstr ""
-"Abonniere automatisch alle Kontakte, die mich abonnieren (sinnvoll für Nicht-"
-"Menschen)"
+msgstr "Neue Nutzer abonnieren automatisch diesen Nutzer"
 
-#: actions/useradminpanel.php:250
-#, fuzzy
+#: actions/useradminpanel.php:251
 msgid "Invitations"
-msgstr "Einladung(en) verschickt"
+msgstr "Einladungen"
 
-#: actions/useradminpanel.php:255
-#, fuzzy
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
-msgstr "Einladung(en) verschickt"
+msgstr "Einladungen aktivieren"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
-msgstr ""
+msgstr "Ist es Nutzern erlaubt neue Nutzer einzuladen."
 
 #: actions/userauthorization.php:105
 msgid "Authorize subscription"
@@ -4245,7 +4269,6 @@ msgstr "Akzeptieren"
 
 #: actions/userauthorization.php:218 lib/subscribeform.php:115
 #: lib/subscribeform.php:139
-#, fuzzy
 msgid "Subscribe to this user"
 msgstr "Abonniere diesen Benutzer"
 
@@ -4403,7 +4426,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Eigene"
@@ -4445,6 +4468,11 @@ msgstr "Konnte Gruppe nicht aktualisieren."
 msgid "Group leave failed."
 msgstr "Gruppenprofil"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Konnte Gruppe nicht aktualisieren."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4463,27 +4491,27 @@ msgstr "Konnte Nachricht nicht einfügen."
 msgid "Could not update message with new URI."
 msgstr "Konnte Nachricht nicht mit neuer URI versehen."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Datenbankfehler beim Einfügen des Hashtags: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problem bei Speichern der Nachricht. Sie ist zu lang."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem bei Speichern der Nachricht. Unbekannter Benutzer."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4492,43 +4520,74 @@ msgstr ""
 "Zu schnell zu viele Nachrichten; atme kurz durch und schicke sie erneut in "
 "ein paar Minuten ab."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 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:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problem bei Speichern der Nachricht."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problem bei Speichern der Nachricht."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Datenbankfehler beim Einfügen der Antwort: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Dieser Benutzer erlaubt dir nicht ihn zu abonnieren."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Bereits abonniert!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Dieser Benutzer hat dich blockiert."
+
+#: classes/Subscription.php:157
+#, fuzzy
+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
+msgid "Couldn't delete subscription."
+msgstr "Konnte Abonnement nicht löschen."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Herzlich willkommen bei %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Konnte Gruppe nicht erstellen."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Konnte Gruppenmitgliedschaft nicht setzen."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Konnte Gruppenmitgliedschaft nicht setzen."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Konnte Abonnement nicht erstellen."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Ändern der Profileinstellungen"
@@ -4571,123 +4630,191 @@ msgstr "Seite ohne Titel"
 msgid "Primary site navigation"
 msgstr "Hauptnavigation"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Startseite"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persönliches Profil und Freundes-Zeitleiste"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Eigene"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Ändere deine E-Mail, dein Avatar, Passwort, Profil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Verbinden"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Konnte nicht zum Server umleiten: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Verbinden"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Hauptnavigation"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Einladen"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Admin"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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:458
-msgid "Logout"
-msgstr "Abmelden"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Einladen"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Von der Seite abmelden"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Abmelden"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Neues Konto erstellen"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrieren"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Auf der Seite anmelden"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hilfe"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Anmelden"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hilf mir!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Suchen"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hilfe"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Suche nach Leuten oder Text"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Suchen"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Seitennachricht"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Lokale Ansichten"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Neue Nachricht"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Unternavigation"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hilfe"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Über"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "AGB"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privatsphäre"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Quellcode"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "Stups"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet-Software-Lizenz"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4696,12 +4823,12 @@ msgstr ""
 "**%%site.name%%** ist ein Microbloggingdienst von [%%site.broughtby%%](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** ist ein Microbloggingdienst."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4712,102 +4839,167 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "StatusNet-Software-Lizenz"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 #, fuzzy
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "Lizenz."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Seitenerstellung"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Später"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Vorher"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Registrierung nicht gestattet"
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() noch nicht implementiert."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() noch nicht implementiert."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Konnte die Design Einstellungen nicht löschen."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Bestätigung der E-Mail-Adresse"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Seite"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS-Konfiguration"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Eigene"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS-Konfiguration"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Benutzer"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS-Konfiguration"
 
-#: lib/adminpanelaction.php:332
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:356
+#, fuzzy
+msgctxt "MENU"
+msgid "Access"
+msgstr "Zugang"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:362
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS-Konfiguration"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+#, fuzzy
+msgctxt "MENU"
+msgid "Paths"
+msgstr "Pfad"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS-Konfiguration"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Eigene"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4902,12 +5094,12 @@ msgstr "Nachrichten in denen dieser Anhang erscheint"
 msgid "Tags for this attachment"
 msgstr "Tags für diesen Anhang"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Passwort geändert"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Passwort geändert"
@@ -5057,81 +5249,90 @@ msgstr "Problem beim Speichern der Nachricht."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Gib den Namen des Benutzers an, den du abonnieren möchtest"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Unbekannter Benutzer."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "%s abonniert"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Gib den Namen des Benutzers ein, den du nicht mehr abonnieren möchtest"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "%s nicht mehr abonniert"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Befehl noch nicht implementiert."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Benachrichtigung deaktiviert."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Konnte Benachrichtigung nicht deaktivieren."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Benachrichtigung aktiviert."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Konnte Benachrichtigung nicht aktivieren."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, 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."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Du hast diese Benutzer bereits abonniert:"
 msgstr[1] "Du hast diese Benutzer bereits abonniert:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Niemand hat Dich abonniert."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Die Gegenseite konnte Dich nicht abonnieren."
 msgstr[1] "Die Gegenseite konnte Dich nicht abonnieren."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Du bist in keiner Gruppe Mitglied."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Du bist Mitglied dieser Gruppe:"
 msgstr[1] "Du bist Mitglied dieser Gruppen:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5145,6 +5346,7 @@ msgid ""
 "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"
@@ -5172,19 +5374,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Keine Konfigurationsdatei gefunden."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Ich habe an folgenden Stellen nach Konfigurationsdateien gesucht: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Auf der Seite anmelden"
@@ -5245,19 +5447,19 @@ msgstr "Zu Favoriten hinzufügen"
 
 #: lib/feed.php:85
 msgid "RSS 1.0"
-msgstr ""
+msgstr "RSS 1.0"
 
 #: lib/feed.php:87
 msgid "RSS 2.0"
-msgstr ""
+msgstr "RSS 2.0"
 
 #: lib/feed.php:89
 msgid "Atom"
-msgstr ""
+msgstr "Atom"
 
 #: lib/feed.php:91
 msgid "FOAF"
-msgstr ""
+msgstr "FOAF"
 
 #: lib/feedlist.php:64
 msgid "Export data"
@@ -5324,12 +5526,12 @@ msgid "Blocked"
 msgstr "Blockiert"
 
 #: lib/groupnav.php:102
-#, fuzzy, php-format
+#, php-format
 msgid "%s blocked users"
-msgstr "Benutzer blockieren"
+msgstr "in %s blockierte Nutzer"
 
 #: lib/groupnav.php:108
-#, fuzzy, php-format
+#, php-format
 msgid "Edit %s group properties"
 msgstr "%s Gruppeneinstellungen bearbeiten"
 
@@ -5338,14 +5540,14 @@ msgid "Logo"
 msgstr "Logo"
 
 #: lib/groupnav.php:114
-#, fuzzy, php-format
+#, php-format
 msgid "Add or edit %s logo"
 msgstr "%s Logo hinzufügen oder bearbeiten"
 
 #: lib/groupnav.php:120
-#, fuzzy, php-format
+#, php-format
 msgid "Add or edit %s design"
-msgstr "%s Logo hinzufügen oder bearbeiten"
+msgstr "%s Design hinzufügen oder bearbeiten"
 
 #: lib/groupsbymemberssection.php:71
 msgid "Groups with most members"
@@ -5356,7 +5558,7 @@ msgid "Groups with most posts"
 msgstr "Gruppen mit den meisten Beiträgen"
 
 #: lib/grouptagcloudsection.php:56
-#, fuzzy, php-format
+#, php-format
 msgid "Tags in %s group's notices"
 msgstr "Tags in den Nachrichten der Gruppe %s"
 
@@ -5381,30 +5583,30 @@ msgstr "Systemfehler beim hochladen der Datei."
 msgid "Not an image or corrupt file."
 msgstr "Kein Bild oder defekte Datei."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Bildformat wird nicht unterstützt."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Daten verloren."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Unbekannter Dateityp"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
-msgstr ""
+msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
-msgstr ""
+msgstr "kB"
 
 #: lib/jabber.php:220
 #, php-format
 msgid "[%s]"
-msgstr ""
+msgstr "[%s]"
 
 #: lib/jabber.php:400
 #, fuzzy, php-format
@@ -5420,14 +5622,12 @@ msgid "Leave"
 msgstr "Verlassen"
 
 #: lib/logingroupnav.php:80
-#, fuzzy
 msgid "Login with a username and password"
-msgstr "Anmelden mit einem Benutzernamen und Passwort"
+msgstr "Mit Nutzernamen und Passwort anmelden"
 
 #: lib/logingroupnav.php:86
-#, fuzzy
 msgid "Sign up for a new account"
-msgstr "Für ein neues Konto registrieren"
+msgstr "Registriere ein neues Nutzerkonto"
 
 #: lib/mail.php:172
 msgid "Email address confirmation"
@@ -5495,11 +5695,9 @@ msgstr ""
 "$s ändern.\n"
 
 #: lib/mail.php:258
-#, fuzzy, php-format
+#, php-format
 msgid "Bio: %s"
-msgstr ""
-"Biografie: %s\n"
-"\n"
+msgstr "Biografie: %s"
 
 #: lib/mail.php:286
 #, php-format
@@ -5665,8 +5863,7 @@ msgstr ""
 "schicken, um sie in eine Konversation zu verwickeln. Andere Leute können Dir "
 "Nachrichten schicken, die nur Du sehen kannst."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
-#, fuzzy
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "von"
 
@@ -5687,39 +5884,45 @@ msgid "Sorry, no incoming email allowed."
 msgstr "Sorry, keinen eingehenden E-Mails gestattet."
 
 #: lib/mailhandler.php:228
-#, fuzzy, php-format
+#, php-format
 msgid "Unsupported message type: %s"
-msgstr "Bildformat wird nicht unterstützt."
+msgstr "Nachrichten-Typ %s wird nicht unterstützt."
 
 #: lib/mediafile.php:98 lib/mediafile.php:123
 msgid "There was a database error while saving your file. Please try again."
 msgstr ""
+"Beim Speichern der Datei trat ein Datenbank Fehler auf. Bitte versuche es "
+"noch einmal."
 
 #: lib/mediafile.php:142
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
 msgstr ""
+"Die Größe der hoch geladenen Datei überschreitet die upload_max_filesize "
+"Angabe in der php.ini."
 
 #: lib/mediafile.php:147
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form."
 msgstr ""
+"Die Größe der hoch geladenen Datei überschreitet die MAX_FILE_SIZE Angabe, "
+"die im HTML Formular angegeben wurde."
 
 #: lib/mediafile.php:152
 msgid "The uploaded file was only partially uploaded."
-msgstr ""
+msgstr "Die Datei wurde nur teilweise auf den Server geladen."
 
 #: lib/mediafile.php:159
 msgid "Missing a temporary folder."
-msgstr ""
+msgstr "Kein temporäres Verzeichnis gefunden."
 
 #: lib/mediafile.php:162
 msgid "Failed to write file to disk."
-msgstr ""
+msgstr "Konnte die Datei nicht auf die Festplatte schreiben."
 
 #: lib/mediafile.php:165
 msgid "File upload stopped by extension."
-msgstr ""
+msgstr "Upload der Datei wurde wegen der Dateiendung gestoppt."
 
 #: lib/mediafile.php:179 lib/mediafile.php:216
 msgid "File exceeds user's quota."
@@ -5745,7 +5948,6 @@ msgid "%s is not a supported file type on this server."
 msgstr ""
 
 #: lib/messageform.php:120
-#, fuzzy
 msgid "Send a direct notice"
 msgstr "Versende eine direkte Nachricht"
 
@@ -5754,14 +5956,18 @@ msgid "To"
 msgstr "An"
 
 #: lib/messageform.php:159 lib/noticeform.php:185
-#, fuzzy
 msgid "Available characters"
 msgstr "Verfügbare Zeichen"
 
-#: lib/noticeform.php:160
+#: lib/messageform.php:178 lib/noticeform.php:236
 #, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Senden"
+
+#: lib/noticeform.php:160
 msgid "Send a notice"
-msgstr "Nachricht versenden"
+msgstr "Nachricht senden"
 
 #: lib/noticeform.php:173
 #, php-format
@@ -5777,14 +5983,12 @@ msgid "Attach a file"
 msgstr ""
 
 #: lib/noticeform.php:212
-#, fuzzy
 msgid "Share my location"
-msgstr "Konnte Tags nicht speichern."
+msgstr "Teile meinen Aufenthaltsort"
 
 #: lib/noticeform.php:215
-#, fuzzy
 msgid "Do not share my location"
-msgstr "Konnte Tags nicht speichern."
+msgstr "Teile meinen Aufenthaltsort nicht"
 
 #: lib/noticeform.php:216
 msgid ""
@@ -5792,53 +5996,50 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
-#, fuzzy
+#: lib/noticelist.php:430
 msgid "N"
-msgstr "Nein"
+msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
-msgstr ""
+msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
-msgstr ""
+msgstr "O"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
-msgstr ""
+msgstr "W"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "im Zusammenhang"
 
-#: lib/noticelist.php:572
-#, fuzzy
+#: lib/noticelist.php:601
 msgid "Repeated by"
-msgstr "Erstellt"
+msgstr "Wiederholt von"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Auf diese Nachricht antworten"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Antworten"
 
-#: lib/noticelist.php:641
-#, fuzzy
+#: lib/noticelist.php:673
 msgid "Notice repeated"
-msgstr "Nachricht gelöscht."
+msgstr "Nachricht wiederholt"
 
 #: lib/nudgeform.php:116
 msgid "Nudge this user"
@@ -5869,11 +6070,6 @@ msgstr "Fehler beim Einfügen des entfernten Profils"
 msgid "Duplicate notice"
 msgstr "Notiz löschen"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Dieser Benutzer erlaubt dir nicht ihn zu abonnieren."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Konnte neues Abonnement nicht eintragen."
@@ -5890,6 +6086,10 @@ msgstr "Antworten"
 msgid "Favorites"
 msgstr "Favoriten"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Benutzer"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Posteingang"
@@ -5907,7 +6107,7 @@ msgid "Your sent messages"
 msgstr "Deine gesendeten Nachrichten"
 
 #: lib/personaltagcloudsection.php:56
-#, fuzzy, php-format
+#, php-format
 msgid "Tags in %s's notices"
 msgstr "Tags in %ss Nachrichten"
 
@@ -5974,28 +6174,24 @@ msgid "Popular"
 msgstr "Beliebt"
 
 #: lib/repeatform.php:107
-#, fuzzy
 msgid "Repeat this notice?"
-msgstr "Auf diese Nachricht antworten"
+msgstr "Diese Nachricht wiederholen?"
 
 #: lib/repeatform.php:132
-#, fuzzy
 msgid "Repeat this notice"
-msgstr "Auf diese Nachricht antworten"
+msgstr "Diese Nachricht wiederholen"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
 #: lib/sandboxform.php:67
-#, fuzzy
 msgid "Sandbox"
-msgstr "Posteingang"
+msgstr "Spielwiese"
 
 #: lib/sandboxform.php:78
-#, fuzzy
 msgid "Sandbox this user"
-msgstr "Benutzer freigeben"
+msgstr "Diesen Nutzer auf die Spielwiese setzen"
 
 #: lib/searchaction.php:120
 msgid "Search site"
@@ -6005,6 +6201,10 @@ msgstr "Site durchsuchen"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Suchen"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6035,14 +6235,12 @@ msgid "More..."
 msgstr ""
 
 #: lib/silenceform.php:67
-#, fuzzy
 msgid "Silence"
-msgstr "Seitennachricht"
+msgstr "Stummschalten"
 
 #: lib/silenceform.php:78
-#, fuzzy
 msgid "Silence this user"
-msgstr "Benutzer blockieren"
+msgstr "Nutzer verstummen lassen"
 
 #: lib/subgroupnav.php:83
 #, php-format
@@ -6059,35 +6257,14 @@ msgstr "Leute, die %s abonniert haben"
 msgid "Groups %s is a member of"
 msgstr "Gruppen in denen %s Mitglied ist"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Bereits abonniert!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Dieser Benutzer hat dich blockiert."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Konnte nicht abbonieren."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Die Gegenseite konnte Dich nicht abonnieren."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Nicht abonniert!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Konnte Abonnement nicht löschen."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Einladen"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Konnte Abonnement nicht löschen."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Lade Freunde und Kollegen ein dir auf %s zu folgen"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6109,19 +6286,17 @@ msgstr "Top-Schreiber"
 
 #: lib/unsandboxform.php:69
 msgid "Unsandbox"
-msgstr ""
+msgstr "Von Spielwiese freigeben"
 
 #: lib/unsandboxform.php:80
-#, fuzzy
 msgid "Unsandbox this user"
 msgstr "Benutzer freigeben"
 
 #: lib/unsilenceform.php:67
 msgid "Unsilence"
-msgstr ""
+msgstr "Stummschalten aufheben"
 
 #: lib/unsilenceform.php:78
-#, fuzzy
 msgid "Unsilence this user"
 msgstr "Benutzer freigeben"
 
@@ -6141,67 +6316,67 @@ msgstr "Avatar bearbeiten"
 msgid "User actions"
 msgstr "Benutzeraktionen"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Profil Einstellungen ändern"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
-msgstr ""
+msgstr "Bearbeiten"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Direkte Nachricht an Benutzer verschickt"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Nachricht"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
-msgstr ""
+msgstr "Moderieren"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "vor wenigen Sekunden"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "vor einer Minute"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "vor %d Minuten"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "vor einer Stunde"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "vor %d Stunden"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "vor einem Tag"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "vor %d Tagen"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "vor einem Monat"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "vor %d Monaten"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "vor einem Jahr"
 
@@ -6216,6 +6391,7 @@ msgid "%s is not a valid color! Use 3 or 6 hex chars."
 msgstr "%s ist keine gültige Farbe! Verwenden Sie 3 oder 6 Hex-Zeichen."
 
 #: lib/xmppmanager.php:402
-#, fuzzy, php-format
+#, php-format
 msgid "Message too long - maximum is %1$d characters, you sent %2$d."
-msgstr "Nachricht zu lang - maximal %d Zeichen erlaubt, du hast %d gesendet"
+msgstr ""
+"Nachricht zu lang - maximal %1$d Zeichen erlaubt, du hast %2$d gesendet."
index 20365e04ad14afa652759840a37314a8c6c26a29..ed9ab78036a3b09191b13ceed85068ddeaea04fb 100644 (file)
@@ -9,78 +9,84 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:30+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:33+0000\n"
 "Language-Team: Greek\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Πρόσβαση"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Ρυθμίσεις OpenID"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Περιγραφή"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr ""
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
+msgctxt "LABEL"
+msgid "Private"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
 msgstr ""
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
 msgstr ""
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Ρυθμίσεις OpenID"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Αποχώρηση"
+
+#. 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 "Δεν υπάρχει τέτοια σελίδα"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -94,78 +100,87 @@ msgstr "Δεν υπάρχει τέτοια σελίδα"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Κανένας τέτοιος χρήστης."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s και οι φίλοι του/της"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s και οι φίλοι του/της"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Ροή φίλων του/της %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Ροή φίλων του/της %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Ροή φίλων του/της %s (Atom)"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Εσείς και οι φίλοι σας"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -178,20 +193,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Η μέθοδος του ΑΡΙ δε βρέθηκε!"
@@ -225,8 +240,9 @@ msgstr "Απέτυχε η ενημέρωση του χρήστη."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 ""
 
@@ -251,7 +267,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -367,68 +383,68 @@ msgstr "Απέτυχε η ενημέρωση του χρήστη."
 msgid "Could not find target user."
 msgstr "Απέτυχε η εύρεση οποιασδήποτε κατάστασης."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "Το ψευδώνυμο είναι ήδη σε χρήση. Δοκιμάστε κάποιο άλλο."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 ""
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Η αρχική σελίδα δεν είναι έγκυρο URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Το ονοματεπώνυμο είναι πολύ μεγάλο (μέγιστο 255 χαρακτ.)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Η περιγραφή είναι πολύ μεγάλη (μέγιστο %d χαρακτ.)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Η τοποθεσία είναι πολύ μεγάλη (μέγιστο 255 χαρακτ.)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr ""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Το ψευδώνυμο είναι ήδη σε χρήση. Δοκιμάστε κάποιο άλλο."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -439,15 +455,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Η ομάδα δεν βρέθηκε!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr ""
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
@@ -456,7 +472,7 @@ msgstr "Αδύνατη η αποθήκευση των νέων πληροφορ
 msgid "You are not a member of this group."
 msgstr ""
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
@@ -488,7 +504,7 @@ msgstr "Μήνυμα"
 #: 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:309
+#: 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
@@ -497,7 +513,7 @@ msgstr "Μήνυμα"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -531,7 +547,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -554,13 +570,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Λογαριασμός"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -638,18 +654,18 @@ msgstr ""
 msgid "%1$s / Favorites from %2$s"
 msgstr ""
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "χρονοδιάγραμμα του χρήστη %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +681,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -680,17 +696,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -706,8 +722,7 @@ msgstr ""
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr ""
 
@@ -719,7 +734,7 @@ msgstr ""
 msgid "Invalid size."
 msgstr ""
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr ""
@@ -736,30 +751,30 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Ρυθμίσεις του άβαταρ"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Διαγραφή"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr ""
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -767,7 +782,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -801,23 +816,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Όχι"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ναι"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr ""
 
@@ -825,40 +840,44 @@ msgstr ""
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s και οι φίλοι του/της"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr ""
 
@@ -937,7 +956,7 @@ msgstr "Ομάδες με τα περισσότερα μέλη"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -963,12 +982,13 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος
 msgid "Delete this application"
 msgstr "Περιγράψτε την ομάδα ή το θέμα"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr ""
@@ -997,7 +1017,7 @@ msgstr "Είσαι σίγουρος ότι θες να διαγράψεις αυ
 msgid "Do not delete this notice"
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr ""
 
@@ -1014,18 +1034,18 @@ msgstr ""
 msgid "Delete user"
 msgstr "Διαγραφή χρήστη"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Διαγράψτε αυτόν τον χρήστη"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1129,6 +1149,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 ""
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1228,31 +1259,31 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Το βιογραφικό είναι πολύ μεγάλο (μέγιστο 140 χαρακτ.)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr ""
 
@@ -1594,7 +1625,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr ""
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr ""
 
@@ -1626,90 +1657,90 @@ msgstr ""
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Απέτυχε η ενημέρωση του χρήστη."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Οι προτιμήσεις αποθηκεύτηκαν"
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr ""
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "Αποσύνδεση"
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr ""
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Διαχειριστής"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 #, fuzzy
 msgid "Make Admin"
 msgstr "Διαχειριστής"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
@@ -1954,16 +1985,18 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+msgctxt "BUTTON"
 msgid "Send"
 msgstr ""
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1998,7 +2031,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Μήνυμα"
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2007,11 +2045,11 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr ""
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr ""
@@ -2028,8 +2066,7 @@ msgstr "Λάθος όνομα χρήστη ή κωδικός"
 msgid "Error setting user. You are probably not authorized."
 msgstr ""
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Σύνδεση"
 
@@ -2277,8 +2314,8 @@ msgstr "Σύνδεση"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2424,7 +2461,7 @@ msgstr "Αδύνατη η αποθήκευση του νέου κωδικού"
 msgid "Password saved."
 msgstr "Ο κωδικός αποθηκεύτηκε."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2457,7 +2494,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2632,7 +2668,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 μικρά γράμματα ή αριθμοί, χωρίς σημεία στίξης ή κενά"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Ονοματεπώνυμο"
@@ -2661,7 +2697,7 @@ msgid "Bio"
 msgstr "Βιογραφικό"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2728,25 +2764,26 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr ""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Απέτυχε η ενημέρωση του χρήστη για την αυτόματη συνδρομή."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Απέτυχε η αποθήκευση του προφίλ."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr ""
 
@@ -2759,46 +2796,46 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr ""
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr ""
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Δημόσια ροή %s"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2807,7 +2844,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2978,8 +3015,7 @@ msgstr ""
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr ""
 
@@ -3123,7 +3159,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr ""
 
@@ -3162,7 +3198,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Δημιουργία"
@@ -3172,47 +3208,47 @@ msgstr "Δημιουργία"
 msgid "Repeated!"
 msgstr "Δημιουργία"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr ""
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr ""
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3238,7 +3274,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3263,7 +3298,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Ρυθμίσεις OpenID"
@@ -3296,7 +3331,7 @@ msgstr "Προσκλήσεις"
 msgid "Description"
 msgstr "Περιγραφή"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr ""
@@ -3358,35 +3393,35 @@ msgstr "%s και οι φίλοι του/της"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3394,7 +3429,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3408,68 +3443,68 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Μέλη"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Δημιουργημένος"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3479,7 +3514,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3488,7 +3523,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Διαχειριστές"
 
@@ -3843,16 +3878,26 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr ""
 
@@ -3912,7 +3957,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3922,35 +3967,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr ""
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr ""
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Ροή φίλων του/της %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -4001,7 +4046,7 @@ msgstr ""
 msgid "No such tag."
 msgstr ""
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Η μέθοδος του ΑΡΙ είναι υπό κατασκευή."
 
@@ -4032,74 +4077,75 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr ""
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Νέοι χρήστες"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Όλες οι συνδρομές"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Αυτόματα γίνε συνδρομητής σε όσους γίνονται συνδρομητές σε μένα  (χρήση "
 "κυρίως από λογισμικό και όχι ανθρώπους)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Προσκλήσεις"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4273,7 +4319,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Προσωπικά"
@@ -4314,6 +4360,11 @@ msgstr "Αδύνατη η αποθήκευση του προφίλ."
 msgid "Group leave failed."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Αδύνατη η αποθήκευση του προφίλ."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4331,66 +4382,97 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Σφάλμα στη βάση δεδομένων κατά την εισαγωγή hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Σφάλμα βάσης δεδομένων κατά την εισαγωγή απάντησης: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Απέτυχε η συνδρομή."
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Απέτυχε η διαγραφή συνδρομής."
+
+#: classes/Subscription.php:179 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:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Δεν ήταν δυνατή η δημιουργία ομάδας."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Αλλάξτε τις ρυθμίσεις του προφίλ σας"
@@ -4432,121 +4514,185 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Αρχή"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Προσωπικά"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "Σύνδεση"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "Αλλάξτε τον κωδικό σας"
 
-#: lib/action.php:444
+#: lib/action.php:447
 #, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Λογαριασμός"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Αδυναμία ανακατεύθηνσης στο διακομιστή: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Σύνδεση"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr ""
+msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr ""
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Διαχειριστής"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Προσκάλεσε φίλους και συναδέλφους σου να γίνουν μέλη στο %s"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Αποσύνδεση"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Μήνυμα"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Αποσύνδεση"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Δημιουργία ενός λογαριασμού"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Περιγραφή"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Βοήθεια"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Σύνδεση"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Βοηθήστε με!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr ""
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Βοήθεια"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+msgctxt "MENU"
+msgid "Search"
+msgstr ""
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Βοήθεια"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Περί"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Συχνές ερωτήσεις"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Επικοινωνία"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, fuzzy, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4555,13 +4701,13 @@ msgstr ""
 "To **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου) που "
 "έφερε κοντά σας το  [%%site.broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, fuzzy, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 "Το **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου). "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4569,99 +4715,161 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr ""
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+msgctxt "MENU"
+msgid "Site"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Προσωπικά"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Επιβεβαίωση διεύθυνσης email"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Προσωπικά"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4752,12 +4960,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Ο κωδικός αποθηκεύτηκε."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Ο κωδικός αποθηκεύτηκε."
@@ -4909,82 +5117,92 @@ msgstr ""
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Κανένας τέτοιος χρήστης."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Απέτυχε η συνδρομή."
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 msgstr[1] "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 msgstr[1] "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Δεν είστε μέλος καμίας ομάδας."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Ομάδες με τα περισσότερα μέλη"
 msgstr[1] "Ομάδες με τα περισσότερα μέλη"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4998,6 +5216,7 @@ msgid ""
 "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"
@@ -5025,20 +5244,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Ο κωδικός επιβεβαίωσης δεν βρέθηκε."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5226,24 +5445,24 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5449,7 +5668,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "από"
 
@@ -5539,6 +5758,11 @@ msgstr ""
 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 ""
@@ -5572,48 +5796,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Επαναλαμβάνεται από"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Ρυθμίσεις OpenID"
@@ -5647,10 +5871,6 @@ msgstr ""
 msgid "Duplicate notice"
 msgstr "Διαγραφή μηνύματος"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Απέτυχε η εισαγωγή νέας συνδρομής."
@@ -5667,6 +5887,10 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5758,7 +5982,7 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος
 msgid "Repeat this notice"
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5779,6 +6003,10 @@ msgstr ""
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr ""
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr ""
@@ -5831,35 +6059,14 @@ msgstr ""
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Απέτυχε η συνδρομή."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Δεν επιτρέπεται να κάνεις συνδρομητές του λογαριασμού σου άλλους."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Απέτυχε η συνδρομή."
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Απέτυχε η διαγραφή συνδρομής."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Απέτυχε η διαγραφή συνδρομής."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Προσκάλεσε φίλους και συναδέλφους σου να γίνουν μέλη στο %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -5913,67 +6120,67 @@ msgstr ""
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Επεξεργασία ρυθμίσεων προφίλ"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Επεξεργασία"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Μήνυμα"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr ""
 
index 0e7acedc07cc187a2854a3d6322a53795c6face4..d0ba439baa23dc630db25dbf14eccacc45c88fd0 100644 (file)
@@ -2,7 +2,6 @@
 #
 # Author@translatewiki.net: Bruce89
 # Author@translatewiki.net: CiaranG
-# Author@translatewiki.net: Lockal
 # --
 # This file is distributed under the same license as the StatusNet package.
 #
@@ -10,75 +9,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:06:20+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:36+0000\n"
 "Language-Team: British English\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Access"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Site access settings"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registration"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Private"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Prohibit anonymous users (not logged in) from viewing site?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Invite only"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Private"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Make registration invitation only."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Closed"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Invite only"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Disable new registrations."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Save"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Closed"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Save access settings"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Save"
+
+#. 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 "No such page"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -92,53 +98,60 @@ msgstr "No such page"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "No such user."
 
-#: actions/all.php:84
+#. 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 and friends, page %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s and friends"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed for friends of %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed for friends of %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed for friends of %s (Atom)"
 
-#: actions/all.php:127
+#. 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 ""
 "This is the timeline for %s and friends but no one has posted anything yet."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -147,7 +160,8 @@ msgstr ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 
-#: actions/all.php:134
+#. 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 "
@@ -156,7 +170,7 @@ msgstr ""
 "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)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -165,7 +179,8 @@ msgstr ""
 "Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
 "post a notice to his or her attention."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "You and friends"
 
@@ -183,20 +198,20 @@ msgstr "Updates from %1$s and friends on %2$s!"
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API method not found."
 
@@ -231,8 +246,9 @@ msgstr "Couldn't update user."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "User has no profile."
 
@@ -259,7 +275,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -369,68 +385,68 @@ msgstr "Could not determine source user."
 msgid "Could not find target user."
 msgstr "Could not find target user."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Nickname must have only lowercase letters and numbers, and no spaces."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Nickname already in use. Try another one."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Not a valid nickname."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Homepage is not a valid URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Full name is too long (max 255 chars)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Description is too long (max %d chars)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Location is too long (max 255 chars)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Too many aliases! Maximum %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Invalid alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias \"%s\" already in use. Try another one."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias can't be the same as nickname."
@@ -441,15 +457,15 @@ msgstr "Alias can't be the same as nickname."
 msgid "Group not found!"
 msgstr "Group not found!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "You are already a member of that group."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "You have been blocked from that group by the admin."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Could not join user %1$s to group %2$s."
@@ -458,7 +474,7 @@ msgstr "Could not join user %1$s to group %2$s."
 msgid "You are not a member of this group."
 msgstr "You are not a member of this group."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Could not remove user %1$s to group %2$s."
@@ -489,7 +505,7 @@ msgstr "Invalid token."
 #: 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:309
+#: 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
@@ -498,7 +514,7 @@ msgstr "Invalid token."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -532,7 +548,7 @@ msgstr "The request token %s has been denied and revoked."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -558,13 +574,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Account"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -646,12 +662,12 @@ 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s timeline"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -687,7 +703,7 @@ msgstr "Repeated to %s"
 msgid "Repeats of %s"
 msgstr "Repeats of %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notices tagged with %s"
@@ -708,8 +724,7 @@ msgstr "No such attachment."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "No nickname."
 
@@ -721,7 +736,7 @@ msgstr "No size."
 msgid "Invalid size."
 msgstr "Invalid size."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -738,30 +753,30 @@ msgid "User without matching profile"
 msgstr "User without matching profile"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Avatar settings"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Preview"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Delete"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Upload"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Crop"
 
@@ -769,7 +784,7 @@ msgstr "Crop"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Pick a square area of the image to be your avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Lost our file data."
 
@@ -804,22 +819,22 @@ msgstr ""
 "will not be notified of any @-replies from them."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Do not block this user"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Yes"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Block this user"
 
@@ -827,39 +842,43 @@ msgstr "Block this user"
 msgid "Failed to save block information."
 msgstr "Failed to save block information."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "No such group."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s blocked profiles"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s blocked profiles, page %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "A list of the users blocked from joining this group."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Unblock user from group"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Unblock"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Unblock this user"
 
@@ -934,7 +953,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "There was a problem with your session token."
 
@@ -960,12 +979,13 @@ msgstr "Do not delete this application"
 msgid "Delete this application"
 msgstr "Delete this application"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Not logged in."
@@ -994,7 +1014,7 @@ msgstr "Are you sure you want to delete this notice?"
 msgid "Do not delete this notice"
 msgstr "Do not delete this notice"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Delete this notice"
 
@@ -1010,7 +1030,7 @@ msgstr "You can only delete local users."
 msgid "Delete user"
 msgstr "Delete user"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1018,12 +1038,12 @@ msgstr ""
 "Are you sure you want to delete this user? This will clear all data about "
 "the user from the database, without a backup."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Delete this user"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Design"
 
@@ -1126,6 +1146,17 @@ msgstr "Restore default designs"
 msgid "Reset back to default"
 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/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 "Save"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Save design"
@@ -1217,29 +1248,29 @@ msgstr "Edit %s group"
 msgid "You must be logged in to create a group."
 msgstr "You must be logged in to create a group."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "You must be an admin to edit the group."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Use this form to edit the group."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "description is too long (max %d chars)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Could not update group."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Could not create aliases"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Options saved."
 
@@ -1533,23 +1564,20 @@ msgid "Could not convert request token to access token."
 msgstr "Couldn't convert request tokens to access tokens."
 
 #: actions/finishremotesubscribe.php:118
-#, fuzzy
 msgid "Remote service uses unknown version of OMB protocol."
-msgstr "Unknown version of OMB protocol."
+msgstr "Remote service uses unknown version of OMB protocol."
 
 #: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306
 msgid "Error updating remote profile"
 msgstr "Error updating remote profile."
 
 #: actions/getfile.php:79
-#, fuzzy
 msgid "No such file."
-msgstr "No such notice."
+msgstr "No such file."
 
 #: actions/getfile.php:83
-#, fuzzy
 msgid "Cannot read file."
-msgstr "Lost our file."
+msgstr "Cannot read file."
 
 #: actions/groupblock.php:71 actions/groupunblock.php:71
 #: actions/makeadmin.php:71 actions/subedit.php:46
@@ -1565,9 +1593,8 @@ msgstr "No profile with that ID."
 
 #: actions/groupblock.php:81 actions/groupunblock.php:81
 #: actions/makeadmin.php:81
-#, fuzzy
 msgid "No group specified."
-msgstr "No profile specified."
+msgstr "No group specified."
 
 #: actions/groupblock.php:91
 msgid "Only an admin can block group members."
@@ -1581,10 +1608,9 @@ msgstr "User is already blocked from group."
 msgid "User is not a member of group."
 msgstr "User is not a member of group."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
-#, fuzzy
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
-msgstr "Block user"
+msgstr "Block user from group"
 
 #: actions/groupblock.php:162
 #, php-format
@@ -1610,21 +1636,18 @@ msgid "Database error blocking user from group."
 msgstr "Database error blocking user from group."
 
 #: actions/groupbyid.php:74 actions/userbyid.php:70
-#, fuzzy
 msgid "No ID."
-msgstr "No ID"
+msgstr "No ID."
 
 #: actions/groupdesignsettings.php:68
-#, fuzzy
 msgid "You must be logged in to edit a group."
-msgstr "You must be logged in to create a group."
+msgstr "You must be logged in to edit a group."
 
-#: actions/groupdesignsettings.php:141
-#, fuzzy
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
-msgstr "Groups"
+msgstr "Group design"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1632,85 +1655,80 @@ msgstr ""
 "Customise the way your group looks with a background image and a colour "
 "palette of your choice."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
-#, fuzzy
 msgid "Couldn't update your design."
-msgstr "Couldn't update user."
+msgstr "Couldn't update your design."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
-#, fuzzy
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
-msgstr "Sync preferences saved."
+msgstr "Design preferences saved."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Group logo"
 
-#: actions/grouplogo.php:150
-#, fuzzy, php-format
+#: actions/grouplogo.php:153
+#, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
-msgstr "You can upload a logo image for your group."
+msgstr ""
+"You can upload a logo image for your group. The maximum file size is %s."
 
-#: actions/grouplogo.php:178
-#, fuzzy
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
-msgstr "User without matching profile"
+msgstr "User without matching profile."
 
-#: actions/grouplogo.php:362
-#, fuzzy
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
-msgstr "Pick a square area of the image to be your avatar"
+msgstr "Pick a square area of the image to be the logo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo updated."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Failed updating logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s group members"
 
-#: actions/groupmembers.php:96
-#, fuzzy, php-format
+#: actions/groupmembers.php:103
+#, php-format
 msgid "%1$s group members, page %2$d"
-msgstr "%s group members, page %d"
+msgstr "%1$s group members, page %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "A list of the users in this group."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Admin"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Block"
 
-#: actions/groupmembers.php:443
-#, fuzzy
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
-msgstr "You must be an admin to edit the group"
+msgstr "Make user an admin of the group"
 
-#: actions/groupmembers.php:475
-#, fuzzy
+#: actions/groupmembers.php:482
 msgid "Make Admin"
-msgstr "Admin"
+msgstr "Make admin"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
-msgstr ""
+msgstr "Make this user an admin"
 
-#: actions/grouprss.php:133
-#, fuzzy, php-format
+#: actions/grouprss.php:140
+#, php-format
 msgid "Updates from members of %1$s on %2$s!"
-msgstr "Updates from %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
 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98
@@ -1742,12 +1760,12 @@ msgid "Create a new group"
 msgstr "Create a new group"
 
 #: actions/groupsearch.php:52
-#, fuzzy, php-format
+#, 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 ""
-"Search for people on %%site.name%% by their name, location, or interests. "
+"Search for groups on %%site.name%% by their name, location, or description. "
 "Separate the terms by spaces; they must be 3 characters or more."
 
 #: actions/groupsearch.php:58
@@ -1756,9 +1774,8 @@ msgstr "Group search"
 
 #: actions/groupsearch.php:79 actions/noticesearch.php:117
 #: actions/peoplesearch.php:83
-#, fuzzy
 msgid "No results."
-msgstr "No results"
+msgstr "No results."
 
 #: actions/groupsearch.php:82
 #, php-format
@@ -1787,9 +1804,8 @@ msgid "Error removing the block."
 msgstr "Error removing the block."
 
 #: actions/imsettings.php:59
-#, fuzzy
 msgid "IM settings"
-msgstr "I.M. Settings"
+msgstr "IM settings"
 
 #: actions/imsettings.php:70
 #, php-format
@@ -1881,9 +1897,9 @@ msgid "That is not your Jabber ID."
 msgstr "That is not your Jabber ID."
 
 #: actions/inbox.php:59
-#, fuzzy, php-format
+#, php-format
 msgid "Inbox for %1$s - page %2$d"
-msgstr "Inbox for %s"
+msgstr "Inbox for %1$s - page %2$d"
 
 #: actions/inbox.php:62
 #, php-format
@@ -1965,16 +1981,19 @@ msgstr "Personal message"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Optionally add a personal message to the invitation."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Send"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s has invited you to join them on %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2035,23 +2054,27 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "You must be logged in to join a group."
 
-#: actions/joingroup.php:131
-#, fuzzy, php-format
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "No nickname or ID."
+
+#: actions/joingroup.php:141
+#, php-format
 msgid "%1$s joined group %2$s"
-msgstr "%s joined group %s"
+msgstr "%1$s joined group %2$s"
 
 #: actions/leavegroup.php:60
 msgid "You must be logged in to leave a group."
 msgstr "You must be logged in to leave a group."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "You are not a member of that group."
 
-#: actions/leavegroup.php:127
-#, fuzzy, php-format
+#: actions/leavegroup.php:137
+#, php-format
 msgid "%1$s left group %2$s"
-msgstr "%s left group %s"
+msgstr "%1$s left group %2$s"
 
 #: actions/login.php:80 actions/otp.php:62 actions/register.php:137
 msgid "Already logged in."
@@ -2065,8 +2088,7 @@ msgstr "Incorrect username or password."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Error setting user. You are probably not authorised."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Login"
 
@@ -2108,47 +2130,43 @@ msgid "Only an admin can make another user an admin."
 msgstr ""
 
 #: actions/makeadmin.php:96
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s is already an admin for group \"%2$s\"."
-msgstr "User is already blocked from group."
+msgstr "%1$s is already an admin for group \"%2$s\"."
 
 #: actions/makeadmin.php:133
-#, fuzzy, php-format
+#, php-format
 msgid "Can't get membership record for %1$s in group %2$s."
-msgstr "Could not remove user %s to group %s"
+msgstr "Can't get membership record for %1$s in group %2$s."
 
 #: actions/makeadmin.php:146
-#, fuzzy, php-format
+#, php-format
 msgid "Can't make %1$s an admin for group %2$s."
-msgstr "You must be an admin to edit the group"
+msgstr "Can't make %1$s an admin for group %2$s."
 
 #: actions/microsummary.php:69
 msgid "No current status"
 msgstr "No current status"
 
 #: actions/newapplication.php:52
-#, fuzzy
 msgid "New Application"
-msgstr "No such notice."
+msgstr "New Application"
 
 #: actions/newapplication.php:64
-#, fuzzy
 msgid "You must be logged in to register an application."
-msgstr "You must be logged in to create a group."
+msgstr "You must be logged in to register an application."
 
 #: actions/newapplication.php:143
-#, fuzzy
 msgid "Use this form to register a new application."
-msgstr "Use this form to create a new group."
+msgstr "Use this form to register a new application."
 
 #: actions/newapplication.php:176
 msgid "Source URL is required."
-msgstr ""
+msgstr "Source URL is required."
 
 #: actions/newapplication.php:258 actions/newapplication.php:267
-#, fuzzy
 msgid "Could not create application."
-msgstr "Could not create aliases"
+msgstr "Could not create application."
 
 #: actions/newgroup.php:53
 msgid "New group"
@@ -2186,9 +2204,9 @@ msgid "Message sent"
 msgstr "Message sent"
 
 #: actions/newmessage.php:185
-#, fuzzy, php-format
+#, php-format
 msgid "Direct message to %s sent."
-msgstr "Direct message to %s sent"
+msgstr "Could not create application."
 
 #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170
 msgid "Ajax Error"
@@ -2216,9 +2234,9 @@ msgid "Text search"
 msgstr "Text search"
 
 #: actions/noticesearch.php:91
-#, fuzzy, php-format
+#, php-format
 msgid "Search results for \"%1$s\" on %2$s"
-msgstr "Search results for \"%s\" on %s"
+msgstr "Search results for \"%1$s\" on %2$s"
 
 #: actions/noticesearch.php:121
 #, php-format
@@ -2226,6 +2244,8 @@ msgid ""
 "Be the first to [post on this topic](%%%%action.newnotice%%%%?"
 "status_textarea=%s)!"
 msgstr ""
+"Be the first to [post on this topic](%%%%action.newnotice%%%%?"
+"status_textarea=%s)!"
 
 #: actions/noticesearch.php:124
 #, php-format
@@ -2261,14 +2281,12 @@ msgid "Nudge sent!"
 msgstr "Nudge sent!"
 
 #: actions/oauthappssettings.php:59
-#, fuzzy
 msgid "You must be logged in to list your applications."
-msgstr "You must be logged in to create a group."
+msgstr "You must be logged in to list your applications."
 
 #: actions/oauthappssettings.php:74
-#, fuzzy
 msgid "OAuth applications"
-msgstr "Other options"
+msgstr "OAuth applications"
 
 #: actions/oauthappssettings.php:85
 msgid "Applications you have registered"
@@ -2288,9 +2306,8 @@ msgid "You have allowed the following applications to access you account."
 msgstr ""
 
 #: actions/oauthconnectionssettings.php:175
-#, fuzzy
 msgid "You are not a user of that application."
-msgstr "You are not a member of that group."
+msgstr "You are not a user of that application."
 
 #: actions/oauthconnectionssettings.php:186
 msgid "Unable to revoke access for app: "
@@ -2315,16 +2332,15 @@ msgid "%1$s's status on %2$s"
 msgstr "%1$s's status on %2$s"
 
 #: actions/oembed.php:157
-#, fuzzy
 msgid "content type "
-msgstr "Connect"
+msgstr "content type "
 
 #: actions/oembed.php:160
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Not a supported data format."
 
@@ -2337,9 +2353,8 @@ msgid "Notice Search"
 msgstr "Notice Search"
 
 #: actions/othersettings.php:60
-#, fuzzy
 msgid "Other settings"
-msgstr "Other Settings"
+msgstr "Other settings"
 
 #: actions/othersettings.php:71
 msgid "Manage various other options."
@@ -2358,9 +2373,8 @@ msgid "Automatic shortening service to use."
 msgstr "Automatic shortening service to use."
 
 #: actions/othersettings.php:122
-#, fuzzy
 msgid "View profile designs"
-msgstr "Profile settings"
+msgstr "View profile designs"
 
 #: actions/othersettings.php:123
 msgid "Show or hide profile designs."
@@ -2371,34 +2385,29 @@ msgid "URL shortening service is too long (max 50 chars)."
 msgstr "URL shortening service is too long (max 50 chars)."
 
 #: actions/otp.php:69
-#, fuzzy
 msgid "No user ID specified."
-msgstr "No profile specified."
+msgstr "No user ID specified."
 
 #: actions/otp.php:83
-#, fuzzy
 msgid "No login token specified."
-msgstr "No profile specified."
+msgstr "No login token specified."
 
 #: actions/otp.php:90
-#, fuzzy
 msgid "No login token requested."
-msgstr "No profile id in request."
+msgstr "No login token requested."
 
 #: actions/otp.php:95
-#, fuzzy
 msgid "Invalid login token specified."
-msgstr "Invalid notice content"
+msgstr "Invalid login token specified."
 
 #: actions/otp.php:104
-#, fuzzy
 msgid "Login token expired."
-msgstr "Login to site"
+msgstr "Login token expired."
 
 #: actions/outbox.php:58
-#, fuzzy, php-format
+#, php-format
 msgid "Outbox for %1$s - page %2$d"
-msgstr "Outbox for %s"
+msgstr "Outbox for %1$s - page %2$d"
 
 #: actions/outbox.php:61
 #, php-format
@@ -2470,7 +2479,7 @@ msgstr "Can't save new password."
 msgid "Password saved."
 msgstr "Password saved."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2503,10 +2512,8 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
-#, fuzzy
 msgid "Site"
-msgstr "Invite"
+msgstr "Site"
 
 #: actions/pathsadminpanel.php:238
 msgid "Server"
@@ -2557,24 +2564,20 @@ msgid "Theme directory"
 msgstr ""
 
 #: actions/pathsadminpanel.php:279
-#, fuzzy
 msgid "Avatars"
-msgstr "Avatar"
+msgstr "Avatars"
 
 #: actions/pathsadminpanel.php:284
-#, fuzzy
 msgid "Avatar server"
-msgstr "Avatar settings"
+msgstr "Avatar server"
 
 #: actions/pathsadminpanel.php:288
-#, fuzzy
 msgid "Avatar path"
-msgstr "Avatar updated."
+msgstr "Avatar path"
 
 #: actions/pathsadminpanel.php:292
-#, fuzzy
 msgid "Avatar directory"
-msgstr "Avatar updated."
+msgstr "Avatar directory"
 
 #: actions/pathsadminpanel.php:301
 msgid "Backgrounds"
@@ -2617,9 +2620,8 @@ msgid "When to use SSL"
 msgstr ""
 
 #: actions/pathsadminpanel.php:335
-#, fuzzy
 msgid "SSL server"
-msgstr "Server"
+msgstr "SSL server"
 
 #: actions/pathsadminpanel.php:336
 msgid "Server to direct SSL requests to"
@@ -2648,9 +2650,9 @@ msgid "Not a valid people tag: %s"
 msgstr "Not a valid people tag: %s"
 
 #: actions/peopletag.php:144
-#, fuzzy, php-format
+#, php-format
 msgid "Users self-tagged with %1$s - page %2$d"
-msgstr "Users self-tagged with %s - page %d"
+msgstr "Users self-tagged with %1$s - page %2$d"
 
 #: actions/postnotice.php:84
 msgid "Invalid notice content"
@@ -2680,7 +2682,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 lowercase letters or numbers, no punctuation or spaces"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Full name"
@@ -2708,7 +2710,7 @@ msgid "Bio"
 msgstr "Bio"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2774,24 +2776,24 @@ msgstr "Language is too long (max 50 chars)."
 msgid "Invalid tag: \"%s\""
 msgstr "Invalid tag: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Couldn't update user for autosubscribe."
 
-#: actions/profilesettings.php:359
-#, fuzzy
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
-msgstr "Couldn't save tags."
+msgstr "Couldn't save location prefs."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Couldn't save profile."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Couldn't save tags."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Settings saved."
 
@@ -2804,48 +2806,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Could not retrieve public stream."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Public timeline, page %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Public timeline"
 
-#: actions/public.php:159
-#, fuzzy
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
-msgstr "Public Stream Feed"
+msgstr "Public Stream Feed (RSS 1.0)"
 
-#: actions/public.php:163
-#, fuzzy
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
-msgstr "Public Stream Feed"
+msgstr "Public Stream Feed (RSS 2.0)"
 
-#: actions/public.php:167
-#, fuzzy
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
-msgstr "Public Stream Feed"
+msgstr "Public Stream Feed (Atom)"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2858,7 +2857,7 @@ msgstr ""
 "tool. [Join now](%%action.register%%) to share notices about yourself with "
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3027,16 +3026,14 @@ msgid "Sorry, only invited people can register."
 msgstr "Sorry, only invited people can register."
 
 #: actions/register.php:92
-#, fuzzy
 msgid "Sorry, invalid invitation code."
-msgstr "Error with confirmation code."
+msgstr "Sorry, invalid invitation code."
 
 #: actions/register.php:112
 msgid "Registration successful"
 msgstr "Registration successful"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Register"
 
@@ -3096,12 +3093,11 @@ msgid "Creative Commons Attribution 3.0"
 msgstr ""
 
 #: actions/register.php:497
-#, fuzzy
 msgid ""
 " except this private data: password, email address, IM address, and phone "
 "number."
 msgstr ""
-" except this private data: password, e-mail address, IM address, phone "
+"  except this private data: password, email address, IM address, and phone "
 "number."
 
 #: actions/register.php:538
@@ -3161,9 +3157,8 @@ msgid "Remote subscribe"
 msgstr "Remote subscribe"
 
 #: actions/remotesubscribe.php:124
-#, fuzzy
 msgid "Subscribe to a remote user"
-msgstr "Subscribe to this user"
+msgstr "Subscribe to a remote user"
 
 #: actions/remotesubscribe.php:129
 msgid "User nickname"
@@ -3182,7 +3177,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subscribe"
 
@@ -3191,98 +3186,91 @@ msgid "Invalid profile URL (bad format)"
 msgstr "Invalid profile URL (bad format)"
 
 #: actions/remotesubscribe.php:168
-#, fuzzy
 msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)."
-msgstr "Not a valid profile URL (no YADIS document)."
+msgstr "Not a valid profile URL (no YADIS document or invalid XRDS defined)."
 
 #: actions/remotesubscribe.php:176
-#, fuzzy
 msgid "That’s a local profile! Login to subscribe."
-msgstr "That's a local profile! Login to subscribe."
+msgstr "Thats a local profile! Login to subscribe."
 
 #: actions/remotesubscribe.php:183
-#, fuzzy
 msgid "Couldn’t get a request token."
-msgstr "Couldn't get a request token."
+msgstr "Couldnt get a request token."
 
 #: actions/repeat.php:57
-#, fuzzy
 msgid "Only logged-in users can repeat notices."
-msgstr "Only the user can read their own mailboxes."
+msgstr "Only logged-in users can repeat notices."
 
 #: actions/repeat.php:64 actions/repeat.php:71
-#, fuzzy
 msgid "No notice specified."
-msgstr "No profile specified."
+msgstr "No notice specified."
 
 #: actions/repeat.php:76
 msgid "You can't repeat your own notice."
 msgstr "You can't repeat your own notice."
 
 #: actions/repeat.php:90
-#, fuzzy
 msgid "You already repeated that notice."
-msgstr "You have already blocked this user."
+msgstr "You already repeated that notice."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
-#, fuzzy
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
-msgstr "Created"
+msgstr "Repeated"
 
 #: actions/repeat.php:119
-#, fuzzy
 msgid "Repeated!"
-msgstr "Created"
+msgstr "Repeated!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Replies to %s"
 
-#: actions/replies.php:127
-#, fuzzy, php-format
+#: actions/replies.php:128
+#, php-format
 msgid "Replies to %1$s, page %2$d"
-msgstr "Replies to %1$s on %2$s!"
+msgstr "Replies to %1$s, page %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Replies feed for %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Replies feed for %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Notice feed for %s"
 
-#: actions/replies.php:198
-#, fuzzy, php-format
+#: 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 ""
-"This is the timeline for %s and friends but no one has posted anything yet."
+"This is the timeline showing replies to %1$s but %2$s hasn't received a "
+"notice to his attention yet."
 
-#: actions/replies.php:203
+#: 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:205
-#, fuzzy, php-format
+#: 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 ""
-"You can try to [nudge %s](../%s) from his profile or [post something to his "
-"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)."
+"You can try to [nudge %1$s](../%2$s) or [post something to his or her "
+"attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
 #: actions/repliesrss.php:72
 #, php-format
@@ -3290,9 +3278,8 @@ msgid "Replies to %1$s on %2$s!"
 msgstr "Replies to %1$s on %2$s!"
 
 #: actions/rsd.php:146 actions/version.php:157
-#, fuzzy
 msgid "StatusNet"
-msgstr "Status deleted."
+msgstr "StatusNet"
 
 #: actions/sandbox.php:65 actions/unsandbox.php:65
 msgid "You cannot sandbox users on this site."
@@ -3303,14 +3290,12 @@ msgid "User is already sandboxed."
 msgstr "User is already sandboxed."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
 #: actions/sessionsadminpanel.php:65
-#, fuzzy
 msgid "Session settings for this StatusNet site."
-msgstr "Design settings for this StausNet site."
+msgstr "Session settings for this StatusNet site."
 
 #: actions/sessionsadminpanel.php:175
 msgid "Handle sessions"
@@ -3329,19 +3314,17 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Save site settings"
 
 #: actions/showapplication.php:82
-#, fuzzy
 msgid "You must be logged in to view an application."
-msgstr "You must be logged in to leave a group."
+msgstr "You must be logged in to view an application."
 
 #: actions/showapplication.php:157
-#, fuzzy
 msgid "Application profile"
-msgstr "Notice has no profile"
+msgstr "Application profile"
 
 #: actions/showapplication.php:159 lib/applicationeditform.php:180
 msgid "Icon"
@@ -3349,21 +3332,19 @@ msgstr ""
 
 #: actions/showapplication.php:169 actions/version.php:195
 #: lib/applicationeditform.php:195
-#, fuzzy
 msgid "Name"
-msgstr "Nickname"
+msgstr "Name"
 
 #: actions/showapplication.php:178 lib/applicationeditform.php:222
-#, fuzzy
 msgid "Organization"
-msgstr "Pagination"
+msgstr "Organization"
 
 #: actions/showapplication.php:187 actions/version.php:198
 #: lib/applicationeditform.php:209 lib/groupeditform.php:172
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistics"
@@ -3412,35 +3393,34 @@ msgid ""
 msgstr ""
 
 #: actions/showapplication.php:309
-#, fuzzy
 msgid "Are you sure you want to reset your consumer key and secret?"
-msgstr "Are you sure you want to delete this notice?"
+msgstr "Are you sure you want to reset your consumer key and secret?"
 
 #: actions/showfavorites.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s's favorite notices, page %2$d"
-msgstr "%s's favourite notices"
+msgstr "%1$s's favorite notices, page %2$d"
 
 #: actions/showfavorites.php:132
 msgid "Could not retrieve favorite notices."
 msgstr "Could not retrieve favourite notices."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed for friends of %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed for friends of %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed for friends of %s"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3448,7 +3428,7 @@ msgstr ""
 "You haven't chosen any favourite notices yet. Click the fave button on "
 "notices you like to bookmark them for later or shed a spotlight on them."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3457,7 +3437,7 @@ msgstr ""
 "%s hasn't added any notices to his favourites yet. Post something "
 "interesting they would add to their favourites :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3468,7 +3448,7 @@ msgstr ""
 "account](%%%%action.register%%%%) and then post something interesting they "
 "would add to their favourites :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3478,71 +3458,71 @@ msgid "%s group"
 msgstr "%s group"
 
 #: actions/showgroup.php:84
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s group, page %2$d"
-msgstr "%s group members, page %d"
+msgstr "%1$s group, page %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Group profile"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Note"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Group actions"
 
-#: actions/showgroup.php:328
-#, fuzzy, php-format
+#: actions/showgroup.php:336
+#, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
-msgstr "Notice feed for %s group"
+msgstr "Notice feed for %s group (RSS 1.0)"
 
-#: actions/showgroup.php:334
-#, fuzzy, php-format
+#: actions/showgroup.php:342
+#, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
-msgstr "Notice feed for %s group"
+msgstr "Notice feed for %s group (RSS 2.0)"
 
-#: actions/showgroup.php:340
-#, fuzzy, php-format
+#: actions/showgroup.php:348
+#, php-format
 msgid "Notice feed for %s group (Atom)"
-msgstr "Notice feed for %s group"
+msgstr "Notice feed for %s group (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Outbox for %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Members"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(None)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "All members"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Created"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3557,8 +3537,8 @@ 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:454
-#, fuzzy, php-format
+#: actions/showgroup.php:462
+#, 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 "
@@ -3566,12 +3546,13 @@ msgid ""
 "their life and interests. "
 msgstr ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
-"wikipedia.org/wiki/Micro-blogging) service "
+"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. "
 
-#: actions/showgroup.php:482
-#, fuzzy
+#: actions/showgroup.php:490
 msgid "Admins"
-msgstr "Admin"
+msgstr "Admins"
 
 #: actions/showmessage.php:81
 msgid "No such message."
@@ -3601,29 +3582,29 @@ msgid " tagged %s"
 msgstr "  tagged %s"
 
 #: actions/showstream.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s, page %2$d"
-msgstr "%1$s and friends, page %2$d"
+msgstr "%1$s, page %2$d"
 
 #: actions/showstream.php:122
-#, fuzzy, php-format
+#, php-format
 msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)"
-msgstr "Notice feed for %s tagged %s (RSS 1.0)"
+msgstr "Notice feed for %1$s tagged %2$s (RSS 1.0)"
 
 #: actions/showstream.php:129
-#, fuzzy, php-format
+#, php-format
 msgid "Notice feed for %s (RSS 1.0)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for %s (RSS 1.0)"
 
 #: actions/showstream.php:136
-#, fuzzy, php-format
+#, php-format
 msgid "Notice feed for %s (RSS 2.0)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for %s (RSS 2.0)"
 
 #: actions/showstream.php:143
-#, fuzzy, php-format
+#, php-format
 msgid "Notice feed for %s (Atom)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for %s (Atom)"
 
 #: actions/showstream.php:148
 #, php-format
@@ -3631,10 +3612,9 @@ msgid "FOAF for %s"
 msgstr "FOAF for %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 ""
-"This is the timeline for %s and friends but no one has posted anything yet."
+msgstr "This is the timeline for %1$s but %2$s hasn't posted anything yet."
 
 #: actions/showstream.php:205
 msgid ""
@@ -3643,13 +3623,13 @@ msgid ""
 msgstr ""
 
 #: 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 ""
-"You can try to [nudge %s](../%s) from his profile or [post something to his "
-"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)."
+"You can try to nudge %1$s or [post something to his or her attention](%%%%"
+"action.newnotice%%%%?status_textarea=%2$s)."
 
 #: actions/showstream.php:243
 #, php-format
@@ -3672,19 +3652,17 @@ msgstr ""
 "[StatusNet](http://status.net/) tool. "
 
 #: actions/showstream.php:305
-#, fuzzy, php-format
+#, php-format
 msgid "Repeat of %s"
-msgstr "Replies to %s"
+msgstr "Repeat of %s"
 
 #: actions/silence.php:65 actions/unsilence.php:65
-#, fuzzy
 msgid "You cannot silence users on this site."
-msgstr "You can't send a message to this user."
+msgstr "You cannot silence users on this site."
 
 #: actions/silence.php:72
-#, fuzzy
 msgid "User is already silenced."
-msgstr "User is already blocked from group."
+msgstr "User is already silenced."
 
 #: actions/siteadminpanel.php:69
 msgid "Basic settings for this StatusNet site."
@@ -3695,9 +3673,8 @@ msgid "Site name must have non-zero length."
 msgstr ""
 
 #: actions/siteadminpanel.php:140
-#, fuzzy
 msgid "You must have a valid contact email address."
-msgstr "Not a valid e-mail address."
+msgstr "You must have a valid contact email address."
 
 #: actions/siteadminpanel.php:158
 #, php-format
@@ -3757,9 +3734,8 @@ msgid "Contact email address for your site"
 msgstr "Contact e-mail address for your site"
 
 #: actions/siteadminpanel.php:263
-#, fuzzy
 msgid "Local"
-msgstr "Local views"
+msgstr "Local"
 
 #: actions/siteadminpanel.php:274
 msgid "Default timezone"
@@ -3830,9 +3806,8 @@ msgid "How long users must wait (in seconds) to post the same thing again."
 msgstr ""
 
 #: actions/smssettings.php:58
-#, fuzzy
 msgid "SMS settings"
-msgstr "SMS Settings"
+msgstr "SMS settings"
 
 #: actions/smssettings.php:69
 #, php-format
@@ -3861,16 +3836,14 @@ msgid "Enter the code you received on your phone."
 msgstr "Enter the code you received on your phone."
 
 #: actions/smssettings.php:138
-#, fuzzy
 msgid "SMS phone number"
-msgstr "SMS Phone number"
+msgstr "SMS phone number"
 
 #: actions/smssettings.php:140
 msgid "Phone number, no punctuation or spaces, with area code"
 msgstr "Phone number, no punctuation or spaces, with area code"
 
 #: actions/smssettings.php:174
-#, fuzzy
 msgid ""
 "Send me notices through SMS; I understand I may incur exorbitant charges "
 "from my carrier."
@@ -3883,7 +3856,6 @@ msgid "No phone number."
 msgstr "No phone number."
 
 #: actions/smssettings.php:311
-#, fuzzy
 msgid "No carrier selected."
 msgstr "No carrier selected."
 
@@ -3896,13 +3868,12 @@ msgid "That phone number already belongs to another user."
 msgstr "That phone number already belongs to another user."
 
 #: 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."
 msgstr ""
-"A confirmation code was sent to the phone number you added. Check your inbox "
-"(and spam box!) for the code and instructions on how to use it."
+"A confirmation code was sent to the phone number you added. Check your phone "
+"for the code and instructions on how to use it."
 
 #: actions/smssettings.php:374
 msgid "That is the wrong confirmation number."
@@ -3913,23 +3884,21 @@ msgid "That is not your phone number."
 msgstr "That is not your phone number."
 
 #: actions/smssettings.php:465
-#, fuzzy
 msgid "Mobile carrier"
 msgstr "Mobile carrier"
 
 #: actions/smssettings.php:469
-#, fuzzy
 msgid "Select a carrier"
 msgstr "Select a carrier"
 
 #: actions/smssettings.php:476
-#, fuzzy, php-format
+#, 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 ""
-"Mobile carrier for your phone. If you know a carrier that accepts SMS over e-"
-"mail but isn't listed here, send e-mail to let us know at %s."
+"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."
 
 #: actions/smssettings.php:498
 msgid "No code entered"
@@ -3939,15 +3908,24 @@ msgstr "No code entered"
 msgid "You are not subscribed to that profile."
 msgstr "You are not subscribed to that profile."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Could not save subscription."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Not a local user."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "No such profile."
+
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "You cannot subscribe to an OMB 0.1 remote profile with this action."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subscribed"
 
@@ -3957,9 +3935,9 @@ msgid "%s subscribers"
 msgstr "%s subscribers"
 
 #: actions/subscribers.php:52
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s subscribers, page %2$d"
-msgstr "%s subscribers, page %d"
+msgstr "%1$s subscribers, page %2$d"
 
 #: actions/subscribers.php:63
 msgid "These are the people who listen to your notices."
@@ -3994,9 +3972,9 @@ msgid "%s subscriptions"
 msgstr "%s subscriptions"
 
 #: actions/subscriptions.php:54
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s subscriptions, page %2$d"
-msgstr "%s subscriptions, page %d"
+msgstr "%1$s subscriptions, page %2$d"
 
 #: actions/subscriptions.php:65
 msgid "These are the people whose notices you listen to."
@@ -4007,7 +3985,7 @@ msgstr "These are the people whose notices you listen to."
 msgid "These are the people whose notices %s listens to."
 msgstr "These are the people whose notices %s listens to."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4017,43 +3995,42 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s is not listening to anyone."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
-#, fuzzy, php-format
+#: actions/tag.php:69
+#, php-format
 msgid "Notices tagged with %1$s, page %2$d"
-msgstr "Users self-tagged with %s - page %d"
+msgstr "Notices tagged with %1$s, page %2$d"
 
-#: actions/tag.php:86
-#, fuzzy, php-format
+#: actions/tag.php:87
+#, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for tag %s (RSS 1.0)"
 
-#: actions/tag.php:92
-#, fuzzy, php-format
+#: actions/tag.php:93
+#, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for tag %s (RSS 2.0)"
 
-#: actions/tag.php:98
-#, fuzzy, php-format
+#: actions/tag.php:99
+#, php-format
 msgid "Notice feed for tag %s (Atom)"
-msgstr "Notice feed for %s"
+msgstr "Notice feed for tag %s (Atom)"
 
 #: actions/tagother.php:39
-#, fuzzy
 msgid "No ID argument."
-msgstr "No id argument."
+msgstr "No ID argument."
 
 #: actions/tagother.php:65
 #, php-format
@@ -4099,24 +4076,21 @@ msgstr "Use this form to add tags to your subscribers or subscriptions."
 msgid "No such tag."
 msgstr "No such tag."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API method under construction."
 
 #: actions/unblock.php:59
-#, fuzzy
 msgid "You haven't blocked that user."
-msgstr "You have already blocked this user."
+msgstr "You haven't blocked that user."
 
 #: actions/unsandbox.php:72
-#, fuzzy
 msgid "User is not sandboxed."
-msgstr "User has blocked you."
+msgstr "User is not sandboxed."
 
 #: actions/unsilence.php:72
-#, fuzzy
 msgid "User is not silenced."
-msgstr "User has no profile."
+msgstr "User is not silenced."
 
 #: actions/unsubscribe.php:77
 msgid "No profile id in request."
@@ -4127,79 +4101,78 @@ msgid "Unsubscribed"
 msgstr "Unsubscribed"
 
 #: actions/updateprofile.php:62 actions/userauthorization.php:337
-#, fuzzy, php-format
+#, php-format
 msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
-msgstr "Notice licence ‘%s’ is not compatible with site licence ‘%s’."
+msgstr ""
+"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "User"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profile"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "New users"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Default subscription"
 
-#: actions/useradminpanel.php:241
-#, fuzzy
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
-msgstr ""
-"Automatically subscribe to whoever subscribes to me (best for non-humans)"
+msgstr "Automatically subscribe new users to this user."
 
-#: actions/useradminpanel.php:250
-#, fuzzy
+#: actions/useradminpanel.php:251
 msgid "Invitations"
-msgstr "Invitation(s) sent"
+msgstr "Invitations"
 
-#: actions/useradminpanel.php:255
-#, fuzzy
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
-msgstr "Invitation(s) sent"
+msgstr "Invitations enabled"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4208,15 +4181,14 @@ msgid "Authorize subscription"
 msgstr "Authorise subscription"
 
 #: actions/userauthorization.php:110
-#, fuzzy
 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 ""
 "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 \"Cancel\"."
+"user’s notices. If you didn’t just ask to subscribe to someone’s notices, "
+"click “Reject”."
 
 #: actions/userauthorization.php:196 actions/version.php:165
 msgid "License"
@@ -4248,14 +4220,13 @@ msgid "Subscription authorized"
 msgstr "Subscription authorised"
 
 #: 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 ""
-"The subscription has been authorised, but no callback URL was passed. Check "
-"with the site's instructions for details on how to authorise the "
+"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:"
 
 #: actions/userauthorization.php:266
@@ -4263,14 +4234,13 @@ msgid "Subscription rejected"
 msgstr "Subscription rejected"
 
 #: 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 ""
 "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 "
+"with the sites instructions for details on how to fully reject the "
 "subscription."
 
 #: actions/userauthorization.php:303
@@ -4299,19 +4269,18 @@ msgid "Avatar URL ‘%s’ is not valid."
 msgstr ""
 
 #: actions/userauthorization.php:350
-#, fuzzy, php-format
+#, php-format
 msgid "Can’t read avatar URL ‘%s’."
-msgstr "Can't read avatar URL '%s'"
+msgstr "Can’t read avatar URL ‘%s’."
 
 #: actions/userauthorization.php:355
-#, fuzzy, php-format
+#, php-format
 msgid "Wrong image type for avatar URL ‘%s’."
-msgstr "Wrong image type for '%s'"
+msgstr "Wrong image type for avatar URL ‘%s’."
 
 #: actions/userdesignsettings.php:76 lib/designsettings.php:65
-#, fuzzy
 msgid "Profile design"
-msgstr "Profile settings"
+msgstr "Profile design"
 
 #: actions/userdesignsettings.php:87 lib/designsettings.php:76
 msgid ""
@@ -4324,19 +4293,18 @@ msgid "Enjoy your hotdog!"
 msgstr ""
 
 #: actions/usergroups.php:64
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s groups, page %2$d"
-msgstr "%s group members, page %d"
+msgstr "%1$s groups, page %2$d"
 
 #: actions/usergroups.php:130
-#, fuzzy
 msgid "Search for more groups"
-msgstr "Search for people or text"
+msgstr "Search for more groups"
 
 #: actions/usergroups.php:153
-#, fuzzy, php-format
+#, php-format
 msgid "%s is not a member of any group."
-msgstr "You are not a member of that group."
+msgstr "%s is not a member of any group."
 
 #: actions/usergroups.php:158
 #, php-format
@@ -4344,9 +4312,9 @@ msgid "Try [searching for groups](%%action.groupsearch%%) and joining them."
 msgstr ""
 
 #: actions/version.php:73
-#, fuzzy, php-format
+#, php-format
 msgid "StatusNet %s"
-msgstr "Statistics"
+msgstr "StatusNet %s"
 
 #: actions/version.php:153
 #, php-format
@@ -4396,10 +4364,9 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
-#, fuzzy
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
-msgstr "Personal"
+msgstr "Version"
 
 #: actions/version.php:197
 msgid "Author(s)"
@@ -4423,29 +4390,29 @@ msgid "A file this large would exceed your monthly quota of %d bytes."
 msgstr ""
 
 #: classes/Group_member.php:41
-#, fuzzy
 msgid "Group join failed."
-msgstr "Group profile"
+msgstr "Group join failed."
 
 #: classes/Group_member.php:53
-#, fuzzy
 msgid "Not part of group."
-msgstr "Could not update group."
+msgstr "Not part of group."
 
 #: classes/Group_member.php:60
-#, fuzzy
 msgid "Group leave failed."
-msgstr "Group profile"
+msgstr "Group leave failed."
+
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Could not update local group."
 
 #: classes/Login_token.php:76
-#, fuzzy, php-format
+#, php-format
 msgid "Could not create login token for %s"
-msgstr "Could not create aliases"
+msgstr "Could not create login token for %s"
 
 #: classes/Message.php:45
-#, fuzzy
 msgid "You are banned from sending direct messages."
-msgstr "Error sending direct message."
+msgstr "You are banned from sending direct messages."
 
 #: classes/Message.php:61
 msgid "Could not insert message."
@@ -4455,70 +4422,96 @@ msgstr "Could not insert message."
 msgid "Could not update message with new URI."
 msgstr "Could not update message with new URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "DB error inserting hashtag: %s"
 
-#: classes/Notice.php:214
-#, fuzzy
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
-msgstr "Problem saving notice."
+msgstr "Problem saving notice. Too long."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem saving notice. Unknown user."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
-#, fuzzy
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; 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."
+"Too many duplicate messages too quickly; take a breather and post again in a "
+"few minutes."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "You are banned from posting notices on this site."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problem saving notice."
 
-#: classes/Notice.php:788
-#, fuzzy
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
-msgstr "Problem saving notice."
+msgstr "Problem saving group inbox."
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1442
 #, php-format
-msgid "DB error inserting reply: %s"
-msgstr "DB error inserting reply: %s"
-
-#: classes/Notice.php:1271
-#, fuzzy, 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."
+msgstr "You have been banned from subscribing."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "User has blocked you."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Not subscribed!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Couldn't delete self-subscription."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Couldn't delete subscription."
 
-#: classes/User.php:385
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Welcome to %1$s, @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Could not create group."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Could not set group URI."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Could not set group membership."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Could not save local group info."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Change your profile settings"
@@ -4548,9 +4541,9 @@ msgid "Other options"
 msgstr "Other options"
 
 #: 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"
@@ -4560,122 +4553,190 @@ msgstr "Untitled page"
 msgid "Primary site navigation"
 msgstr "Primary site navigation"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Home"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personal profile and friends timeline"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Change your e-mail, avatar, password, profile"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Connect"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Account"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr "Could not redirect to server: %s"
+msgstr "Connect to services"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Connect"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr "Primary site navigation"
+msgstr "Change site configuration"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invite"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Admin"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Logout"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invite"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logout from the site"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Logout"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Create an account"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Register"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Login to the site"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Help"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Login"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Help me!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Search"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Help"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Search for people or text"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Search"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Site notice"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Local views"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Page notice"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Secondary site navigation"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Help"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "About"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "F.A.Q."
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Source"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Badge"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet software licence"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4684,12 +4745,12 @@ msgstr ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** is a microblogging service."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4700,103 +4761,157 @@ msgstr ""
 "s, available under the [GNU Affero General Public Licence](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Site content license"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "After"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Before"
 
-#: lib/adminpanelaction.php:96
-#, fuzzy
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "You can't send a message to this user."
+msgstr "You cannot make changes to this site."
 
-#: lib/adminpanelaction.php:107
-#, fuzzy
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
-msgstr "Registration not allowed."
+msgstr "Changes to that panel are not allowed."
 
-#: lib/adminpanelaction.php:206
-#, fuzzy
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
-msgstr "Command not yet implemented."
+msgstr "showForm() not implemented."
 
-#: lib/adminpanelaction.php:235
-#, fuzzy
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
-msgstr "Command not yet implemented."
+msgstr "saveSettings() not implemented."
 
-#: lib/adminpanelaction.php:258
-#, fuzzy
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
-msgstr "Unable to save your design settings!"
+msgstr "Unable to delete design setting."
 
-#: lib/adminpanelaction.php:312
-#, fuzzy
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
-msgstr "E-mail address confirmation"
+msgstr "Basic site configuration"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Design configuration"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
 #, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Design"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
-msgstr "SMS confirmation"
+msgstr "User configuration"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
 #, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "User"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
-msgstr "Design configuration"
+msgstr "Access configuration"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
-msgstr "SMS confirmation"
+msgstr "Paths configuration"
 
-#: lib/adminpanelaction.php:337
-#, fuzzy
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 msgid "Sessions configuration"
-msgstr "Design configuration"
+msgstr "Sessions configuration"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Version"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4810,24 +4925,21 @@ msgid "Icon for this application"
 msgstr ""
 
 #: lib/applicationeditform.php:204
-#, fuzzy, php-format
+#, php-format
 msgid "Describe your application in %d characters"
-msgstr "Describe the group or topic in %d characters"
+msgstr "Describe your application in %d characters"
 
 #: lib/applicationeditform.php:207
-#, fuzzy
 msgid "Describe your application"
-msgstr "Describe the group or topic"
+msgstr "Describe your application"
 
 #: lib/applicationeditform.php:216
-#, fuzzy
 msgid "Source URL"
-msgstr "Source"
+msgstr "Source URL"
 
 #: lib/applicationeditform.php:218
-#, fuzzy
 msgid "URL of the homepage of this application"
-msgstr "URL of the homepage or blog of the group or topic"
+msgstr "URL of the homepage of this application"
 
 #: lib/applicationeditform.php:224
 msgid "Organization responsible for this application"
@@ -4866,9 +4978,8 @@ msgid "Default access for this application: read-only, or read-write"
 msgstr ""
 
 #: lib/applicationlist.php:154
-#, fuzzy
 msgid "Revoke"
-msgstr "Remove"
+msgstr "Revoke"
 
 #: lib/attachmentlist.php:87
 msgid "Attachments"
@@ -4879,9 +4990,8 @@ msgid "Author"
 msgstr ""
 
 #: lib/attachmentlist.php:278
-#, fuzzy
 msgid "Provider"
-msgstr "Profile"
+msgstr "Provider"
 
 #: lib/attachmentnoticesection.php:67
 msgid "Notices where this attachment appears"
@@ -4891,15 +5001,13 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
-#, fuzzy
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
-msgstr "Password change"
+msgstr "Password changing failed"
 
-#: lib/authenticationplugin.php:233
-#, fuzzy
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
-msgstr "Password change"
+msgstr "Password changing is not allowed"
 
 #: lib/channel.php:138 lib/channel.php:158
 msgid "Command results"
@@ -4940,9 +5048,8 @@ msgid ""
 msgstr ""
 
 #: lib/command.php:152 lib/command.php:390 lib/command.php:451
-#, fuzzy
 msgid "Notice with that id does not exist"
-msgstr "No profile with that id."
+msgstr "Notice with that id does not exist"
 
 #: lib/command.php:168 lib/command.php:406 lib/command.php:467
 #: lib/command.php:523
@@ -5020,14 +5127,13 @@ msgid "Already repeated that notice"
 msgstr "Already repeated that notice."
 
 #: lib/command.php:426
-#, fuzzy, php-format
+#, php-format
 msgid "Notice from %s repeated"
-msgstr "Notice posted"
+msgstr "Notice from %s repeated"
 
 #: lib/command.php:428
-#, fuzzy
 msgid "Error repeating notice."
-msgstr "Error saving notice."
+msgstr "Error repeating notice."
 
 #: lib/command.php:482
 #, php-format
@@ -5047,83 +5153,89 @@ msgstr "Error saving notice."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Specify the name of the user to subscribe to"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "No such user."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Subscribed to %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Specify the name of the user to unsubscribe from"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Unsubscribed from %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Command not yet implemented."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notification off."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Can't turn off notification."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notification on."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Can't turn on notification."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
-#, fuzzy
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Unsubscribed  %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
-msgstr "You are not subscribed to that profile."
+msgstr "You are not subscribed to anyone."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "You are already subscribed to these users:"
 msgstr[1] "You are already subscribed to these users:"
 
-#: lib/command.php:690
-#, fuzzy
+#: lib/command.php:731
 msgid "No one is subscribed to you."
-msgstr "Could not subscribe other to you."
+msgstr "No one is subscribed to you."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Could not subscribe other to you."
 msgstr[1] "Could not subscribe other to you."
 
-#: lib/command.php:712
-#, fuzzy
+#: lib/command.php:753
 msgid "You are not a member of any groups."
-msgstr "You are not a member of that group."
+msgstr "You are not a member of any groups."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "You are not a member of that group."
 msgstr[1] "You are not a member of that group."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5137,6 +5249,7 @@ msgid ""
 "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"
@@ -5164,19 +5277,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "No configuration file found"
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Go to the installer."
 
@@ -5193,9 +5306,8 @@ msgid "Updates by SMS"
 msgstr "Updates by SMS"
 
 #: lib/connectsettingsaction.php:120
-#, fuzzy
 msgid "Connections"
-msgstr "Connect"
+msgstr "Connections"
 
 #: lib/connectsettingsaction.php:121
 msgid "Authorized connected applications"
@@ -5206,15 +5318,14 @@ msgid "Database error"
 msgstr ""
 
 #: lib/designsettings.php:105
-#, fuzzy
 msgid "Upload file"
-msgstr "Upload"
+msgstr "Upload file"
 
 #: lib/designsettings.php:109
-#, fuzzy
 msgid ""
 "You can upload your personal background image. The maximum file size is 2MB."
-msgstr "You can upload your personal avatar. The maximum file size is %s."
+msgstr ""
+"You can upload your personal background image. The maximum file size is 2MB."
 
 #: lib/designsettings.php:418
 msgid "Design defaults restored."
@@ -5366,23 +5477,23 @@ msgstr "System error uploading file."
 msgid "Not an image or corrupt file."
 msgstr "Not an image or corrupt file."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Unsupported image file format."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Lost our file."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Unknown file type"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5464,11 +5575,9 @@ msgstr ""
 "Change your email address or notification options at %8$s\n"
 
 #: lib/mail.php:258
-#, fuzzy, php-format
+#, php-format
 msgid "Bio: %s"
-msgstr ""
-"Bio: %s\n"
-"\n"
+msgstr "Bio: %s"
 
 #: lib/mail.php:286
 #, php-format
@@ -5606,8 +5715,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
-#, fuzzy
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "from"
 
@@ -5628,9 +5736,9 @@ msgid "Sorry, no incoming email allowed."
 msgstr "Sorry, no incoming e-mail allowed."
 
 #: lib/mailhandler.php:228
-#, fuzzy, php-format
+#, php-format
 msgid "Unsupported message type: %s"
-msgstr "Unsupported image file format."
+msgstr "Unsupported message type: %s"
 
 #: lib/mediafile.php:98 lib/mediafile.php:123
 msgid "There was a database error while saving your file. Please try again."
@@ -5671,9 +5779,8 @@ msgid "File could not be moved to destination directory."
 msgstr ""
 
 #: lib/mediafile.php:201 lib/mediafile.php:237
-#, fuzzy
 msgid "Could not determine file's MIME type."
-msgstr "Could not retrieve public stream."
+msgstr "Could not determine file's MIME type."
 
 #: lib/mediafile.php:270
 #, php-format
@@ -5697,6 +5804,11 @@ msgstr "To"
 msgid "Available characters"
 msgstr "Available characters"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Send"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Send a notice"
@@ -5715,14 +5827,12 @@ msgid "Attach a file"
 msgstr ""
 
 #: lib/noticeform.php:212
-#, fuzzy
 msgid "Share my location"
-msgstr "Couldn't save tags."
+msgstr "Share my location"
 
 #: lib/noticeform.php:215
-#, fuzzy
 msgid "Do not share my location"
-msgstr "Couldn't save tags."
+msgstr "Do not share my location"
 
 #: lib/noticeform.php:216
 msgid ""
@@ -5730,53 +5840,50 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
-#, fuzzy
+#: lib/noticelist.php:430
 msgid "N"
-msgstr "No"
+msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "in context"
 
-#: lib/noticelist.php:572
-#, fuzzy
+#: lib/noticelist.php:601
 msgid "Repeated by"
-msgstr "Created"
+msgstr "Repeated by"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Reply to this notice"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Reply"
 
-#: lib/noticelist.php:641
-#, fuzzy
+#: lib/noticelist.php:673
 msgid "Notice repeated"
-msgstr "Notice deleted."
+msgstr "Notice repeated"
 
 #: lib/nudgeform.php:116
 msgid "Nudge this user"
@@ -5806,10 +5913,6 @@ msgstr "Error inserting remote profile."
 msgid "Duplicate notice"
 msgstr "Duplicate notice"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "You have been banned from subscribing."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Couldn't insert new subscription."
@@ -5826,6 +5929,10 @@ msgstr "Replies"
 msgid "Favorites"
 msgstr "Favourites"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "User"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Inbox"
@@ -5848,9 +5955,8 @@ msgid "Tags in %s's notices"
 msgstr "Tags in %s's notices"
 
 #: lib/plugin.php:114
-#, fuzzy
 msgid "Unknown"
-msgstr "Unknown action"
+msgstr "Unknown"
 
 #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82
 msgid "Subscriptions"
@@ -5881,9 +5987,8 @@ msgid "All groups"
 msgstr "All groups"
 
 #: lib/profileformaction.php:123
-#, fuzzy
 msgid "No return-to arguments."
-msgstr "No id argument."
+msgstr "No return-to arguments."
 
 #: lib/profileformaction.php:137
 msgid "Unimplemented method."
@@ -5910,16 +6015,14 @@ msgid "Popular"
 msgstr "Popular"
 
 #: lib/repeatform.php:107
-#, fuzzy
 msgid "Repeat this notice?"
-msgstr "Reply to this notice"
+msgstr "Repeat this notice?"
 
 #: lib/repeatform.php:132
-#, fuzzy
 msgid "Repeat this notice"
-msgstr "Reply to this notice"
+msgstr "Repeat this notice"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5932,14 +6035,17 @@ msgid "Sandbox this user"
 msgstr "Sandbox this user"
 
 #: lib/searchaction.php:120
-#, fuzzy
 msgid "Search site"
-msgstr "Search"
+msgstr "Search site"
 
 #: lib/searchaction.php:126
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Search"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Search help"
@@ -5991,35 +6097,14 @@ msgstr "People subscribed to %s"
 msgid "Groups %s is a member of"
 msgstr "Groups %s is a member of"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "User has blocked you."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Could not subscribe."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Could not subscribe other to you."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Not subscribed!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Couldn't delete subscription."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invite"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Couldn't delete subscription."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Invite friends and colleagues to join you on %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6071,67 +6156,67 @@ msgstr "Edit Avatar"
 msgid "User actions"
 msgstr "User actions"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Edit profile settings"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Send a direct message to this user"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Message"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "a few seconds ago"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "about a minute ago"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "about %d minutes ago"
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "about an hour ago"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "about %d hours ago"
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "about a day ago"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "about %d days ago"
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "about a month ago"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "about %d months ago"
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "about a year ago"
 
@@ -6146,6 +6231,6 @@ msgid "%s is not a valid color! Use 3 or 6 hex chars."
 msgstr "%s is not a valid colour! Use 3 or 6 hex chars."
 
 #: lib/xmppmanager.php:402
-#, fuzzy, php-format
+#, php-format
 msgid "Message too long - maximum is %1$d characters, you sent %2$d."
-msgstr "Message too long - maximum is %d characters, you sent %d"
+msgstr "Message too long - maximum is %1$d characters, you sent %2$d."
index 0d7c9384a1acb77266961df2b87d37ec49849cf0..fe861905dbe7bc820350fa0c126ae3f53659a251 100644 (file)
@@ -3,6 +3,7 @@
 # Author@translatewiki.net: Brion
 # Author@translatewiki.net: Crazymadlover
 # Author@translatewiki.net: McDutchie
+# Author@translatewiki.net: PerroVerd
 # Author@translatewiki.net: Peter17
 # Author@translatewiki.net: Translationista
 # --
@@ -12,75 +13,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:06:23+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:39+0000\n"
 "Language-Team: Spanish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Acceder"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Configuración de acceso de la web"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registro"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privado"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "¿Prohibir a los usuarios anónimos (no conectados) ver el sitio?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Invitar sólo"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privado"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Haz que el registro sea sólo con invitaciones."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Cerrado"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Invitar sólo"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Inhabilitar nuevos registros."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Guardar"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Cerrado"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Guardar la configuración de acceso"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Guardar"
+
+#. 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 "No existe tal página"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -94,46 +102,53 @@ msgstr "No existe tal página"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "No existe ese usuario."
 
-#: actions/all.php:84
+#. 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 y amigos, página %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s y amigos"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed de los amigos de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed de los amigos de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed de los amigos de %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -141,7 +156,7 @@ msgstr ""
 "Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada "
 "todavía."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -150,7 +165,8 @@ msgstr ""
 "Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada "
 "todavía."
 
-#: actions/all.php:134
+#. 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 "
@@ -159,7 +175,7 @@ msgstr ""
 "Trata de suscribirte a más personas, [unirte a un grupo] (%%action.groups%%) "
 "o publicar algo."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -168,7 +184,8 @@ msgstr ""
 "Puede intentar [guiñar a %1$s](../%2$s) desde su perfil o [publicar algo a "
 "su atención ](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Tú y amigos"
 
@@ -186,20 +203,20 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!"
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método de API no encontrado."
 
@@ -233,8 +250,9 @@ msgstr "No se pudo actualizar el usuario."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "El usuario no tiene un perfil."
 
@@ -260,7 +278,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -370,7 +388,7 @@ msgstr "No se pudo determinar el usuario fuente."
 msgid "Could not find target user."
 msgstr "No se pudo encontrar ningún usuario de destino."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -378,62 +396,62 @@ msgstr ""
 "El usuario debe tener solamente letras minúsculas y números y no puede tener "
 "espacios."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "El usuario ya existe. Prueba con otro."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Usuario inválido"
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "La página de inicio no es un URL válido."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Tu nombre es demasiado largo (max. 255 carac.)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "La descripción es demasiado larga (máx. %d caracteres)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "La ubicación es demasiado larga (máx. 255 caracteres)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "¡Muchos seudónimos! El máximo es %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Alias inválido: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "El alias \"%s\" ya está en uso. Intenta usar otro."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "El alias no puede ser el mismo que el usuario."
@@ -444,15 +462,15 @@ msgstr "El alias no puede ser el mismo que el usuario."
 msgid "Group not found!"
 msgstr "¡No se ha encontrado el grupo!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Ya eres miembro de ese grupo"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Has sido bloqueado de ese grupo por el administrador."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "No se pudo unir el usuario %s al grupo %s"
@@ -461,7 +479,7 @@ msgstr "No se pudo unir el usuario %s al grupo %s"
 msgid "You are not a member of this group."
 msgstr "No eres miembro de este grupo."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "No se pudo eliminar al usuario %1$s del grupo %2$s."
@@ -492,7 +510,7 @@ msgstr "Token inválido."
 #: 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:309
+#: 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
@@ -501,7 +519,7 @@ msgstr "Token inválido."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -538,7 +556,7 @@ msgstr "El token de solicitud %2 ha sido denegado y revocado."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -564,13 +582,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Cuenta"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -654,12 +672,12 @@ 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "línea temporal de %s"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -695,7 +713,7 @@ msgstr "Repetido a %s"
 msgid "Repeats of %s"
 msgstr "Repeticiones de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Avisos marcados con %s"
@@ -716,8 +734,7 @@ msgstr "No existe tal archivo adjunto."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Ningún apodo."
 
@@ -729,7 +746,7 @@ msgstr "Ningún tamaño."
 msgid "Invalid size."
 msgstr "Tamaño inválido."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -746,30 +763,30 @@ msgid "User without matching profile"
 msgstr "Usuario sin perfil equivalente"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Configuración de Avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Vista previa"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Borrar"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Cargar"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Cortar"
 
@@ -777,7 +794,7 @@ msgstr "Cortar"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Elige un área cuadrada de la imagen para que sea tu avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Se perdió nuestros datos de archivo."
 
@@ -812,22 +829,22 @@ msgstr ""
 "te notificará de ninguna de sus respuestas @."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "No bloquear a este usuario"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Sí"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Bloquear este usuario."
 
@@ -835,40 +852,44 @@ msgstr "Bloquear este usuario."
 msgid "Failed to save block information."
 msgstr "No se guardó información de bloqueo."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "No existe ese grupo."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s perfiles bloqueados"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s perfiles bloqueados, página %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 "Una lista de los usuarios que han sido bloqueados para unirse a este grupo."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Desbloquear usuario de grupo"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Desbloquear"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Desbloquear este usuario"
 
@@ -943,7 +964,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Hubo problemas con tu clave de sesión."
 
@@ -969,12 +990,13 @@ msgstr "No eliminar esta aplicación"
 msgid "Delete this application"
 msgstr "Borrar esta aplicación"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "No conectado."
@@ -1003,7 +1025,7 @@ msgstr "¿Estás seguro de que quieres eliminar este aviso?"
 msgid "Do not delete this notice"
 msgstr "No eliminar este mensaje"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Borrar este aviso"
 
@@ -1019,7 +1041,7 @@ msgstr "Sólo puedes eliminar usuarios locales."
 msgid "Delete user"
 msgstr "Borrar usuario"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1027,12 +1049,12 @@ msgstr ""
 "¿Realmente deseas eliminar este usuario? Esto borrará de la base de datos "
 "todos los datos sobre el usuario, sin dejar una copia de seguridad."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Borrar este usuario"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Diseño"
 
@@ -1135,6 +1157,17 @@ msgstr "Restaurar los diseños predeterminados"
 msgid "Reset back to default"
 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/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 "Guardar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Guardar el diseño"
@@ -1226,29 +1259,29 @@ msgstr "Editar grupo %s"
 msgid "You must be logged in to create a group."
 msgstr "Debes estar conectado para crear un grupo"
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Para editar el grupo debes ser administrador."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Usa este formulario para editar el grupo."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "La descripción es muy larga (máx. %d caracteres)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "No se pudo actualizar el grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "No fue posible crear alias."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Se guardó Opciones."
 
@@ -1591,7 +1624,7 @@ msgstr "Usuario ya está bloqueado del grupo."
 msgid "User is not a member of group."
 msgstr "Usuario no es miembro del grupo"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Bloquear usuario de grupo"
 
@@ -1628,11 +1661,11 @@ msgstr "Sin ID."
 msgid "You must be logged in to edit a group."
 msgstr "Debes estar conectado para editar un grupo."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Diseño de grupo"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1640,20 +1673,20 @@ msgstr ""
 "Personaliza el aspecto de tu grupo con una imagen de fondo y la paleta de "
 "colores que prefieras."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "No fue posible actualizar tu diseño."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Preferencias de diseño guardadas."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo de grupo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1661,57 +1694,57 @@ msgstr ""
 "Puedes subir una imagen de logo para tu grupo. El tamaño máximo del archivo "
 "debe ser %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Usuario sin perfil coincidente."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Elige un área cuadrada de la imagen para que sea tu logo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo actualizado."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Error al actualizar el logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Miembros del grupo %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s miembros de grupo, página %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Lista de los usuarios en este grupo."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Admin"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloquear"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Convertir al usuario en administrador del grupo"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Convertir en administrador"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Convertir a este usuario en administrador"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1975,16 +2008,19 @@ msgstr "Mensaje Personal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Opcionalmente añada un mensaje personalizado a su invitación."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Enviar"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s te ha invitado a que te unas con el/ellos en %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2045,7 +2081,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Debes estar conectado para unirte a un grupo."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Ningún apodo."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s se ha unido al grupo %2$"
@@ -2054,11 +2095,11 @@ msgstr "%1$s se ha unido al grupo %2$"
 msgid "You must be logged in to leave a group."
 msgstr "Debes estar conectado para dejar un grupo."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "No eres miembro de este grupo."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s ha dejado el grupo %2$s"
@@ -2075,8 +2116,7 @@ msgstr "Nombre de usuario o contraseña incorrectos."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Error al configurar el usuario. Posiblemente no tengas autorización."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Inicio de sesión"
 
@@ -2334,8 +2374,8 @@ msgstr "tipo de contenido "
 msgid "Only "
 msgstr "Sólo "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "No es un formato de dato soportado"
 
@@ -2475,9 +2515,9 @@ msgstr "No se puede guardar la nueva contraseña."
 msgid "Password saved."
 msgstr "Se guardó Contraseña."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
-msgstr ""
+msgstr "Rutas"
 
 #: actions/pathsadminpanel.php:70
 msgid "Path and server settings for this StatusNet site."
@@ -2508,7 +2548,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Servidor SSL no válido. La longitud máxima es de 255 caracteres."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Sitio"
 
@@ -2522,7 +2561,7 @@ msgstr ""
 
 #: actions/pathsadminpanel.php:242
 msgid "Path"
-msgstr ""
+msgstr "Ruta"
 
 #: actions/pathsadminpanel.php:242
 #, fuzzy
@@ -2624,7 +2663,7 @@ msgstr "Servidor SSL"
 
 #: actions/pathsadminpanel.php:336
 msgid "Server to direct SSL requests to"
-msgstr ""
+msgstr "Servidor hacia el cual dirigir las solicitudes SSL"
 
 #: actions/pathsadminpanel.php:352
 #, fuzzy
@@ -2684,7 +2723,7 @@ msgstr ""
 "1-64 letras en minúscula o números, sin signos de puntuación o espacios"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nombre completo"
@@ -2712,7 +2751,7 @@ msgid "Bio"
 msgstr "Biografía"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2724,7 +2763,7 @@ msgstr "Dónde estás, por ejemplo \"Ciudad, Estado (o Región), País\""
 
 #: actions/profilesettings.php:138
 msgid "Share my current location when posting notices"
-msgstr ""
+msgstr "Compartir mi ubicación actual al publicar los mensajes"
 
 #: actions/profilesettings.php:145 actions/tagother.php:149
 #: actions/tagother.php:209 lib/subscriptionlist.php:106
@@ -2778,23 +2817,24 @@ msgstr "Idioma es muy largo ( max 50 car.)"
 msgid "Invalid tag: \"%s\""
 msgstr "Etiqueta inválida: \"% s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "No se pudo actualizar el usuario para autosuscribirse."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "No se han podido guardar las preferencias de ubicación."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "No se pudo guardar el perfil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "No se pudo guardar las etiquetas."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Se guardó configuración."
 
@@ -2807,31 +2847,31 @@ msgstr "Más allá del límite de páginas (%s)"
 msgid "Could not retrieve public stream."
 msgstr "No se pudo acceder a corriente pública."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Línea temporal pública, página %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Línea temporal pública"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Feed del flujo público"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Feed del flujo público"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Feed del flujo público"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2840,17 +2880,17 @@ msgstr ""
 "Esta es la línea temporal pública de %%site.name%%, pero aún no se ha "
 "publicado nada."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "¡Sé la primera persona en publicar algo!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2859,7 +2899,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2893,6 +2933,8 @@ msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post "
 "one!"
 msgstr ""
+"¿Por qué no [registras una cuenta](%%action.register%%) y te conviertes en "
+"la primera persona en publicar uno?"
 
 #: actions/publictagcloud.php:134
 msgid "Tag cloud"
@@ -3031,16 +3073,14 @@ msgid "Sorry, only invited people can register."
 msgstr "Disculpa, sólo personas invitadas pueden registrarse."
 
 #: actions/register.php:92
-#, fuzzy
 msgid "Sorry, invalid invitation code."
-msgstr "Error con el código de confirmación."
+msgstr "El código de invitación no es válido."
 
 #: actions/register.php:112
 msgid "Registration successful"
 msgstr "Registro exitoso."
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrarse"
 
@@ -3111,7 +3151,7 @@ msgstr ""
 "electrónico, dirección de mensajería instantánea y número de teléfono."
 
 #: 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"
@@ -3128,20 +3168,20 @@ msgid ""
 "\n"
 "Thanks for signing up and we hope you enjoy using this service."
 msgstr ""
-"¡Felicitaciones, %s! Y bienvenido a %%%%site.name%%%%. Desde aquí, "
-"puedes...\n"
+"¡Felicitaciones, %1$s! Te damos la bienvenida a %%%%site.name%%%%. Desde "
+"este momento, puede que quieras...\n"
 "\n"
-"* Ir a [tu perfil](%s) y enviar tu primer mensaje.\n"
-"* Agregar una [cuenta Jabber/Gtalk](%%%%action.imsettings%%%%) para enviar "
-"avisos por mensajes instantáneos.\n"
-"* [Buscar personas](%%%%action.peoplesearch%%%%) que podrías conoces o que "
-"comparte tus intereses.\n"
-"* Actualizar tus [opciones de perfil](%%%%action.profilesettings%%%%) para "
-"contar más sobre tí.\n"
-"* Leer la [documentación en línea](%%%%doc.help%%%%) para encontrar "
-"características pasadas por alto.\n"
+"* Ir a [tu perfil](%2$s) y publicar tu primer mensaje.\n"
+"* Añadir una [dirección Jabber/GTalk](%%%%action.imsettings%%%%) para poder "
+"enviar mensajes a través de mensajería instantanea.\n"
+"* [Buscar personas](%%%%action.peoplesearch%%%%) que conozcas o que "
+"compartan tus intereses.  \n"
+"* Actualizar tu [configuración de perfil](%%%%action.profilesettings%%%%) "
+"para contarle a otros más sobre tí.  \n"
+"* Leer los [documentos en línea](%%%%doc.help%%%%) para encontrar "
+"características que te hayas podido perder.  \n"
 "\n"
-"Gracias por suscribirte y esperamos que disfrutes el uso de este servicio."
+"¡Gracias por apuntarte! Esperamos que disfrutes usando este servicio."
 
 #: actions/register.php:562
 msgid ""
@@ -3188,7 +3228,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Suscribirse"
 
@@ -3226,7 +3266,7 @@ msgstr "No puedes repetir tus propios mensajes."
 msgid "You already repeated that notice."
 msgstr "Ya has repetido este mensaje."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repetido"
 
@@ -3234,47 +3274,47 @@ msgstr "Repetido"
 msgid "Repeated!"
 msgstr "¡Repetido!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Respuestas a %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Respuestas a %1$s, página %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Feed de avisos de %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Feed de avisos de %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Feed de avisos de %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3301,7 +3341,6 @@ msgid "User is already sandboxed."
 msgstr "El usuario te ha bloqueado."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sesiones"
 
@@ -3326,10 +3365,9 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
-#, fuzzy
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
-msgstr "Configuración de Avatar"
+msgstr "Guardar la configuración del sitio"
 
 #: actions/showapplication.php:82
 #, fuzzy
@@ -3358,7 +3396,7 @@ msgstr "Organización"
 msgid "Description"
 msgstr "Descripción"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Estadísticas"
@@ -3390,11 +3428,11 @@ msgstr ""
 
 #: actions/showapplication.php:273
 msgid "Request token URL"
-msgstr ""
+msgstr "URL del token de solicitud"
 
 #: actions/showapplication.php:278
 msgid "Access token URL"
-msgstr ""
+msgstr "URL del token de acceso"
 
 #: actions/showapplication.php:283
 msgid "Authorize URL"
@@ -3420,35 +3458,35 @@ msgstr "Avisos favoritos de %s"
 msgid "Could not retrieve favorite notices."
 msgstr "No se pudo recibir avisos favoritos."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed de los amigos de %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed de los amigos de %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed de los amigos de %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3456,7 +3494,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3470,68 +3508,68 @@ msgstr "Grupo %s"
 msgid "%1$s group, page %2$d"
 msgstr "Miembros del grupo %s, página %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Perfil del grupo"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Nota"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Alias"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Acciones del grupo"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed de avisos de grupo %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Bandeja de salida para %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Miembros"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ninguno)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Todos los miembros"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Creado"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3541,7 +3579,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3552,7 +3590,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:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administradores"
 
@@ -3641,19 +3679,20 @@ msgid ""
 msgstr ""
 
 #: actions/showstream.php:248
-#, fuzzy, php-format
+#, 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 ""
-"**%s** tiene una cuenta en %%%%site.name%%%%, un servicio [micro-blogging]"
-"(http://en.wikipedia.org/wiki/Micro-blogging) "
+"**% s ** tiene una cuenta en %%%%site.name%%%%, un servicio de "
+"[microblogueo] (http://en.wikipedia.org/wiki/Micro-blogging), basado en la "
+"herramienta de software libre [StatusNet] (http://status.net/). "
 
 #: actions/showstream.php:305
-#, fuzzy, php-format
+#, php-format
 msgid "Repeat of %s"
-msgstr "Respuestas a %s"
+msgstr "Repetición de %s"
 
 #: actions/silence.php:65 actions/unsilence.php:65
 #, fuzzy
@@ -3693,7 +3732,7 @@ msgstr ""
 
 #: actions/siteadminpanel.php:177
 msgid "Snapshot frequency must be a number."
-msgstr ""
+msgstr "La frecuencia de captura debe ser un número."
 
 #: actions/siteadminpanel.php:183
 msgid "Minimum text limit is 140 characters."
@@ -3750,13 +3789,12 @@ msgid "Default timezone for the site; usually UTC."
 msgstr "Zona horaria predeterminada del sitio; generalmente UTC."
 
 #: actions/siteadminpanel.php:281
-#, fuzzy
 msgid "Default site language"
-msgstr "Lenguaje de preferencia"
+msgstr "Idioma predeterminado del sitio"
 
 #: actions/siteadminpanel.php:289
 msgid "Snapshots"
-msgstr ""
+msgstr "Capturas"
 
 #: actions/siteadminpanel.php:292
 msgid "Randomly during Web hit"
@@ -3764,11 +3802,11 @@ msgstr ""
 
 #: actions/siteadminpanel.php:293
 msgid "In a scheduled job"
-msgstr ""
+msgstr "En un trabajo programado"
 
 #: actions/siteadminpanel.php:295
 msgid "Data snapshots"
-msgstr ""
+msgstr "Capturas de datos"
 
 #: actions/siteadminpanel.php:296
 msgid "When to send statistical data to status.net servers"
@@ -3776,7 +3814,7 @@ msgstr ""
 
 #: actions/siteadminpanel.php:301
 msgid "Frequency"
-msgstr ""
+msgstr "Frecuencia"
 
 #: actions/siteadminpanel.php:302
 msgid "Snapshots will be sent once every N web hits"
@@ -3808,7 +3846,7 @@ msgstr ""
 
 #: actions/siteadminpanel.php:322
 msgid "How long users must wait (in seconds) to post the same thing again."
-msgstr ""
+msgstr "Cuántos segundos es necesario esperar para publicar lo mismo de nuevo."
 
 #: actions/smssettings.php:58
 msgid "SMS settings"
@@ -3913,28 +3951,36 @@ msgid "No code entered"
 msgstr "No ingresó código"
 
 #: actions/subedit.php:70
-#, fuzzy
 msgid "You are not subscribed to that profile."
-msgstr "No estás suscrito a ese perfil."
+msgstr "No te has suscrito a ese perfil."
 
-#: actions/subedit.php:83
-#, fuzzy
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
-msgstr "No se pudo guardar suscripción."
+msgstr "No se ha podido guardar la suscripción."
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "No es usuario local."
+msgid "No such profile."
+msgstr "No existe tal archivo."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "No te has suscrito a ese perfil."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Suscrito"
 
 #: actions/subscribers.php:50
-#, fuzzy, php-format
+#, php-format
 msgid "%s subscribers"
-msgstr "Suscriptores %s"
+msgstr "%s suscriptores"
 
 #: actions/subscribers.php:52
 #, fuzzy, php-format
@@ -3987,7 +4033,7 @@ msgstr "Estas son las personas que escuchas sus avisos."
 msgid "These are the people whose notices %s listens to."
 msgstr "Estas son las personas que %s escucha sus avisos."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3997,36 +4043,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
-#, fuzzy, php-format
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
+#, php-format
 msgid "%s is not listening to anyone."
-msgstr "%1$s ahora está escuchando "
+msgstr "%s no está escuchando a nadie."
 
-#: actions/subscriptions.php:194
-#, fuzzy
+#: actions/subscriptions.php:199
 msgid "Jabber"
-msgstr "Jabber "
+msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Usuarios auto marcados con %s - página %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Feed de avisos de %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Feed de avisos de %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Feed de avisos de %s"
@@ -4081,7 +4126,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "No existe ese tag."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Método API en construcción."
 
@@ -4100,9 +4145,8 @@ msgid "User is not silenced."
 msgstr "El usuario no tiene un perfil."
 
 #: actions/unsubscribe.php:77
-#, fuzzy
 msgid "No profile id in request."
-msgstr "Ningún perfil de Id en solicitud."
+msgstr "No hay id de perfil solicitado."
 
 #: actions/unsubscribe.php:98
 msgid "Unsubscribed"
@@ -4114,74 +4158,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Usuario"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
-msgstr ""
+msgstr "Configuración de usuarios en este sitio StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
-msgstr ""
+msgstr "Límite para la bio inválido: Debe ser numérico."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
-msgstr ""
+msgstr "Texto de bienvenida inválido. La longitud máx. es de 255 caracteres."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
-msgstr ""
+msgstr "Suscripción predeterminada inválida : '%1$s' no es un usuario"
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Perfil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
-msgstr ""
+msgstr "Límite de la bio"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
-msgstr ""
+msgstr "Longitud máxima de bio de perfil en caracteres."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nuevos usuarios"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Bienvenida a nuevos usuarios"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
-msgstr ""
+msgstr "Texto de bienvenida para nuevos usuarios (máx. 255 caracteres)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Suscripción predeterminada"
 
-#: actions/useradminpanel.php:241
-#, fuzzy
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
-msgstr ""
-"Suscribirse automáticamente a quien quiera que se suscriba a mí (es mejor "
-"para no-humanos)"
+msgstr "Suscribir automáticamente nuevos usuarios a este usuario."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Invitaciones"
 
-#: actions/useradminpanel.php:255
-#, fuzzy
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
-msgstr "Invitacion(es) enviada(s)"
+msgstr "Invitaciones habilitadas"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4209,7 +4251,6 @@ msgstr "Aceptar"
 
 #: actions/userauthorization.php:218 lib/subscribeform.php:115
 #: lib/subscribeform.php:139
-#, fuzzy
 msgid "Subscribe to this user"
 msgstr "Suscribirse a este usuario"
 
@@ -4368,7 +4409,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Complementos"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Sesiones"
@@ -4408,15 +4449,19 @@ msgstr "No es parte del grupo."
 msgid "Group leave failed."
 msgstr "Perfil de grupo"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "No se pudo actualizar el grupo."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
 msgstr "No se pudo crear favorito."
 
 #: classes/Message.php:45
-#, fuzzy
 msgid "You are banned from sending direct messages."
-msgstr "Error al enviar mensaje directo."
+msgstr "Se te ha inhabilitado para enviar mensajes directos."
 
 #: classes/Message.php:61
 msgid "Could not insert message."
@@ -4426,27 +4471,27 @@ msgstr "No se pudo insertar mensaje."
 msgid "Could not update message with new URI."
 msgstr "No se pudo actualizar mensaje con nuevo URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Error de la BD al insertar la etiqueta clave: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Ha habido un problema al guardar el mensaje. Es muy largo."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Ha habido un problema al guardar el mensaje. Usuario desconocido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4455,43 +4500,74 @@ msgstr ""
 "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos "
 "minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Tienes prohibido publicar avisos en este sitio."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Hubo un problema al guardar el aviso."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Hubo un problema al guardar el aviso."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Error de BD al insertar respuesta: %s"
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Se te ha prohibido la suscripción."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "El usuario te ha bloqueado."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "¡No estás suscrito!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "No se pudo eliminar la suscripción."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "No se pudo eliminar la suscripción."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bienvenido a %1$s, @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "No se pudo crear grupo."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "No se pudo configurar miembros de grupo."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "No se pudo configurar miembros de grupo."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "No se ha podido guardar la suscripción."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Cambia tus opciones de perfil"
@@ -4533,120 +4609,190 @@ msgstr "Página sin título"
 msgid "Primary site navigation"
 msgstr "Navegación de sitio primario"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Inicio"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil personal y línea de tiempo de amigos"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambia tu correo electrónico, avatar, contraseña, perfil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Conectarse"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Cuenta"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Conectar a los servicios"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Conectarse"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Cambiar la configuración del sitio"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invitar"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Admin"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Salir"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Salir de sitio"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Salir"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear una cuenta"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrarse"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Ingresar a sitio"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Ayuda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Inicio de sesión"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ayúdame!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Buscar"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Ayuda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Buscar personas o texto"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Buscar"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Aviso de sitio"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Vistas locales"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Aviso de página"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navegación de sitio secundario"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Ayuda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Acerca de"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Preguntas Frecuentes"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacidad"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Fuente"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Ponerse en contacto"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Insignia"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licencia de software de StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4655,12 +4801,12 @@ msgstr ""
 "**%%site.name%%** es un servicio de microblogueo de [%%site.broughtby%%**](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** es un servicio de microblogueo."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4671,110 +4817,172 @@ msgstr ""
 "disponible bajo la [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licencia de contenido del sitio"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Todo"
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "Licencia."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginación"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Después"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Antes"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "No puedes hacer cambios a este sitio."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Registro de usuario no permitido."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Todavía no se implementa comando."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Todavía no se implementa comando."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "¡No se pudo guardar tu configuración de Twitter!"
 
-#: lib/adminpanelaction.php:312
-#, fuzzy
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
-msgstr "Confirmación de correo electrónico"
+msgstr "Configuración básica del sitio"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
 #, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Sitio"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
-msgstr "SMS confirmación"
+msgstr "Configuración del diseño"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
 #, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Diseño"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
-msgstr "SMS confirmación"
+msgstr "Configuración de usuario"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Usuario"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Configuración de acceso"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS confirmación"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Configuración de sesiones"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sesiones"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: 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 ""
+msgstr "Editar aplicación"
 
 #: lib/applicationeditform.php:184
 msgid "Icon for this application"
@@ -4791,9 +4999,8 @@ msgid "Describe your application"
 msgstr "Describir al grupo o tema"
 
 #: lib/applicationeditform.php:216
-#, fuzzy
 msgid "Source URL"
-msgstr "Fuente"
+msgstr "La URL de origen"
 
 #: lib/applicationeditform.php:218
 #, fuzzy
@@ -4802,7 +5009,7 @@ msgstr "El URL de página de inicio o blog del grupo or tema"
 
 #: lib/applicationeditform.php:224
 msgid "Organization responsible for this application"
-msgstr ""
+msgstr "Organización responsable de esta aplicación"
 
 #: lib/applicationeditform.php:230
 #, fuzzy
@@ -4815,15 +5022,15 @@ msgstr ""
 
 #: lib/applicationeditform.php:258
 msgid "Browser"
-msgstr ""
+msgstr "Navegador"
 
 #: lib/applicationeditform.php:274
 msgid "Desktop"
-msgstr ""
+msgstr "Escritorio"
 
 #: lib/applicationeditform.php:275
 msgid "Type of application, browser or desktop"
-msgstr ""
+msgstr "Tipo de aplicación, de navegador o de escritorio"
 
 #: lib/applicationeditform.php:297
 msgid "Read-only"
@@ -4838,9 +5045,8 @@ msgid "Default access for this application: read-only, or read-write"
 msgstr ""
 
 #: lib/applicationlist.php:154
-#, fuzzy
 msgid "Revoke"
-msgstr "Eliminar"
+msgstr "Revocar"
 
 #: lib/attachmentlist.php:87
 msgid "Attachments"
@@ -4848,7 +5054,7 @@ msgstr ""
 
 #: lib/attachmentlist.php:265
 msgid "Author"
-msgstr ""
+msgstr "Autor"
 
 #: lib/attachmentlist.php:278
 msgid "Provider"
@@ -4856,18 +5062,17 @@ msgstr "Proveedor"
 
 #: lib/attachmentnoticesection.php:67
 msgid "Notices where this attachment appears"
-msgstr ""
+msgstr "Mensajes donde aparece este adjunto"
 
 #: lib/attachmenttagcloudsection.php:48
 msgid "Tags for this attachment"
-msgstr ""
+msgstr "Etiquetas de este archivo adjunto"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
-#, fuzzy
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
-msgstr "Cambio de contraseña "
+msgstr "El cambio de contraseña ha fallado"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Cambio de contraseña "
@@ -4889,10 +5094,9 @@ msgid "Sorry, this command is not yet implemented."
 msgstr "Disculpa, todavía no se implementa este comando."
 
 #: lib/command.php:88
-#, fuzzy, php-format
+#, php-format
 msgid "Could not find a user with nickname %s"
-msgstr ""
-"No se pudo actualizar el usuario con la dirección de correo confirmada."
+msgstr "No se pudo encontrar a nadie con el nombre de usuario %s"
 
 #: lib/command.php:92
 msgid "It does not make a lot of sense to nudge yourself!"
@@ -4912,9 +5116,8 @@ msgid ""
 msgstr ""
 
 #: lib/command.php:152 lib/command.php:390 lib/command.php:451
-#, fuzzy
 msgid "Notice with that id does not exist"
-msgstr "Ningún perfil con ese ID."
+msgstr "No existe ningún mensaje con ese id"
 
 #: lib/command.php:168 lib/command.php:406 lib/command.php:467
 #: lib/command.php:523
@@ -5023,80 +5226,89 @@ msgstr "Hubo un problema al guardar el aviso."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Especificar el nombre del usuario a suscribir"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "No existe ese usuario."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Suscrito a %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Especificar el nombre del usuario para desuscribirse de"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Desuscrito de %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Todavía no se implementa comando."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificación no activa."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "No se puede desactivar notificación."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificación activada."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "No se puede activar notificación."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Desuscrito de %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "No estás suscrito a nadie."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Ya estás suscrito a estos usuarios:"
 msgstr[1] "Ya estás suscrito a estos usuarios:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Nadie está suscrito a ti."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "No se pudo suscribir otro a ti."
 msgstr[1] "No se pudo suscribir otro a ti."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "No eres miembro de ningún grupo"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Eres miembro de este grupo:"
 msgstr[1] "Eres miembro de estos grupos:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5110,6 +5322,7 @@ msgid ""
 "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"
@@ -5137,19 +5350,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Ningún archivo de configuración encontrado. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Ir al instalador."
 
@@ -5207,11 +5420,11 @@ msgstr "Aceptar"
 
 #: lib/feed.php:85
 msgid "RSS 1.0"
-msgstr ""
+msgstr "RSS 1.0"
 
 #: lib/feed.php:87
 msgid "RSS 2.0"
-msgstr ""
+msgstr "RSS 2.0"
 
 #: lib/feed.php:89
 msgid "Atom"
@@ -5341,23 +5554,23 @@ msgstr "Error del sistema al cargar el archivo."
 msgid "Not an image or corrupt file."
 msgstr "No es una imagen o es un fichero corrupto."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato de imagen no soportado."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Se perdió nuestro archivo."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tipo de archivo desconocido"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5577,7 +5790,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "desde"
 
@@ -5668,6 +5881,12 @@ msgstr "Para"
 msgid "Available characters"
 msgstr "Caracteres disponibles"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Enviar"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5702,49 +5921,49 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "E"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "en"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "en contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Crear"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Responder este aviso."
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Aviso borrado"
@@ -5777,10 +5996,6 @@ msgstr "Error al insertar perfil remoto"
 msgid "Duplicate notice"
 msgstr "Duplicar aviso"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Se te ha prohibido la suscripción."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "No se pudo insertar una nueva suscripción."
@@ -5797,6 +6012,10 @@ msgstr "Respuestas"
 msgid "Favorites"
 msgstr "Favoritos"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Usuario"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Bandeja de Entrada"
@@ -5891,7 +6110,7 @@ msgstr "Responder este aviso."
 msgid "Repeat this notice"
 msgstr "Responder este aviso."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5914,6 +6133,10 @@ msgstr "Buscar"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Buscar"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Buscar ayuda"
@@ -5967,35 +6190,14 @@ msgstr "Personas suscritas a %s"
 msgid "Groups %s is a member of"
 msgstr "%s es miembro de los grupos"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "El usuario te ha bloqueado."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "No se pudo suscribir."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "No se pudo suscribir otro a ti."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "¡No estás suscrito!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "No se pudo eliminar la suscripción."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "No se pudo eliminar la suscripción."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Invita a amigos y colegas a unirse a %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6049,67 +6251,67 @@ msgstr "editar avatar"
 msgid "User actions"
 msgstr "Acciones de usuario"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Editar configuración del perfil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Editar"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Enviar un mensaje directo a este usuario"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Mensaje"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "hace unos segundos"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "hace un minuto"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "hace %d minutos"
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "hace una hora"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "hace %d horas"
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "hace un día"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "hace %d días"
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "hace un mes"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "hace %d meses"
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "hace un año"
 
index c749a41611ae8c5c50bb1542bb4565b824a18fb2..bb453f582bd4141eec87c52eef84d74f768f56f7 100644 (file)
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:41+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:45+0000\n"
 "Last-Translator: Ahmad Sufi Mahmudi\n"
 "Language-Team: Persian\n"
 "MIME-Version: 1.0\n"
@@ -20,70 +20,77 @@ msgstr ""
 "X-Language-Code: fa\n"
 "X-Message-Group: out-statusnet\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "دسترسی"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "تنظیمات دیگر"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "ثبت نام"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "خصوصی"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "فقط دعوت کردن"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "خصوصی"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "تنها آماده کردن دعوت نامه های ثبت نام."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "مسدود"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "فقط دعوت کردن"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "غیر فعال کردن نام نوبسی جدید"
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "ذخیره‌کردن"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "مسدود"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "تنظیمات چهره"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "ذخیره‌کردن"
+
+#. 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 "چنین صفحه‌ای وجود ندارد"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -97,52 +104,59 @@ msgstr "چنین صفحه‌ای وجود ندارد"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "چنین کاربری وجود ندارد."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s کاربران مسدود شده، صفحه‌ی %d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s و دوستان"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "خوراک دوستان %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "خوراک دوستان %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "خوراک دوستان %s (Atom)"
 
-#: actions/all.php:127
+#. 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 "این خط‌زمانی %s و دوستانش است، اما هیچ‌یک تاکنون چیزی پست نکرده‌اند."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -151,7 +165,8 @@ msgstr ""
 "پیگیری افراد بیش‌تری بشوید [به یک گروه بپیوندید](%%action.groups%%) یا خودتان "
 "چیزی را ارسال کنید."
 
-#: actions/all.php:134
+#. 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
 msgid ""
 "You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
@@ -160,7 +175,7 @@ msgstr ""
 "اولین کسی باشید که در [این موضوع](%%%%action.newnotice%%%%?status_textarea=%"
 "s) پیام می‌فرستد."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -169,12 +184,13 @@ msgstr ""
 "چرا [ثبت نام](%%%%action.register%%%%) نمی‌کنید و سپس با فرستادن پیام توجه %s "
 "را جلب کنید."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "شما و دوستان"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "به روز رسانی از %1$ و دوستان در %2$"
@@ -187,20 +203,20 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "رابط مورد نظر پیدا نشد."
 
@@ -232,8 +248,9 @@ msgstr "نمی‌توان کاربر را به‌هنگام‌سازی کرد."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "کاربر هیچ شناس‌نامه‌ای ندارد."
 
@@ -258,7 +275,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -371,68 +388,68 @@ msgstr "نمی‌توان کاربر منبع را تعیین کرد."
 msgid "Could not find target user."
 msgstr "نمی‌توان کاربر هدف را پیدا کرد."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "این لقب در حال حاضر ثبت شده است. لطفا یکی دیگر انتخاب کنید."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "لقب نا معتبر."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "برگهٔ آغازین یک نشانی معتبر نیست."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "نام کامل طولانی است (۲۵۵ حرف در حالت بیشینه(."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "مکان طولانی است (حداکثر ۲۵۵ حرف)"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "نام‌های مستعار بسیار زیاد هستند! حداکثر %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "نام‌مستعار غیر مجاز: «%s»"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "نام‌مستعار «%s» ازپیش گرفته‌شده‌است. یکی دیگر را امتحان کنید."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "نام و نام مستعار شما نمی تواند یکی باشد ."
@@ -443,15 +460,15 @@ msgstr "نام و نام مستعار شما نمی تواند یکی باشد .
 msgid "Group not found!"
 msgstr "گروه یافت نشد!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "شما از پیش یک عضو این گروه هستید."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "دسترسی شما به گروه توسط مدیر آن محدود شده است."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "عضویت %s در گروه %s نا موفق بود."
@@ -460,7 +477,7 @@ msgstr "عضویت %s در گروه %s نا موفق بود."
 msgid "You are not a member of this group."
 msgstr "شما یک عضو این گروه نیستید."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "خارج شدن %s از گروه %s نا موفق بود"
@@ -492,7 +509,7 @@ msgstr "اندازه‌ی نادرست"
 #: 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:309
+#: 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
@@ -501,7 +518,7 @@ msgstr "اندازه‌ی نادرست"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -534,7 +551,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -557,13 +574,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "حساب کاربری"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -641,18 +658,18 @@ msgstr "قالب پشتیبانی نشده."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / دوست داشتنی از %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "خط زمانی %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -668,12 +685,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s خط‌زمانی عمومی"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s به روز رسانی های عموم"
@@ -683,17 +700,17 @@ msgstr "%s به روز رسانی های عموم"
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "تکرار %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "پیام‌هایی که با %s نشانه گزاری شده اند."
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "پیام‌های نشانه گزاری شده با %1$s در %2$s"
@@ -709,8 +726,7 @@ msgstr "چنین پیوستی وجود ندارد."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "بدون لقب."
 
@@ -722,7 +738,7 @@ msgstr "بدون اندازه."
 msgid "Invalid size."
 msgstr "اندازه‌ی نادرست"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "چهره"
@@ -740,30 +756,30 @@ msgid "User without matching profile"
 msgstr "کاربر بدون مشخصات"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "تنظیمات چهره"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "اصلی"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "پیش‌نمایش"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "حذف"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "پایین‌گذاری"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "برش"
 
@@ -771,7 +787,7 @@ msgstr "برش"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "یک مربع از عکس خود را انتخاب کنید تا چهره‌ی شما باشد."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "فایل اطلاعات خود را گم کرده ایم."
 
@@ -807,22 +823,22 @@ msgstr ""
 "نخواهید شد"
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "خیر"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "کاربر را مسدود نکن"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "بله"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "کاربر را مسدود کن"
 
@@ -830,39 +846,43 @@ msgstr "کاربر را مسدود کن"
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "چنین گروهی وجود ندارد."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s کاربران مسدود شده"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s کاربران مسدود شده، صفحه‌ی %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "فهرستی از افراد مسدود شده در پیوستن به این گروه."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "آزاد کردن کاربر در پیوستن به گروه"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "آزاد سازی"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "آزاد سازی کاربر"
 
@@ -941,7 +961,7 @@ msgstr "شما یک عضو این گروه نیستید."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -970,12 +990,13 @@ msgstr "این پیام را پاک نکن"
 msgid "Delete this application"
 msgstr "این پیام را پاک کن"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "شما به سیستم وارد نشده اید."
@@ -1004,7 +1025,7 @@ msgstr "آیا اطمینان دارید که می‌خواهید این پیا
 msgid "Do not delete this notice"
 msgstr "این پیام را پاک نکن"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "این پیام را پاک کن"
 
@@ -1020,7 +1041,7 @@ msgstr "شما فقط می‌توانید کاربران محلی را پاک ک
 msgid "Delete user"
 msgstr "حذف کاربر"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1028,12 +1049,12 @@ msgstr ""
 "آیا مطمئن هستید که می‌خواهید این کاربر را پاک کنید؟ با این کار تمام اطلاعات "
 "پاک و بدون برگشت خواهند بود."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "حذف این کاربر"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "طرح"
 
@@ -1136,6 +1157,17 @@ msgstr "بازگرداندن طرح‌های پیش‌فرض"
 msgid "Reset back to default"
 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/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 "ذخیره‌کردن"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "ذخیره‌کردن طرح"
@@ -1236,30 +1268,30 @@ msgstr "ویرایش گروه %s"
 msgid "You must be logged in to create a group."
 msgstr "برای ساخت یک گروه، باید وارد شده باشید."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "برای ویرایش گروه، باید یک مدیر باشید."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "از این روش برای ویرایش گروه استفاده کنید."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "نمی‌توان نام‌های مستعار را ساخت."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "گزینه‌ها ذخیره شدند."
 
@@ -1597,7 +1629,7 @@ msgstr "هم اکنون دسترسی کاربر به گروه مسدود شده
 msgid "User is not a member of group."
 msgstr "کاربر عضو گروه نیست."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "دسترسی کاربر به گروه را مسدود کن"
 
@@ -1629,87 +1661,87 @@ msgstr ""
 msgid "You must be logged in to edit a group."
 msgstr "برای ویرایش گروه باید وارد شوید."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "ظاهر گروه"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "نمی‌توان ظاهر را به روز کرد."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "ترجیحات طرح ذخیره شد."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "نشان گروه"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "شما می‌توانید یک نشان برای گروه خود با بیشینه حجم %s بفرستید."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "کاربر بدون مشخصات"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "یک ناحیه‌ی مربع از تصویر را انتخاب کنید تا به عنوان نشان باشد."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "نشان به‌هنگام‌سازی شد."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "اشکال در ارسال نشان."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "اعضای گروه %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "اعضای گروه %s، صفحهٔ %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "یک فهرست از کاربران در این گروه"
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "مدیر"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "بازداشتن"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "کاربر یک مدیر گروه شود"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "مدیر شود"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "این کاربر یک مدیر شود"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "به روز رسانی کابران %1$s در %2$s"
@@ -1968,16 +2000,19 @@ msgstr "پیام خصوصی"
 msgid "Optionally add a personal message to the invitation."
 msgstr "اگر دوست دارید می‌توانید یک پیام به همراه دعوت نامه ارسال کنید."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "فرستادن"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s شما را دعوت کرده است که در %2$s به آن‌ها بپیوندید."
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2012,7 +2047,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "برای پیوستن به یک گروه، باید وارد شده باشید."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "بدون لقب."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "ملحق شدن به گروه"
@@ -2021,11 +2061,11 @@ msgstr "ملحق شدن به گروه"
 msgid "You must be logged in to leave a group."
 msgstr "برای ترک یک گروه، شما باید وارد شده باشید."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "شما یک کاربر این گروه نیستید."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s گروه %s را ترک کرد."
@@ -2042,8 +2082,7 @@ msgstr "نام کاربری یا رمز عبور نادرست."
 msgid "Error setting user. You are probably not authorized."
 msgstr "خطا در تنظیم کاربر. شما احتمالا اجازه ی این کار را ندارید."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "ورود"
 
@@ -2301,8 +2340,8 @@ msgstr "نوع محتوا "
 msgid "Only "
 msgstr " فقط"
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "یک قالب دادهٔ پشتیبانی‌شده نیست."
 
@@ -2448,7 +2487,7 @@ msgstr "نمی‌توان گذرواژه جدید را ذخیره کرد."
 msgid "Password saved."
 msgstr "گذرواژه ذخیره شد."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "مسیر ها"
 
@@ -2481,7 +2520,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "سایت"
 
@@ -2654,7 +2692,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "۱-۶۴ کاراکتر کوچک یا اعداد، بدون نقطه گذاری یا فاصله"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "نام‌کامل"
@@ -2682,7 +2720,7 @@ msgid "Bio"
 msgstr "شرح‌حال"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2746,23 +2784,24 @@ msgstr "کلام بسیار طولانی است( حداکثر ۵۰ کاراکت
 msgid "Invalid tag: \"%s\""
 msgstr "نشان نادرست »%s«"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "نمی‌توان تنظیمات مکانی را تنظیم کرد."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "نمی‌توان شناسه را ذخیره کرد."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "نمی‌توان نشان را ذخیره کرد."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "تنظیمات ذخیره شد."
 
@@ -2775,45 +2814,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "خط زمانی عمومی، صفحه‌ی %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "خط زمانی عمومی"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "اولین کسی باشید که پیام می‌فرستد!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr "چرا [ثبت نام](%%action.register%%) نمی‌کنید و اولین پیام را نمی‌فرستید؟"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2822,7 +2861,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2995,8 +3034,7 @@ msgstr "با عرض تاسف، کد دعوت نا معتبر است."
 msgid "Registration successful"
 msgstr "ثبت نام با موفقیت انجام شد."
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "ثبت نام"
 
@@ -3123,7 +3161,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr ""
 
@@ -3159,7 +3197,7 @@ msgstr "شما نمی توانید آگهی خودتان را تکرار کنی
 msgid "You already repeated that notice."
 msgstr "شما قبلا آن آگهی را تکرار کردید."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr ""
 
@@ -3167,47 +3205,47 @@ msgstr ""
 msgid "Repeated!"
 msgstr ""
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "پاسخ‌های به %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "پاسخ‌های به %s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "خوراک پاسخ‌ها برای %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "خوراک پاسخ‌ها برای %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "خوراک پاسخ‌ها برای %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, 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 "این خط‌زمانی %s و دوستانش است، اما هیچ‌یک تاکنون چیزی پست نکرده‌اند."
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, fuzzy, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3235,7 +3273,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3261,7 +3298,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr ""
 
@@ -3295,7 +3332,7 @@ msgstr "صفحه بندى"
 msgid "Description"
 msgstr ""
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "آمار"
@@ -3358,35 +3395,35 @@ msgstr "دوست داشتنی های %s"
 msgid "Could not retrieve favorite notices."
 msgstr "ناتوان در بازیابی آگهی های محبوب."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr ""
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3394,7 +3431,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "این یک راه است برای به اشتراک گذاشتن آنچه که دوست دارید."
 
@@ -3408,67 +3445,67 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "اعضای گروه %s، صفحهٔ %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr ""
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "نام های مستعار"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "اعضا"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "هیچ"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "همه ی اعضا"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "ساخته شد"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3478,7 +3515,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3487,7 +3524,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3844,15 +3881,26 @@ msgstr "کدی وارد نشد"
 msgid "You are not subscribed to that profile."
 msgstr "شما به این پروفيل متعهد نشدید"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr ""
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
 msgstr ""
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "چنین پرونده‌ای وجود ندارد."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "شما به این پروفيل متعهد نشدید"
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr ""
 
@@ -3912,7 +3960,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3922,35 +3970,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr ""
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "کاربران خود برچسب‌گذاری شده با %s - صفحهٔ %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -4000,7 +4048,7 @@ msgstr ""
 msgid "No such tag."
 msgstr ""
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "روش API در دست ساخت."
 
@@ -4030,70 +4078,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "کاربر"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr ""
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "حداکثر طول یک زندگی نامه(در پروفایل) بر حسب کاراکتر."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr ""
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "خوشامدگویی کاربر جدید"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "پیام خوشامدگویی برای کاربران جدید( حداکثر 255 کاراکتر)"
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr ""
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "دعوت نامه ها"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "دعوت نامه ها فعال شدند"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "خواه به کاربران اجازه ی دعوت کردن کاربران جدید داده شود."
 
@@ -4266,7 +4316,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "شخصی"
@@ -4306,6 +4356,11 @@ msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد."
 msgid "Group leave failed."
 msgstr ""
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4323,27 +4378,27 @@ msgstr "پیغام نمی تواند درج گردد"
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "مشکل در ذخیره کردن پیام. بسیار طولانی."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "مشکل در ذخیره کردن پیام. کاربر نا شناخته."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "تعداد خیلی زیاد آگهی و بسیار سریع؛ استراحت کنید و مجددا دقایقی دیگر ارسال "
 "کنید."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4351,42 +4406,71 @@ msgstr ""
 "تعداد زیاد پیام های دو نسخه ای و بسرعت؛ استراحت کنید و دقایقی دیگر مجددا "
 "ارسال کنید."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "شما از فرستادن پست در این سایت مردود شدید ."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1442
 #, php-format
-msgid "DB error inserting reply: %s"
+msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/Notice.php:1235
-#, php-format
-msgid "RT @%1$s %2$s"
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
 msgstr ""
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr ""
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "خوش امدید به %1$s , @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "نمیتوان گروه را تشکیل داد"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "نمیتوان گروه را تشکیل داد"
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr ""
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "نمی‌توان شناس‌نامه را ذخیره کرد."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "تنضبمات پروفيلتان را تغیر دهید"
@@ -4428,132 +4512,201 @@ msgstr "صفحه ی بدون عنوان"
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "خانه"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "شخصی"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "آدرس ایمیل، آواتار، کلمه ی عبور، پروفایل خود را تغییر دهید"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "وصل‌شدن"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "حساب کاربری"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "متصل شدن به خدمات"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "وصل‌شدن"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "تغییر پیکربندی سایت"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "دعوت‌کردن"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "مدیر"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr " به شما ملحق شوند  %s دوستان و همکاران را دعوت کنید تا در"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "خروج"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "دعوت‌کردن"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "خارج شدن از سایت ."
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "خروج"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "یک حساب کاربری بسازید"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "ثبت نام"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "ورود به وب‌گاه"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "کمک"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "ورود"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "به من کمک کنید!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "جست‌وجو"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "کمک"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "جستجو برای شخص با متن"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "جست‌وجو"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "خبر سایت"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "دید محلی"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "خبر صفحه"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "کمک"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "دربارهٔ"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "سوال‌های رایج"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "خصوصی"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "منبع"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "تماس"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet مجوز نرم افزار"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4561,97 +4714,162 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "مجوز محتویات سایت"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "همه "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "مجوز."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "صفحه بندى"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "بعد از"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "قبل از"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "شما نمی توانید در این سایت تغیری ایجاد کنید"
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "اجازه‌ی ثبت نام داده نشده است."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "نمی توان تنظیمات طراحی شده را پاک کرد ."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "سایت"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "طرح"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "کاربر"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "پیکره بندی اصلی سایت"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "شخصی"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4743,12 +4961,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "تغییر گذرواژه"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "تغییر گذرواژه"
@@ -4904,77 +5122,87 @@ msgstr "خطا هنگام ذخیره ی آگهی"
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "چنین کاربری وجود ندارد."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "دستور هنوز اجرا نشده"
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "ناتوان در خاموش کردن آگاه سازی."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "آگاه سازی فعال است."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "ناتوان در روشن کردن آگاه سازی."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "فرمان ورود از کار افتاده است"
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "مشترک‌ها"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "شما توسط هیچ کس تصویب نشده اید ."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "هم اکنون شما این کاربران را دنبال می‌کنید: "
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "هیچکس شما را تایید نکرده ."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "هیچکس شما را تایید نکرده ."
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "شما در هیچ گروهی عضو نیستید ."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "شما یک عضو این گروه نیستید."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4988,6 +5216,7 @@ msgid ""
 "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"
@@ -5015,19 +5244,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "شما ممکن است بخواهید نصاب را اجرا کنید تا این را تعمیر کند."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "برو به نصاب."
 
@@ -5215,23 +5444,23 @@ msgstr "خطای سیستم ارسال فایل."
 msgid "Not an image or corrupt file."
 msgstr "تصویر یا فایل خرابی نیست"
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "فرمت(فایل) عکس پشتیبانی نشده."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "فایلمان گم شده"
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "نوع فایل پشتیبانی نشده"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "مگابایت"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "کیلوبایت"
 
@@ -5441,7 +5670,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "از"
 
@@ -5532,6 +5761,12 @@ msgstr "به"
 msgid "Available characters"
 msgstr "کاراکترهای موجود"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "فرستادن"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "یک آگهی بفرستید"
@@ -5565,48 +5800,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "در"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "در زمینه"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "تکرار از"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "به این آگهی جواب دهید"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "جواب دادن"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "آگهی تکرار شد"
 
@@ -5638,10 +5873,6 @@ msgstr ""
 msgid "Duplicate notice"
 msgstr ""
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr ""
@@ -5658,6 +5889,10 @@ msgstr "پاسخ ها"
 msgid "Favorites"
 msgstr "چیزهای مورد علاقه"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "کاربر"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "صندوق دریافتی"
@@ -5748,7 +5983,7 @@ msgstr "به این آگهی جواب دهید"
 msgid "Repeat this notice"
 msgstr ""
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5768,6 +6003,10 @@ msgstr "جست‌وجوی وب‌گاه"
 msgid "Keyword(s)"
 msgstr "کلمه(های) کلیدی"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "جست‌وجو"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "راهنمای جستجو"
@@ -5819,33 +6058,14 @@ msgstr ""
 msgid "Groups %s is a member of"
 msgstr "هست عضو %s گروه"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "قبلا تایید شده !"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr ""
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr ""
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr ""
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "تایید نشده!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr ""
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "دعوت‌کردن"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr ""
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr " به شما ملحق شوند  %s دوستان و همکاران را دعوت کنید تا در"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -5897,67 +6117,67 @@ msgstr "ویرایش اواتور"
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "ویرایش تنظیمات پروفيل"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "ویرایش"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "پیام مستقیم به این کاربر بفرستید"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "پیام"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "چند ثانیه پیش"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "حدود یک دقیقه پیش"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "حدود %d دقیقه پیش"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "حدود یک ساعت پیش"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "حدود %d ساعت پیش"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "حدود یک روز پیش"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "حدود %d روز پیش"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "حدود یک ماه پیش"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "حدود %d ماه پیش"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "حدود یک سال پیش"
 
index 80a85e1d1b39de42c1d20fdf3e56267f935fce19..97ab7038b90a96a66b8132d8d844fcc1e7359c3b 100644 (file)
@@ -10,82 +10,88 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:39+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:42+0000\n"
 "Language-Team: Finnish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Hyväksy"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Profiilikuva-asetukset"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Rekisteröidy"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Yksityisyys"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "Kutsu"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Estä"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Tallenna"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Profiilikuva-asetukset"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Tallenna"
+
+#. 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 "Sivua ei ole."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -99,46 +105,53 @@ msgstr "Sivua ei ole."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Käyttäjää ei ole."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s ja kaverit, sivu %d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s ja kaverit"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Käyttäjän %s kavereiden syöte (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Käyttäjän %s kavereiden syöte (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Käyttäjän %s kavereiden syöte (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -146,7 +159,7 @@ msgstr ""
 "Tämä on käyttäjän %s ja kavereiden aikajana, mutta kukaan ei ole lähettyänyt "
 "vielä mitään."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -155,7 +168,8 @@ msgstr ""
 "Kokeile useamman käyttäjän tilaamista, [liity ryhmään] (%%action.groups%%) "
 "tai lähetä päivitys itse."
 
-#: actions/all.php:134
+#. 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
 msgid ""
 "You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
@@ -164,19 +178,20 @@ msgstr ""
 "Ole ensimmäinen joka [lähettää päivityksen tästä aiheesta] (%%%%action."
 "newnotice%%%%?status_textarea=%s)!"
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Sinä ja kaverit"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!"
@@ -189,20 +204,20 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metodia ei löytynyt!"
@@ -236,8 +251,9 @@ msgstr "Ei voitu päivittää käyttäjää."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Käyttäjällä ei ole profiilia."
 
@@ -262,7 +278,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -381,7 +397,7 @@ msgstr "Julkista päivitysvirtaa ei saatu."
 msgid "Could not find target user."
 msgstr "Ei löytynyt yhtään päivitystä."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -389,62 +405,62 @@ msgstr ""
 "Käyttäjätunnuksessa voi olla ainoastaan pieniä kirjaimia ja numeroita ilman "
 "välilyöntiä."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Tunnus on jo käytössä. Yritä toista tunnusta."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Tuo ei ole kelvollinen tunnus."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Kotisivun verkko-osoite ei ole toimiva."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Koko nimi on liian pitkä (max 255 merkkiä)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "kuvaus on liian pitkä (max 140 merkkiä)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Kotipaikka on liian pitkä (max 255 merkkiä)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Liikaa aliaksia. Maksimimäärä on %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Virheellinen alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias \"%s\" on jo käytössä. Yritä toista aliasta."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias ei voi olla sama kuin ryhmätunnus."
@@ -455,15 +471,15 @@ msgstr "Alias ei voi olla sama kuin ryhmätunnus."
 msgid "Group not found!"
 msgstr "Ryhmää ei löytynyt!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Sinä kuulut jo tähän ryhmään."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Sinut on estetty osallistumasta tähän ryhmään ylläpitäjän toimesta."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Käyttäjä %s ei voinut liittyä ryhmään %s."
@@ -472,7 +488,7 @@ msgstr "Käyttäjä %s ei voinut liittyä ryhmään %s."
 msgid "You are not a member of this group."
 msgstr "Sinä et kuulu tähän ryhmään."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Ei voitu poistaa käyttäjää %s ryhmästä %s"
@@ -504,7 +520,7 @@ msgstr "Koko ei kelpaa."
 #: 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:309
+#: 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
@@ -513,7 +529,7 @@ msgstr "Koko ei kelpaa."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -550,7 +566,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -573,13 +589,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Käyttäjätili"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -659,18 +675,18 @@ msgstr "Formaattia ei ole tuettu."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Käyttäjän %s suosikit"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s aikajana"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -687,12 +703,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s julkinen aikajana"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s päivitykset kaikilta!"
@@ -702,17 +718,17 @@ msgstr "%s päivitykset kaikilta!"
 msgid "Repeated to %s"
 msgstr "Vastaukset käyttäjälle %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Vastaukset käyttäjälle %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Päivitykset joilla on tagi %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Käyttäjän %1$s päivitykset palvelussa %2$s!"
@@ -728,8 +744,7 @@ msgstr "Liitettä ei ole."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Tunnusta ei ole."
 
@@ -741,7 +756,7 @@ msgstr "Kokoa ei ole."
 msgid "Invalid size."
 msgstr "Koko ei kelpaa."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Kuva"
@@ -758,30 +773,30 @@ msgid "User without matching profile"
 msgstr "Käyttäjälle ei löydy profiilia"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Profiilikuva-asetukset"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Alkuperäinen"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Esikatselu"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Poista"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Lataa"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Rajaa"
 
@@ -789,7 +804,7 @@ msgstr "Rajaa"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Valitse neliön muotoinen alue kuvasta profiilikuvaksi"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Tiedoston data hävisi."
 
@@ -822,22 +837,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Ei"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Älä estä tätä käyttäjää"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Kyllä"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Estä tämä käyttäjä"
 
@@ -845,39 +860,43 @@ msgstr "Estä tämä käyttäjä"
 msgid "Failed to save block information."
 msgstr "Käyttäjän estotiedon tallennus epäonnistui."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Tuota ryhmää ei ole."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Käyttäjän profiili"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s ja kaverit, sivu %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Lista käyttäjistä, jotka ovat estetty liittymästä tähän ryhmään."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Poista käyttäjän esto ryhmästä"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Poista esto"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Poista esto tältä käyttäjältä"
 
@@ -958,7 +977,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Istuntoavaimesi kanssa oli ongelma."
 
@@ -984,12 +1003,13 @@ msgstr "Älä poista tätä päivitystä"
 msgid "Delete this application"
 msgstr "Poista tämä päivitys"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Et ole kirjautunut sisään."
@@ -1018,7 +1038,7 @@ msgstr "Oletko varma että haluat poistaa tämän päivityksen?"
 msgid "Do not delete this notice"
 msgstr "Älä poista tätä päivitystä"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Poista tämä päivitys"
 
@@ -1035,19 +1055,19 @@ msgstr "Et voi poistaa toisen käyttäjän päivitystä."
 msgid "Delete user"
 msgstr "Poista käyttäjä"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Poista tämä päivitys"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Ulkoasu"
 
@@ -1155,6 +1175,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Tallenna"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1258,30 +1289,30 @@ msgstr "Muokkaa ryhmää %s"
 msgid "You must be logged in to create a group."
 msgstr "Sinun pitää olla kirjautunut sisään jotta voit luoda ryhmän."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Sinun pitää olla ylläpitäjä, jotta voit muokata ryhmää"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Käytä tätä lomaketta muokataksesi ryhmää."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "kuvaus on liian pitkä (max %d merkkiä)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Ei voitu päivittää ryhmää."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Ei voitu lisätä aliasta."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Asetukset tallennettu."
 
@@ -1628,7 +1659,7 @@ msgstr "Käyttäjä on asettanut eston sinulle."
 msgid "User is not a member of group."
 msgstr "Käyttäjä ei kuulu tähän ryhmään."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Estä käyttäjä ryhmästä"
 
@@ -1662,87 +1693,87 @@ msgid "You must be logged in to edit a group."
 msgstr ""
 "Sinun pitää olla kirjautunut sisään, jotta voit muuttaa ryhmän tietoja."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Ryhmän ulkoasu"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Ei voitu päivittää sinun sivusi ulkoasua."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Ulkoasuasetukset tallennettu."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Ryhmän logo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "Voit ladata ryhmälle logokuvan. Maksimikoko on %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Käyttäjälle ei löydy profiilia"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Valitse neliön muotoinen alue kuvasta logokuvaksi"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo päivitetty."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Logon päivittäminen epäonnistui."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Ryhmän %s jäsenet"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Ryhmän %s jäsenet, sivu %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Lista ryhmän käyttäjistä."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Ylläpito"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Estä"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Tee tästä käyttäjästä ylläpitäjä"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Tee ylläpitäjäksi"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Tee tästä käyttäjästä ylläpitäjä"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -2003,16 +2034,19 @@ msgstr "Henkilökohtainen viesti"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Voit myös lisätä oman viestisi kutsuun"
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Lähetä"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s on kutsunut sinut liittymään palveluun %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2072,7 +2106,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Sinun pitää olla kirjautunut sisään, jos haluat liittyä ryhmään."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Tunnusta ei ole."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s liittyi ryhmään %s"
@@ -2081,11 +2120,11 @@ msgstr "%s liittyi ryhmään %s"
 msgid "You must be logged in to leave a group."
 msgstr "Sinun pitää olla kirjautunut sisään, jotta voit erota ryhmästä."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Sinä et kuulu tähän ryhmään."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s erosi ryhmästä %s"
@@ -2103,8 +2142,7 @@ msgstr "Väärä käyttäjätunnus tai salasana"
 msgid "Error setting user. You are probably not authorized."
 msgstr "Sinulla ei ole valtuutusta tähän."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Kirjaudu sisään"
 
@@ -2365,8 +2403,8 @@ msgstr "Yhdistä"
 msgid "Only "
 msgstr "Vain "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Tuo ei ole tuettu tietomuoto."
 
@@ -2512,7 +2550,7 @@ msgstr "Uutta salasanaa ei voida tallentaa."
 msgid "Password saved."
 msgstr "Salasana tallennettu."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Polut"
 
@@ -2545,7 +2583,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "Kutsu"
@@ -2733,7 +2770,7 @@ msgstr ""
 "välilyöntejä"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Koko nimi"
@@ -2761,7 +2798,7 @@ msgid "Bio"
 msgstr "Tietoja"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2829,24 +2866,25 @@ msgstr "Kieli on liian pitkä (max 50 merkkiä)."
 msgid "Invalid tag: \"%s\""
 msgstr "Virheellinen tagi: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Ei voitu asettaa käyttäjälle automaattista tilausta."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Tageja ei voitu tallentaa."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Ei voitu tallentaa profiilia."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Tageja ei voitu tallentaa."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Asetukset tallennettu."
 
@@ -2859,45 +2897,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Julkista päivitysvirtaa ei saatu."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Julkinen aikajana, sivu %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Julkinen aikajana"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Julkinen syöte (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Julkisen Aikajanan Syöte (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Julkinen syöte (Atom)"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Ole ensimmäinen joka lähettää päivityksen!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2906,7 +2944,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3083,8 +3121,7 @@ msgstr "Virheellinen kutsukoodin."
 msgid "Registration successful"
 msgstr "Rekisteröityminen onnistui"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Rekisteröidy"
 
@@ -3235,7 +3272,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Tilaa"
 
@@ -3279,7 +3316,7 @@ msgstr "Et voi rekisteröityä, jos et hyväksy lisenssiehtoja."
 msgid "You already repeated that notice."
 msgstr "Sinä olet jo estänyt tämän käyttäjän."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Luotu"
@@ -3289,33 +3326,33 @@ msgstr "Luotu"
 msgid "Repeated!"
 msgstr "Luotu"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Vastaukset käyttäjälle %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Viesti käyttäjälle %1$s, %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Päivityksien syöte käyttäjälle %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Päivityksien syöte käyttäjälle %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Päivityksien syöte käyttäjälle %s"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3324,14 +3361,14 @@ msgstr ""
 "Tämä on käyttäjän %s aikajana, mutta %s ei ole lähettänyt vielä yhtään "
 "päivitystä."
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, fuzzy, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3361,7 +3398,6 @@ msgid "User is already sandboxed."
 msgstr "Käyttäjä on asettanut eston sinulle."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3387,7 +3423,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Profiilikuva-asetukset"
@@ -3422,7 +3458,7 @@ msgstr "Sivutus"
 msgid "Description"
 msgstr "Kuvaus"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Tilastot"
@@ -3484,35 +3520,35 @@ msgstr "Käyttäjän %s suosikkipäivitykset"
 msgid "Could not retrieve favorite notices."
 msgstr "Ei saatu haettua suosikkipäivityksiä."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Käyttäjän %s kavereiden syöte (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Käyttäjän %s kavereiden syöte (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Käyttäjän %s kavereiden syöte (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3520,7 +3556,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3534,67 +3570,67 @@ msgstr "Ryhmä %s"
 msgid "%1$s group, page %2$d"
 msgstr "Ryhmän %s jäsenet, sivu %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Ryhmän profiili"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Huomaa"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Aliakset"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Ryhmän toiminnot"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, 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:334
+#: actions/showgroup.php:342
 #, 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:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Syöte ryhmän %s päivityksille (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Käyttäjän %s lähetetyt viestit"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Jäsenet"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Tyhjä)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Kaikki jäsenet"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Luotu"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3604,7 +3640,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3615,7 +3651,7 @@ msgstr ""
 "**%s** on ryhmä palvelussa %%%%site.name%%%%, joka on [mikroblogauspalvelu]"
 "(http://en.wikipedia.org/wiki/Micro-blogging)"
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Ylläpitäjät"
 
@@ -3984,15 +4020,26 @@ msgstr "Koodia ei ole syötetty."
 msgid "You are not subscribed to that profile."
 msgstr "Et ole tilannut tämän käyttäjän päivityksiä."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Tilausta ei onnistuttu tallentamaan."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Käyttäjä ei ole rekisteröitynyt tähän palveluun."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Tiedostoa ei ole."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Et ole tilannut tämän käyttäjän päivityksiä."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Tilattu"
 
@@ -4052,7 +4099,7 @@ msgstr "Näiden ihmisten päivityksiä sinä seuraat."
 msgid "These are the people whose notices %s listens to."
 msgstr "Käyttäjä %s seuraa näiden ihmisten päivityksiä."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4062,35 +4109,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s ei seuraa ketään käyttäjää."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Käyttäjät joilla henkilötagi %s - sivu %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Päivityksien syöte käyttäjälle %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Päivityksien syöte käyttäjälle %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Päivityksien syöte käyttäjälle %s"
@@ -4147,7 +4194,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Tuota tagia ei ole."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-metodi on työn alla!"
 
@@ -4180,77 +4227,79 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Käyttäjä"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profiili"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "Kutsu uusia käyttäjiä"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Kaikki tilaukset"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Tilaa automaattisesti kaikki, jotka tilaavat päivitykseni (ei sovi hyvin "
 "ihmiskäyttäjille)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Kutsu(t) lähetettiin"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "Kutsu(t) lähetettiin"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4436,7 +4485,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Omat"
@@ -4477,6 +4526,11 @@ msgstr "Ei voitu päivittää ryhmää."
 msgid "Group leave failed."
 msgstr "Ryhmän profiili"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Ei voitu päivittää ryhmää."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4495,28 +4549,28 @@ msgstr "Viestin tallennus ei onnistunut."
 msgid "Could not update message with new URI."
 msgstr "Viestin päivittäminen uudella URI-osoitteella ei onnistunut."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Tietokantavirhe tallennettaessa risutagiä: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Virhe tapahtui päivityksen tallennuksessa. Tuntematon käyttäjä."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4524,42 +4578,74 @@ 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:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Päivityksesi tähän palveluun on estetty."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Tietokantavirhe tallennettaessa vastausta: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+msgid "You have been banned from subscribing."
+msgstr "Käyttäjä on estänyt sinua tilaamasta päivityksiä."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Käyttäjä on asettanut eston sinulle."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Ei ole tilattu!."
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Ei voitu poistaa tilausta."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Ei voitu poistaa tilausta."
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Viesti käyttäjälle %1$s, %2$s"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Ryhmän luonti ei onnistunut."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Ryhmän jäsenyystietoja ei voitu asettaa."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Ryhmän jäsenyystietoja ei voitu asettaa."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Tilausta ei onnistuttu tallentamaan."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Vaihda profiiliasetuksesi"
@@ -4602,123 +4688,191 @@ msgstr "Nimetön sivu"
 msgid "Primary site navigation"
 msgstr "Ensisijainen sivunavigointi"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Koti"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Henkilökohtainen profiili ja kavereiden aikajana"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Omat"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Muuta sähköpostiosoitettasi, kuvaasi, salasanaasi, profiiliasi"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Yhdistä"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Käyttäjätili"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Ei voitu uudelleenohjata palvelimelle: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Yhdistä"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Ensisijainen sivunavigointi"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Kutsu"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Ylläpito"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Kirjaudu ulos"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Kutsu"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Kirjaudu ulos palvelusta"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Kirjaudu ulos"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Luo uusi käyttäjätili"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Rekisteröidy"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Kirjaudu sisään palveluun"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Ohjeet"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Kirjaudu sisään"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Auta minua!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Haku"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Ohjeet"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Hae ihmisiä tai tekstiä"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Haku"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Palvelun ilmoitus"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Paikalliset näkymät"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Sivuilmoitus"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Toissijainen sivunavigointi"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Ohjeet"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Tietoa"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "UKK"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Yksityisyys"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Lähdekoodi"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Ota yhteyttä"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "Tönäise"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet-ohjelmiston lisenssi"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4727,12 +4881,12 @@ msgstr ""
 "**%%site.name%%** on mikroblogipalvelu, jonka tarjoaa [%%site.broughtby%%](%%"
 "site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** on mikroblogipalvelu. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4743,105 +4897,170 @@ msgstr ""
 "versio %s, saatavilla lisenssillä [GNU Affero General Public License](http://"
 "www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNet-ohjelmiston lisenssi"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Kaikki "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "lisenssi."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Sivutus"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Myöhemmin"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Aiemmin"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Et voi lähettää viestiä tälle käyttäjälle."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Rekisteröityminen ei ole sallittu."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Komentoa ei ole vielä toteutettu."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Komentoa ei ole vielä toteutettu."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Twitter-asetuksia ei voitu tallentaa!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Sähköpostiosoitteen vahvistus"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Kutsu"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS vahvistus"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Ulkoasu"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS vahvistus"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Käyttäjä"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS vahvistus"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS vahvistus"
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS vahvistus"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Omat"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4937,12 +5156,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Salasanan vaihto"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Salasanan vaihto"
@@ -5096,83 +5315,92 @@ msgstr "Ongelma päivityksen tallentamisessa."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Anna käyttäjätunnus, jonka päivitykset haluat tilata"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Käyttäjää ei ole."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Käyttäjän %s päivitykset tilattu"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Anna käyttäjätunnus, jonka päivityksien tilauksen haluat lopettaa"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Käyttäjän %s päivitysten tilaus lopetettu"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Komentoa ei ole vielä toteutettu."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Ilmoitukset pois päältä."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Ilmoituksia ei voi pistää pois päältä."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Ilmoitukset päällä."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Ilmoituksia ei voi pistää päälle."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Käyttäjän %s päivitysten tilaus lopetettu"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Et ole tilannut tämän käyttäjän päivityksiä."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Olet jos tilannut seuraavien käyttäjien päivitykset:"
 msgstr[1] "Olet jos tilannut seuraavien käyttäjien päivitykset:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Toista ei voitu asettaa tilaamaan sinua."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Toista ei voitu asettaa tilaamaan sinua."
 msgstr[1] "Toista ei voitu asettaa tilaamaan sinua."
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Sinä et kuulu tähän ryhmään."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Sinä et kuulu tähän ryhmään."
 msgstr[1] "Sinä et kuulu tähän ryhmään."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5186,6 +5414,7 @@ msgid ""
 "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"
@@ -5213,20 +5442,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Varmistuskoodia ei ole annettu."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Kirjaudu sisään palveluun"
@@ -5421,23 +5650,23 @@ msgstr "Tiedoston lähetyksessä tapahtui järjestelmävirhe."
 msgid "Not an image or corrupt file."
 msgstr "Tuo ei ole kelvollinen kuva tai tiedosto on rikkoutunut."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Kuvatiedoston formaattia ei ole tuettu."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Tiedosto hävisi."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tunnistamaton tiedoston tyyppi"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5661,7 +5890,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " lähteestä "
@@ -5752,6 +5981,12 @@ msgstr "Vastaanottaja"
 msgid "Available characters"
 msgstr "Sallitut merkit"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Lähetä"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Lähetä päivitys"
@@ -5785,51 +6020,51 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "Ei"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "Ei sisältöä!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Luotu"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Vastaa tähän päivitykseen"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Vastaus"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Päivitys on poistettu."
@@ -5863,11 +6098,6 @@ msgstr "Virhe tapahtui uuden etäprofiilin lisäämisessä"
 msgid "Duplicate notice"
 msgstr "Poista päivitys"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Käyttäjä on estänyt sinua tilaamasta päivityksiä."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Ei voitu lisätä uutta tilausta."
@@ -5884,6 +6114,10 @@ msgstr "Vastaukset"
 msgid "Favorites"
 msgstr "Suosikit"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Käyttäjä"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Saapuneet"
@@ -5978,7 +6212,7 @@ msgstr "Vastaa tähän päivitykseen"
 msgid "Repeat this notice"
 msgstr "Vastaa tähän päivitykseen"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6001,6 +6235,10 @@ msgstr "Haku"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Haku"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6055,35 +6293,14 @@ msgstr "Ihmiset jotka ovat käyttäjän %s tilaajia"
 msgid "Groups %s is a member of"
 msgstr "Ryhmät, joiden jäsen %s on"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Käyttäjä on asettanut eston sinulle."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Ei voitu tilata."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Toista ei voitu asettaa tilaamaan sinua."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Ei ole tilattu!."
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Ei voitu poistaa tilausta."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Kutsu"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Ei voitu poistaa tilausta."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Kutsu kavereita ja työkavereita liittymään palveluun %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6138,68 +6355,68 @@ msgstr "Kuva"
 msgid "User actions"
 msgstr "Käyttäjän toiminnot"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Profiiliasetukset"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Lähetä suora viesti tälle käyttäjälle"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Viesti"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "muutama sekunti sitten"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "noin minuutti sitten"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "noin %d minuuttia sitten"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "noin tunti sitten"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "noin %d tuntia sitten"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "noin päivä sitten"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "noin %d päivää sitten"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "noin kuukausi sitten"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "noin %d kuukautta sitten"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "noin vuosi sitten"
 
index 9fb5e88b2b2c1347bf1fccca95343edf93be8b80..68e210ff1c88ba37230b47967fae3a8a9df104f2 100644 (file)
@@ -14,75 +14,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:44+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:48+0000\n"
 "Language-Team: French\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Accès"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Paramètres d’accès au site"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Inscription"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privé"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 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
-msgid "Invite only"
-msgstr "Sur invitation uniquement"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privé"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Autoriser l’inscription sur invitation seulement."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Fermé"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Sur invitation uniquement"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Désactiver les nouvelles inscriptions."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Enregistrer"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Fermé"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Sauvegarder les paramètres d’accès"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Enregistrer"
+
+#. 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 "Page non trouvée"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -96,46 +103,53 @@ msgstr "Page non trouvée"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Utilisateur non trouvé."
 
-#: actions/all.php:84
+#. 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 et ses amis, page %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s et ses amis"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Flux pour les amis de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Flux pour les amis de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Flux pour les amis de %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -143,7 +157,7 @@ msgstr ""
 "Ceci est le flux pour %s et ses amis mais personne n’a rien posté pour le "
 "moment."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -152,7 +166,8 @@ msgstr ""
 "Essayez de vous abonner à plus d’utilisateurs, de vous [inscrire à un groupe]"
 "(%%action.groups%%) ou de poster quelque chose vous-même."
 
-#: actions/all.php:134
+#. 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 "
@@ -162,7 +177,7 @@ msgstr ""
 "profil ou [poster quelque chose à son intention](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -171,12 +186,13 @@ msgstr ""
 "Pourquoi ne pas [créer un compte](%%%%action.register%%%%) et ensuite faire "
 "un clin d’œil à %s ou poster un avis à son intention."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Vous et vos amis"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Statuts de %1$s et ses amis dans %2$s!"
@@ -189,20 +205,20 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Méthode API non trouvée !"
 
@@ -236,8 +252,9 @@ msgstr "Impossible de mettre à jour l’utilisateur."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Aucun profil ne correspond à cet utilisateur."
 
@@ -263,7 +280,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -375,7 +392,7 @@ msgstr "Impossible de déterminer l’utilisateur source."
 msgid "Could not find target user."
 msgstr "Impossible de trouver l’utilisateur cible."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -383,62 +400,62 @@ msgstr ""
 "Les pseudos ne peuvent contenir que des caractères minuscules et des "
 "chiffres, sans espaces."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Pseudo déjà utilisé. Essayez-en un autre."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Pseudo invalide."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "L’adresse du site personnel n’est pas un URL valide. "
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Nom complet trop long (maximum de 255 caractères)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "La description est trop longue (%d caractères maximum)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Emplacement trop long (maximum de 255 caractères)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Trop d’alias ! Maximum %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Alias invalide : « %s »"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias « %s » déjà utilisé. Essayez-en un autre."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "L’alias ne peut pas être le même que le pseudo."
@@ -449,15 +466,15 @@ msgstr "L’alias ne peut pas être le même que le pseudo."
 msgid "Group not found!"
 msgstr "Groupe non trouvé !"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Vous êtes déjà membre de ce groupe."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Vous avez été bloqué de ce groupe par l’administrateur."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Impossible de joindre l’utilisateur %1$s au groupe %2$s."
@@ -466,7 +483,7 @@ msgstr "Impossible de joindre l’utilisateur %1$s au groupe %2$s."
 msgid "You are not a member of this group."
 msgstr "Vous n’êtes pas membre de ce groupe."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Impossible de retirer l’utilisateur %1$s du groupe %2$s."
@@ -497,7 +514,7 @@ msgstr "Jeton incorrect."
 #: 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:309
+#: 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
@@ -506,7 +523,7 @@ msgstr "Jeton incorrect."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -545,7 +562,7 @@ msgstr "Le jeton de connexion %s a été refusé et révoqué."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -573,13 +590,13 @@ msgstr ""
 "devriez donner l’accès à votre compte %4$s qu’aux tiers à qui vous faites "
 "confiance."
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Compte"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -657,18 +674,18 @@ msgstr "Format non supporté."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favoris de %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Activité de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -684,12 +701,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Activité publique %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s statuts de tout le monde !"
@@ -699,17 +716,17 @@ msgstr "%s statuts de tout le monde !"
 msgid "Repeated to %s"
 msgstr "Repris pour %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Reprises de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Avis marqués avec %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Mises à jour marquées avec %1$s dans %2$s !"
@@ -725,8 +742,7 @@ msgstr "Pièce jointe non trouvée."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Aucun pseudo."
 
@@ -738,7 +754,7 @@ msgstr "Aucune taille"
 msgid "Invalid size."
 msgstr "Taille incorrecte."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -757,30 +773,30 @@ msgid "User without matching profile"
 msgstr "Utilisateur sans profil correspondant"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Paramètres de l’avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Image originale"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Aperçu"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Supprimer"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Transfert"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Recadrer"
 
@@ -788,7 +804,7 @@ msgstr "Recadrer"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Sélectionnez une zone de forme carrée pour définir votre avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Données perdues."
 
@@ -823,22 +839,22 @@ msgstr ""
 "serez pas informé des @-réponses de sa part."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Non"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Ne pas bloquer cet utilisateur"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Oui"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Bloquer cet utilisateur"
 
@@ -846,39 +862,43 @@ msgstr "Bloquer cet utilisateur"
 msgid "Failed to save block information."
 msgstr "Impossible d’enregistrer les informations de blocage."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Aucun groupe trouvé."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s profils bloqués"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s profils bloqués, page %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Une liste des utilisateurs dont l’inscription à ce groupe est bloquée."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Débloquer l’utilisateur de ce groupe"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Débloquer"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Débloquer cet utilisateur"
 
@@ -953,7 +973,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Un problème est survenu avec votre jeton de session."
 
@@ -979,12 +999,13 @@ msgstr "Ne pas supprimer cette application"
 msgid "Delete this application"
 msgstr "Supprimer cette application"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Non connecté."
@@ -1013,7 +1034,7 @@ msgstr "Voulez-vous vraiment supprimer cet avis ?"
 msgid "Do not delete this notice"
 msgstr "Ne pas supprimer cet avis"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Supprimer cet avis"
 
@@ -1029,7 +1050,7 @@ msgstr "Vous pouvez seulement supprimer les utilisateurs locaux."
 msgid "Delete user"
 msgstr "Supprimer l’utilisateur"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1037,12 +1058,12 @@ msgstr ""
 "Voulez-vous vraiment supprimer cet utilisateur ? Ceci effacera toutes les "
 "données à son propos de la base de données, sans sauvegarde."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Supprimer cet utilisateur"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Conception"
 
@@ -1145,6 +1166,17 @@ msgstr "Restaurer les conceptions par défaut"
 msgid "Reset back to default"
 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/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 "Enregistrer"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Sauvegarder la conception"
@@ -1236,29 +1268,29 @@ msgstr "Modifier le groupe %s"
 msgid "You must be logged in to create a group."
 msgstr "Vous devez ouvrir une session pour créer un groupe."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Vous devez être administrateur pour modifier le groupe."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Remplissez ce formulaire pour modifier les options du groupe."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "la description est trop longue (%d caractères maximum)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Impossible de mettre à jour le groupe."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Impossible de créer les alias."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Vos options ont été enregistrées."
 
@@ -1599,7 +1631,7 @@ msgstr "Cet utilisateur est déjà bloqué pour le groupe."
 msgid "User is not a member of group."
 msgstr "L’utilisateur n’est pas membre du groupe."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Bloquer cet utilisateur du groupe"
 
@@ -1635,11 +1667,11 @@ msgstr "Aucun identifiant."
 msgid "You must be logged in to edit a group."
 msgstr "Vous devez ouvrir une session pour modifier un groupe."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Conception du groupe"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1647,20 +1679,20 @@ msgstr ""
 "Personnalisez l’apparence de votre groupe avec une image d’arrière plan et "
 "une palette de couleurs de votre choix"
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Impossible de mettre à jour votre conception."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Préférences de conception enregistrées."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo du groupe"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1668,57 +1700,57 @@ msgstr ""
 "Vous pouvez choisir un logo pour votre groupe. La taille maximale du fichier "
 "est de %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Utilisateur sans profil correspondant."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Sélectionnez une zone de forme carrée sur l’image qui sera le logo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo mis à jour."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "La mise à jour du logo a échoué."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Membres du groupe %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Membres du groupe %1$s - page %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Liste des utilisateurs inscrits à ce groupe."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrer"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloquer"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Faire de cet utilisateur un administrateur du groupe"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Faire un administrateur"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Faire de cet utilisateur un administrateur"
 
-#: actions/grouprss.php:133
+#: 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 !"
@@ -1989,16 +2021,19 @@ msgstr "Message personnel"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Ajouter un message personnel à l’invitation (optionnel)."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Envoyer"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s vous invite à vous inscrire sur %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2061,7 +2096,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Vous devez ouvrir une session pour rejoindre un groupe."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Aucun pseudo ou ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s a rejoint le groupe %2$s"
@@ -2070,11 +2109,11 @@ msgstr "%1$s a rejoint le groupe %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Vous devez ouvrir une session pour quitter un groupe."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Vous n’êtes pas membre de ce groupe."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s a quitté le groupe %2$s"
@@ -2093,8 +2132,7 @@ msgstr ""
 "Erreur lors de la mise en place de l’utilisateur. Vous n’y êtes probablement "
 "pas autorisé."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Ouvrir une session"
 
@@ -2356,8 +2394,8 @@ msgstr "type de contenu "
 msgid "Only "
 msgstr "Seulement "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Format de données non supporté."
 
@@ -2497,7 +2535,7 @@ msgstr "Impossible de sauvegarder le nouveau mot de passe."
 msgid "Password saved."
 msgstr "Mot de passe enregistré."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Chemins"
 
@@ -2530,7 +2568,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Serveur SSL invalide. La longueur maximale est de 255 caractères."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Site"
 
@@ -2705,7 +2742,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1 à 64 lettres minuscules ou chiffres, sans ponctuation ni espaces"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nom complet"
@@ -2733,7 +2770,7 @@ msgid "Bio"
 msgstr "Bio"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2801,23 +2838,24 @@ msgstr "La langue est trop longue (255 caractères maximum)."
 msgid "Invalid tag: \"%s\""
 msgstr "Marque invalide : « %s »"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Impossible de mettre à jour l’auto-abonnement."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Impossible d’enregistrer les préférences de localisation."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Impossible d’enregistrer le profil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Impossible d’enregistrer les marques."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Préférences enregistrées."
 
@@ -2830,28 +2868,28 @@ msgstr "Au-delà de la limite de page (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Impossible de récupérer le flux public."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Flux public - page %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Flux public"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Fil du flux public (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Fil du flux public (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Fil du flux public (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2860,11 +2898,11 @@ msgstr ""
 "Ceci est la chronologie publique de %%site.name%% mais personne n’a encore "
 "rien posté."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Soyez le premier à poster !"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2872,7 +2910,7 @@ msgstr ""
 "Pourquoi ne pas [créer un compte](%%action.register%%) et être le premier à "
 "poster !"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2886,7 +2924,7 @@ msgstr ""
 "vous avec vos amis, famille et collègues ! ([Plus d’informations](%%doc.help%"
 "%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3068,8 +3106,7 @@ msgstr "Désolé, code d’invitation invalide."
 msgid "Registration successful"
 msgstr "Compte créé avec succès"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Créer un compte"
 
@@ -3220,7 +3257,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "S’abonner"
 
@@ -3257,7 +3294,7 @@ msgstr "Vous ne pouvez pas reprendre votre propre avis."
 msgid "You already repeated that notice."
 msgstr "Vous avez déjà repris cet avis."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repris"
 
@@ -3265,33 +3302,33 @@ msgstr "Repris"
 msgid "Repeated!"
 msgstr "Repris !"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Réponses à %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Réponses à %1$s, page %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Flux des réponses pour %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Flux des réponses pour %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Flux des réponses pour %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3300,7 +3337,7 @@ msgstr ""
 "Ceci est la chronologie des réponses à %1$s mais %2$s n’a encore reçu aucun "
 "avis à son intention."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3310,7 +3347,7 @@ msgstr ""
 "abonner à plus de personnes ou vous [inscrire à des groupes](%%action.groups%"
 "%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3339,7 +3376,6 @@ msgid "User is already sandboxed."
 msgstr "L’utilisateur est déjà dans le bac à sable."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessions"
 
@@ -3364,7 +3400,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Sauvegarder les paramètres du site"
 
@@ -3394,7 +3430,7 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistiques"
@@ -3457,22 +3493,22 @@ msgstr "Avis favoris de %1$s, page %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Impossible d’afficher les favoris."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Flux pour les amis de %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Flux pour les amis de %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Flux pour les amis de %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3481,7 +3517,7 @@ msgstr ""
 "favori sur les avis que vous aimez pour les mémoriser à l’avenir ou les "
 "mettre en lumière."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3490,7 +3526,7 @@ msgstr ""
 "%s n’a pas ajouté d’avis à ses favoris pour le moment. Publiez quelque chose "
 "d’intéressant, et cela pourrait être ajouté à ses favoris :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3501,7 +3537,7 @@ msgstr ""
 "un compte](%%%%action.register%%%%), puis poster quelque chose "
 "d’intéressant, qui serait ajouté à ses favoris :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "C’est un moyen de partager ce que vous aimez."
 
@@ -3515,67 +3551,67 @@ msgstr "Groupe %s"
 msgid "%1$s group, page %2$d"
 msgstr "Groupe %1$s, page %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Profil du groupe"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Note"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Alias"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Actions du groupe"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fil des avis du groupe %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fil des avis du groupe %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fil des avis du groupe %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "ami d’un ami pour le groupe %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membres"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(aucun)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Tous les membres"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Créé"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3591,7 +3627,7 @@ msgstr ""
 "action.register%%%%) pour devenir membre de ce groupe et bien plus ! ([En "
 "lire plus](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3604,7 +3640,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:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administrateurs"
 
@@ -3978,15 +4014,26 @@ msgstr "Aucun code entré"
 msgid "You are not subscribed to that profile."
 msgstr "Vous n’êtes pas abonné(e) à ce profil."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Impossible d’enregistrer l’abonnement."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Ceci n’est pas un utilisateur local."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Cette action n'accepte que les requêtes de type POST."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Profil non-trouvé."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"Vous ne pouvez pas vous abonner  à un profil OMB 0.1 distant par cette "
+"action."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonné"
 
@@ -4050,7 +4097,7 @@ msgstr "Vous suivez les avis de ces personnes."
 msgid "These are the people whose notices %s listens to."
 msgstr "Les avis de ces personnes sont suivis par %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4066,35 +4113,35 @@ msgstr ""
 "êtes un [utilisateur de Twitter](%%action.twittersettings%%), vous pouvez "
 "vous abonner automatiquement aux gens auquels vous êtes déjà abonné là-bas."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s ne suit actuellement personne."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Avis marqués avec %1$s, page %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Flux des avis pour la marque %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Flux des avis pour la marque %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Flux des avis pour la marque %s (Atom)"
@@ -4149,7 +4196,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Cette marque n’existe pas."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Méthode API en construction."
 
@@ -4181,71 +4228,73 @@ msgstr ""
 "La licence du flux auquel vous êtes abonné(e), « %1$s », n’est pas compatible "
 "avec la licence du site « %2$s »."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Utilisateur"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Paramètres des utilisateurs pour ce site StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Limite de bio invalide : doit être numérique."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Texte de bienvenue invalide. La taille maximale est de 255 caractères."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Abonnement par défaut invalide : « %1$s » n’est pas un utilisateur."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Limite de bio"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Longueur maximale de la bio d’un profil en caractères."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nouveaux utilisateurs"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Accueil des nouveaux utilisateurs"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 "Texte de bienvenue pour les nouveaux utilisateurs (maximum 255 caractères)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Abonnements par défaut"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Abonner automatiquement les nouveaux utilisateurs à cet utilisateur."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Invitations"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Invitations activées"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 "S’il faut autoriser les utilisateurs à inviter de nouveaux utilisateurs."
@@ -4445,7 +4494,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Extensions"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Version"
 
@@ -4484,6 +4533,10 @@ msgstr "N’appartient pas au groupe."
 msgid "Group leave failed."
 msgstr "La désinscription du groupe a échoué."
 
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Impossible de mettre à jour le groupe local."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4501,27 +4554,27 @@ msgstr "Impossible d’insérer le message."
 msgid "Could not update message with new URI."
 msgstr "Impossible de mettre à jour le message avec un nouvel URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Erreur de base de donnée en insérant la marque (hashtag) : %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problème lors de l’enregistrement de l’avis ; trop long."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Erreur lors de l’enregistrement de l’avis. Utilisateur inconnu."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4529,41 +4582,69 @@ msgstr ""
 "Trop de messages en double trop vite ! Prenez une pause et publiez à nouveau "
 "dans quelques minutes."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 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:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problème lors de l’enregistrement de l’avis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Problème lors de l’enregistrement de la boîte de réception du groupe."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Erreur de base de donnée en insérant la réponse :%s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Il vous avez été interdit de vous abonner."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Déjà abonné !"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Cet utilisateur vous a bloqué."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Pas abonné !"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Impossible de supprimer l’abonnement à soi-même."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Impossible de cesser l’abonnement"
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bienvenue à %1$s, @%2$s !"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Impossible de créer le groupe."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Impossible de définir l'URI du groupe."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Impossible d’établir l’inscription au groupe."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Impossible d’enregistrer les informations du groupe local."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Modifier vos paramètres de profil"
@@ -4605,120 +4686,190 @@ msgstr "Page sans nom"
 msgid "Primary site navigation"
 msgstr "Navigation primaire du site"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Accueil"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profil personnel et flux des amis"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personnel"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Modifier votre courriel, avatar, mot de passe, profil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Connecter"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Compte"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Se connecter aux services"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Connecter"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modifier la configuration du site"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Inviter"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrer"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Fermeture de session"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Inviter"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Fermer la session"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Fermeture de session"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Créer un compte"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Créer un compte"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Ouvrir une session"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Aide"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Ouvrir une session"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "À l’aide !"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Rechercher"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Aide"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Rechercher des personnes ou du texte"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Rechercher"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Notice du site"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Vues locales"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Avis de la page"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navigation secondaire du site"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Aide"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "À propos"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "CGU"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Confidentialité"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Source"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Insigne"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licence du logiciel StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4727,12 +4878,12 @@ msgstr ""
 "**%%site.name%%** est un service de microblogging qui vous est proposé par  "
 "[%%site.broughtby%%](%%site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** est un service de micro-blogging."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4743,99 +4894,164 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licence du contenu du site"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Tous "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Après"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Avant"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Impossible de gérer le contenu distant pour le moment."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Impossible de gérer le contenu XML embarqué pour le moment."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Impossible de gérer le contenu en Base64 embarqué pour le moment."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Vous ne pouvez pas faire de modifications sur ce site."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "La modification de ce panneau n’est pas autorisée."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() n’a pas été implémentée."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() n’a pas été implémentée."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Impossible de supprimer les paramètres de conception."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configuration basique du site"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configuration de la conception"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Conception"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Configuration utilisateur"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Utilisateur"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Configuration d’accès"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configuration des chemins"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Configuration des sessions"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessions"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "La ressource de l’API a besoin de l’accès en lecture et en écriture, mais "
 "vous n’y avez accès qu’en lecture."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4929,11 +5145,11 @@ msgstr "Avis sur lesquels cette pièce jointe apparaît."
 msgid "Tags for this attachment"
 msgstr "Marques de cette pièce jointe"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "La modification du mot de passe a échoué"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "La modification du mot de passe n’est pas autorisée"
 
@@ -5088,82 +5304,91 @@ msgstr "Problème lors de l’enregistrement de l’avis."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Indiquez le nom de l’utilisateur auquel vous souhaitez vous abonner"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Utilisateur non trouvé."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Abonné à %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Indiquez le nom de l’utilisateur duquel vous souhaitez vous désabonner"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Désabonné de %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Cette commande n’a pas encore été implémentée."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Avertissements désactivés."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Impossible de désactiver les avertissements."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Avertissements activés."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Impossible d’activer les avertissements."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "La commande d’ouverture de session est désactivée"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Ce lien n’est utilisable qu’une seule fois, et est valable uniquement "
 "pendant 2 minutes : %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Désabonné de %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Vous n’êtes abonné(e) à personne."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Vous êtes abonné à cette personne :"
 msgstr[1] "Vous êtes abonné à ces personnes :"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Personne ne s’est abonné à vous."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Cette personne est abonnée à vous :"
 msgstr[1] "Ces personnes sont abonnées à vous :"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Vous n’êtes membre d’aucun groupe."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Vous êtes membre de ce groupe :"
 msgstr[1] "Vous êtes membre de ces groupes :"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5177,6 +5402,7 @@ msgid ""
 "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"
@@ -5215,6 +5441,7 @@ msgstr ""
 "d <nickname> <text> - message direct à l’utilisateur\n"
 "get <nickname> - obtenir le dernier avis de l’utilisateur\n"
 "whois <nickname> - obtenir le profil de l’utilisateur\n"
+"lose <nickname> - forcer un utilisateur à arrêter de vous suivre\n"
 "fav <nickname> - ajouter de dernier avis de l’utilisateur comme favori\n"
 "fav #<notice_id> - ajouter l’avis correspondant à l’identifiant comme "
 "favori\n"
@@ -5242,20 +5469,20 @@ msgstr ""
 "tracks - pas encore implémenté.\n"
 "tracking - pas encore implémenté.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Aucun fichier de configuration n’a été trouvé. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 "J’ai cherché des fichiers de configuration dans les emplacements suivants : "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Vous pouvez essayer de lancer l’installeur pour régler ce problème."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Aller au programme d’installation"
 
@@ -5448,23 +5675,23 @@ msgstr "Erreur système lors du transfert du fichier."
 msgid "Not an image or corrupt file."
 msgstr "Ceci n’est pas une image, ou c’est un fichier corrompu."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Format de fichier d’image non supporté."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Fichier perdu."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Type de fichier inconnu"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "Mo"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "Ko"
 
@@ -5754,7 +5981,7 @@ msgstr ""
 "pour démarrer des conversations avec d’autres utilisateurs. Ceux-ci peuvent "
 "vous envoyer des messages destinés à vous seul(e)."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "de"
 
@@ -5847,6 +6074,12 @@ msgstr "À"
 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"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Envoyer un avis"
@@ -5880,48 +6113,48 @@ msgstr ""
 "Désolé, l’obtention de votre localisation prend plus de temps que prévu. "
 "Veuillez réessayer plus tard."
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u° %2$u' %3$u\" %4$s %5$u° %6$u' %7$u\" %8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "E"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "O"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "chez"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "dans le contexte"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Repris par"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Répondre à cet avis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Répondre"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Avis repris"
 
@@ -5953,10 +6186,6 @@ msgstr "Erreur lors de l’insertion du profil distant"
 msgid "Duplicate notice"
 msgstr "Dupliquer l’avis"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Il vous avez été interdit de vous abonner."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Impossible d’insérer un nouvel abonnement."
@@ -5973,6 +6202,10 @@ 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"
@@ -6062,7 +6295,7 @@ msgstr "Reprendre cet avis ?"
 msgid "Repeat this notice"
 msgstr "Reprendre cet avis"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Aucun utilisateur unique défini pour le mode mono-utilisateur."
 
@@ -6082,6 +6315,10 @@ msgstr "Rechercher sur le site"
 msgid "Keyword(s)"
 msgstr "Mot(s) clef(s)"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Rechercher"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Aide sur la recherche"
@@ -6133,33 +6370,14 @@ msgstr "Abonnés de %s"
 msgid "Groups %s is a member of"
 msgstr "Groupes de %s"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Déjà abonné !"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Cet utilisateur vous a bloqué."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Impossible de s’abonner."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Impossible d’abonner une autre personne à votre profil."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Pas abonné !"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Impossible de supprimer l’abonnement à soi-même."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Inviter"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Impossible de cesser l’abonnement"
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Inviter des amis et collègues à vous rejoindre dans %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6211,67 +6429,67 @@ msgstr "Modifier l’avatar"
 msgid "User actions"
 msgstr "Actions de l’utilisateur"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Modifier les paramètres du profil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Modifier"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Envoyer un message à cet utilisateur"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Message"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Modérer"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "il y a quelques secondes"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "il y a 1 minute"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "il y a %d minutes"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "il y a 1 heure"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "il y a %d heures"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "il y a 1 jour"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "il y a %d jours"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "il y a 1 mois"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "il y a %d mois"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "il y a environ 1 an"
 
index 0358b8ecd0824a3b98e5cbd96e88c1b741b296b5..0b62fe337c5f366aff2d5ca0b284d422301ea7ea 100644 (file)
@@ -8,84 +8,90 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:47+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:51+0000\n"
 "Language-Team: Irish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
 "4;\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Aceptar"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Configuracións de Twitter"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Rexistrar"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Privacidade"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "Invitar"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Bloquear"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Gardar"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Configuracións de Twitter"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Gardar"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Non existe a etiqueta."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -99,79 +105,88 @@ msgstr "Non existe a etiqueta."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Ningún usuario."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s e amigos"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s e amigos"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s e amigos"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Actualizacións dende %1$s e amigos en %2$s!"
@@ -184,20 +199,20 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Método da API non atopado"
@@ -231,8 +246,9 @@ msgstr "Non se puido actualizar o usuario."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "O usuario non ten perfil."
 
@@ -257,7 +273,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -380,68 +396,68 @@ msgstr "Non se pudo recuperar a liña de tempo publica."
 msgid "Could not find target user."
 msgstr "Non se puido atopar ningún estado"
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "O alcume debe ter só letras minúsculas e números, e sen espazos."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "O alcume xa está sendo empregado por outro usuario. Tenta con outro."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Non é un alcume válido."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "A páxina persoal semella que non é unha URL válida."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "O nome completo é demasiado longo (max 255 car)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "O teu Bio é demasiado longo (max 140 car.)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "A localización é demasiado longa (max 255 car.)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Etiqueta inválida: '%s'"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "O alcume xa está sendo empregado por outro usuario. Tenta con outro."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -453,15 +469,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Método da API non atopado"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Xa estas suscrito a estes usuarios:"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Non podes seguir a este usuario: o Usuario non se atopa."
@@ -470,7 +486,7 @@ msgstr "Non podes seguir a este usuario: o Usuario non se atopa."
 msgid "You are not a member of this group."
 msgstr "Non estás suscrito a ese perfil"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Non podes seguir a este usuario: o Usuario non se atopa."
@@ -502,7 +518,7 @@ msgstr "Tamaño inválido."
 #: 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:309
+#: 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
@@ -511,7 +527,7 @@ msgstr "Tamaño inválido."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -546,7 +562,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -569,14 +585,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "Sobre"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -658,18 +674,18 @@ msgstr "Formato de ficheiro de imaxe non soportado."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Favoritos dende %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Liña de tempo de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -685,12 +701,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Liña de tempo pública de %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s chíos de calquera!"
@@ -700,17 +716,17 @@ msgstr "%s chíos de calquera!"
 msgid "Repeated to %s"
 msgstr "Replies to %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Replies to %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Chíos tagueados con %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualizacións dende %1$s en %2$s!"
@@ -727,8 +743,7 @@ msgstr "Ningún documento."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Sen alcume."
 
@@ -740,7 +755,7 @@ msgstr "Sen tamaño."
 msgid "Invalid size."
 msgstr "Tamaño inválido."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -757,32 +772,32 @@ msgid "User without matching profile"
 msgstr "Usuario sen un perfil que coincida."
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 #, fuzzy
 msgid "Avatar settings"
 msgstr "Configuracións de Twitter"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete"
 msgstr "eliminar"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Subir"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -790,7 +805,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -827,23 +842,23 @@ msgstr ""
 "ser notificado de ningunha resposta-@ del."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Bloquear usuario"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Si"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "Bloquear usuario"
@@ -852,41 +867,45 @@ msgstr "Bloquear usuario"
 msgid "Failed to save block information."
 msgstr "Erro ao gardar información de bloqueo."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "Non existe a etiqueta."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s e amigos"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "Desbloqueo de usuario fallido."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Desbloquear"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "Bloquear usuario"
@@ -968,7 +987,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:1195
+#: lib/action.php:1228
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "Houbo un problema co teu token de sesión. Tentao de novo, anda..."
@@ -995,12 +1014,13 @@ msgstr "Non se pode eliminar este chíos."
 msgid "Delete this application"
 msgstr "Eliminar chío"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Non está logueado."
@@ -1031,7 +1051,7 @@ msgstr "Estas seguro que queres eliminar este chío?"
 msgid "Do not delete this notice"
 msgstr "Non se pode eliminar este chíos."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete this notice"
 msgstr "Eliminar chío"
@@ -1051,19 +1071,19 @@ msgstr "Non deberías eliminar o estado de outro usuario"
 msgid "Delete user"
 msgstr "eliminar"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Eliminar chío"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1173,6 +1193,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Gardar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1278,32 +1309,32 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s"
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Debes estar logueado para invitar a outros usuarios a empregar %s"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "O teu Bio é demasiado longo (max 140 car.)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "Non se puido actualizar o usuario."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Non se puido crear o favorito."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 #, fuzzy
 msgid "Options saved."
 msgstr "Configuracións gardadas."
@@ -1654,7 +1685,7 @@ msgstr "O usuario bloqueoute."
 msgid "User is not a member of group."
 msgstr "%1s non é unha orixe fiable."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Bloquear usuario"
@@ -1692,91 +1723,91 @@ msgstr "Sen id."
 msgid "You must be logged in to edit a group."
 msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s"
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Non se puido actualizar o usuario."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Preferencias gardadas."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Usuario sen un perfil que coincida."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "Avatar actualizado."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "Acounteceu un fallo ó actualizar o avatar."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloquear"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -2035,16 +2066,19 @@ msgstr "Mensaxe persoal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Opcionalmente engadir unha mensaxe persoal á invitación."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Enviar"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s invitoute a unirse a él en %2$s."
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2104,7 +2138,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s"
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Sen alcume."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s / Favoritos dende %s"
@@ -2114,12 +2153,12 @@ msgstr "%s / Favoritos dende %s"
 msgid "You must be logged in to leave a group."
 msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s"
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "Non estás suscrito a ese perfil"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s / Favoritos dende %s"
@@ -2137,8 +2176,7 @@ msgstr "Usuario ou contrasinal incorrectos."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Non está autorizado."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Inicio de sesión"
 
@@ -2396,8 +2434,8 @@ msgstr "Conectar"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Non é un formato de datos soportado."
 
@@ -2545,7 +2583,7 @@ msgstr "Non se pode gardar a contrasinal."
 msgid "Password saved."
 msgstr "Contrasinal gardada."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2578,7 +2616,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "Invitar"
@@ -2764,7 +2801,7 @@ msgstr ""
 "De 1 a 64 letras minúsculas ou númeors, nin espazos nin signos de puntuación"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nome completo"
@@ -2793,7 +2830,7 @@ msgid "Bio"
 msgstr "Bio"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2861,24 +2898,25 @@ msgstr "A Linguaxe é demasiado longa (max 50 car.)."
 msgid "Invalid tag: \"%s\""
 msgstr "Etiqueta inválida: '%s'"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Non se puido actualizar o usuario para autosuscrición."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Non se puideron gardar as etiquetas."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Non se puido gardar o perfil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Non se puideron gardar as etiquetas."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Configuracións gardadas."
 
@@ -2891,48 +2929,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Non se pudo recuperar a liña de tempo publica."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "Liña de tempo pública"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Liña de tempo pública"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Sindicación do Fio Público"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Sindicación do Fio Público"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Sindicación do Fio Público"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2945,7 +2983,7 @@ msgstr ""
 "(http://status.net/). [Únete agora](%%action.register%%) para compartir "
 "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3122,8 +3160,7 @@ msgstr "Acounteceu un erro co código de confirmación."
 msgid "Registration successful"
 msgstr "Xa estas rexistrado!!"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Rexistrar"
 
@@ -3276,7 +3313,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subscribir"
 
@@ -3319,7 +3356,7 @@ msgstr "Non podes rexistrarte se non estas de acordo coa licenza."
 msgid "You already repeated that notice."
 msgstr "Xa bloqueaches a este usuario."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Crear"
@@ -3329,47 +3366,47 @@ msgstr "Crear"
 msgid "Repeated!"
 msgstr "Crear"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Replies to %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Mensaxe de %1$s en %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3397,7 +3434,6 @@ msgid "User is already sandboxed."
 msgstr "O usuario bloqueoute."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3422,7 +3458,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Configuracións de Twitter"
@@ -3458,7 +3494,7 @@ msgstr "Invitación(s) enviada(s)."
 msgid "Description"
 msgstr "Subscricións"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Estatísticas"
@@ -3520,35 +3556,35 @@ msgstr "Chíos favoritos de %s"
 msgid "Could not retrieve favorite notices."
 msgstr "Non se pode "
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Fonte para os amigos de %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3556,7 +3592,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3570,73 +3606,73 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "Tódalas subscricións"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Non existe o perfil."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 #, fuzzy
 msgid "Note"
 msgstr "Chíos"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 #, fuzzy
 msgid "Group actions"
 msgstr "Outras opcions"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Band. Saída para %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Membro dende"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 #, fuzzy
 msgid "(None)"
 msgstr "(nada)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Crear"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3650,7 +3686,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:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3663,7 +3699,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:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -4036,15 +4072,26 @@ msgstr "Non se inseriu ningún código"
 msgid "You are not subscribed to that profile."
 msgstr "Non estás suscrito a ese perfil"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Non se pode gardar a subscrición."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Non é usuario local."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Ningún chío."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Non estás suscrito a ese perfil"
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Suscrito"
 
@@ -4104,7 +4151,7 @@ msgstr "Esa é a xente á que lle estas a escoitar os seus chíos"
 msgid "These are the people whose notices %s listens to."
 msgstr "Esta é a xente á que lle estas a escoitar os chíos %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4114,35 +4161,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s está a escoitar os teus chíos %2$s."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Usuarios auto-etiquetados como %s - páxina %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Fonte de chíos para %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Fonte de chíos para %s"
@@ -4201,7 +4248,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Non existe a etiqueta."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Método da API en contrución."
 
@@ -4234,77 +4281,79 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Usuario"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Perfil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "Invitar a novos usuarios"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Tódalas subscricións"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Suscribirse automáticamente a calquera que se suscriba a min (o mellor para "
 "non humáns)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Invitación(s) enviada(s)."
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "Invitación(s) enviada(s)."
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4492,7 +4541,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Persoal"
@@ -4533,6 +4582,11 @@ msgstr "Non se puido actualizar o usuario."
 msgid "Group leave failed."
 msgstr "Non existe o perfil."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Non se puido actualizar o usuario."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4551,28 +4605,28 @@ msgstr "Non se pode inserir unha mensaxe."
 msgid "Could not update message with new URI."
 msgstr "Non se puido actualizar a mensaxe coa nova URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro ó inserir o hashtag na BD: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Aconteceu un erro ó gardar o chío. Usuario descoñecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4581,44 +4635,76 @@ msgstr ""
 "Demasiados chíos en pouco tempo; tomate un respiro e envíao de novo dentro "
 "duns minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Tes restrinxido o envio de chíos neste sitio."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Erro ó inserir a contestación na BD: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+msgid "You have been banned from subscribing."
+msgstr "Este usuario non che permite suscribirte a el."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "O usuario bloqueoute."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Non está suscrito!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Non se pode eliminar a subscrición."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Non se pode eliminar a subscrición."
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Mensaxe de %1$s en %2$s"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "Non se puido crear o favorito."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Non se pode gardar a subscrición."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Non se pode gardar a subscrición."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Non se pode gardar a subscrición."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Configuración de perfil"
@@ -4662,130 +4748,190 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Persoal"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
+#: lib/action.php:442
 #, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Persoal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambiar contrasinal"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Conectar"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Sobre"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Non se pode redireccionar ao servidor: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Conectar"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Navegación de subscricións"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invitar"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
+msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 "Emprega este formulario para invitar ós teus amigos e colegas a empregar "
 "este servizo."
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Sair"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Sair"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear nova conta"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Rexistrar"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Axuda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Inicio de sesión"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Axuda"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Buscar"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Axuda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Buscar"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "Novo chío"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "Novo chío"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Navegación de subscricións"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Axuda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Preguntas frecuentes"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4794,12 +4940,12 @@ msgstr ""
 "**%%site.name%%** é un servizo de microbloguexo que che proporciona [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é un servizo de microbloguexo."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4810,108 +4956,172 @@ msgstr ""
 "%s, dispoñible baixo licenza [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "Atopar no contido dos chíos"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 #, fuzzy
 msgid "All "
 msgstr "Todos"
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "« Despois"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "Antes »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Non podes enviar mensaxes a este usurio."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Non se permite o rexistro neste intre."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Comando non implementado."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Comando non implementado."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Non se puideron gardar os teus axustes de Twitter!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Confirmar correo electrónico"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Invitar"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "Confirmación de SMS"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Persoal"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Confirmación de SMS"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Usuario"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Confirmación de SMS"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Confirmación de SMS"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Confirmación de SMS"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Persoal"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -5007,12 +5217,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Contrasinal gardada."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Contrasinal gardada."
@@ -5170,55 +5380,64 @@ msgstr "Aconteceu un erro ó gardar o chío."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Especifica o nome do usuario ó que queres suscribirte"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Ningún usuario."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Suscrito a %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Especifica o nome de usuario ó que queres deixar de seguir"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Desuscribir de %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Comando non implementado."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificación desactivada."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "No se pode desactivar a notificación."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificación habilitada."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Non se pode activar a notificación."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Desuscribir de %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Non estás suscrito a ese perfil"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Xa estas suscrito a estes usuarios:"
@@ -5227,12 +5446,12 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Outro usuario non se puido suscribir a ti."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Outro usuario non se puido suscribir a ti."
@@ -5241,12 +5460,12 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Non estás suscrito a ese perfil"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Non estás suscrito a ese perfil"
@@ -5255,7 +5474,7 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 #, fuzzy
 msgid ""
 "Commands:\n"
@@ -5270,6 +5489,7 @@ msgid ""
 "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"
@@ -5323,20 +5543,20 @@ msgstr ""
 "tracks - non implementado por agora.\n"
 "tracking - non implementado por agora.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Sen código de confirmación."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5533,25 +5753,25 @@ msgstr "Aconteceu un erro no sistema namentras se estaba cargando o ficheiro."
 msgid "Not an image or corrupt file."
 msgstr "Non é unha imaxe ou está corrupta."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato de ficheiro de imaxe non soportado."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Bloqueo de usuario fallido."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 #, fuzzy
 msgid "Unknown file type"
 msgstr "tipo de ficheiro non soportado"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5821,7 +6041,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " dende "
@@ -5914,6 +6134,12 @@ msgstr "A"
 msgid "Available characters"
 msgstr "6 ou máis caracteres"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Enviar"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5948,53 +6174,53 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "No"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "Sen contido!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Crear"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "Non se pode eliminar este chíos."
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "contestar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Chío publicado"
@@ -6031,11 +6257,6 @@ msgstr "Aconteceu un erro ó inserir o perfil remoto"
 msgid "Duplicate notice"
 msgstr "Eliminar chío"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Este usuario non che permite suscribirte a el."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Non se puido inserir a nova subscrición."
@@ -6052,6 +6273,10 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritos"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Usuario"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Band. Entrada"
@@ -6149,7 +6374,7 @@ msgstr "Non se pode eliminar este chíos."
 msgid "Repeat this notice"
 msgstr "Non se pode eliminar este chíos."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6172,6 +6397,10 @@ msgstr "Buscar"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Buscar"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6227,35 +6456,16 @@ msgstr "Suscrito a %s"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "O usuario bloqueoute."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "No se pode suscribir."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Outro usuario non se puido suscribir a ti."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Non está suscrito!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Non se pode eliminar a subscrición."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Non se pode eliminar a subscrición."
+#: lib/subgroupnav.php:106
+#, fuzzy, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr ""
+"Emprega este formulario para invitar ós teus amigos e colegas a empregar "
+"este servizo."
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6313,70 +6523,70 @@ msgstr "Avatar"
 msgid "User actions"
 msgstr "Outras opcions"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Configuración de perfil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 #, fuzzy
 msgid "Send a direct message to this user"
 msgstr "Non podes enviar mensaxes a este usurio."
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 #, fuzzy
 msgid "Message"
 msgstr "Nova mensaxe"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "fai uns segundos"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "fai un minuto"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fai %d minutos"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "fai unha hora"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "fai %d horas"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "fai un día"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "fai %d días"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "fai un mes"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "fai %d meses"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "fai un ano"
 
index fb8f120319b7e16ce8df55e84b558e1e7e9f6e1c..89fd4dd7adccb702cbdbde9a3d56f051b43bf3ca 100644 (file)
@@ -7,82 +7,88 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:50+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:54+0000\n"
 "Language-Team: Hebrew\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "קבל"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "הגדרות"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "הירשם"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "פרטיות"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 msgid "Invite only"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "אין משתמש כזה."
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "שמור"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "הגדרות"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "שמור"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "אין הודעה כזו."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -96,79 +102,88 @@ msgstr "אין הודעה כזו."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "אין משתמש כזה."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s וחברים"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s וחברים"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "הזנות החברים של %s"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "הזנות החברים של %s"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "הזנות החברים של %s"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s וחברים"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -181,20 +196,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "קוד האישור לא נמצא."
@@ -228,8 +243,9 @@ msgstr "עידכון המשתמש נכשל."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "למשתמש אין פרופיל."
 
@@ -254,7 +270,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -371,68 +387,68 @@ msgstr "עידכון המשתמש נכשל."
 msgid "Could not find target user."
 msgstr "עידכון המשתמש נכשל."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "כינוי זה כבר תפוס. נסה כינוי אחר."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "שם משתמש לא חוקי."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "לאתר הבית יש כתובת לא חוקית."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "השם המלא ארוך מידי (מותרות 255 אותיות בלבד)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיות)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "שם המיקום ארוך מידי (מותר עד 255 אותיות)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "כתובת אתר הבית '%s' אינה חוקית"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "כינוי זה כבר תפוס. נסה כינוי אחר."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -444,16 +460,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "לא נמצא"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "כבר נכנסת למערכת!"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "נכשלה ההפניה לשרת: %s"
@@ -463,7 +479,7 @@ msgstr "נכשלה ההפניה לשרת: %s"
 msgid "You are not a member of this group."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "נכשלה יצירת OpenID מתוך: %s"
@@ -495,7 +511,7 @@ msgstr "גודל לא חוקי."
 #: 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:309
+#: 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
@@ -504,7 +520,7 @@ msgstr "גודל לא חוקי."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -539,7 +555,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -562,14 +578,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "אודות"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -649,18 +665,18 @@ msgstr "פורמט התמונה אינו נתמך."
 msgid "%1$s / Favorites from %2$s"
 msgstr "הסטטוס של %1$s ב-%2$s "
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "מיקרובלוג מאת %s"
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -676,12 +692,12 @@ msgstr "הסטטוס של %1$s ב-%2$s "
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -691,17 +707,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "תגובת עבור %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "תגובת עבור %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "מיקרובלוג מאת %s"
@@ -719,8 +735,7 @@ msgstr "אין מסמך כזה."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "אין כינוי"
 
@@ -732,7 +747,7 @@ msgstr "אין גודל."
 msgid "Invalid size."
 msgstr "גודל לא חוקי."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "תמונה"
@@ -749,32 +764,32 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 #, fuzzy
 msgid "Avatar settings"
 msgstr "הגדרות"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete"
 msgstr "מחק"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "ההעלה"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -782,7 +797,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -817,23 +832,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "לא"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "אין משתמש כזה."
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "כן"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "אין משתמש כזה."
@@ -842,41 +857,45 @@ msgstr "אין משתמש כזה."
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "אין הודעה כזו."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "למשתמש אין פרופיל."
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s וחברים"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "אין משתמש כזה."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "אין משתמש כזה."
@@ -957,7 +976,7 @@ msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -983,12 +1002,13 @@ msgstr "אין הודעה כזו."
 msgid "Delete this application"
 msgstr "תאר את עצמך ואת נושאי העניין שלך ב-140 אותיות"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "לא מחובר."
@@ -1016,7 +1036,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "אין הודעה כזו."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr ""
 
@@ -1035,19 +1055,19 @@ msgstr "ניתן להשתמש במנוי המקומי!"
 msgid "Delete user"
 msgstr "מחק"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "אין משתמש כזה."
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1157,6 +1177,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "שמור"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1257,31 +1288,31 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיות)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "עידכון המשתמש נכשל."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "שמירת מידע התמונה נכשל"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 #, fuzzy
 msgid "Options saved."
 msgstr "ההגדרות נשמרו."
@@ -1626,7 +1657,7 @@ msgstr "למשתמש אין פרופיל."
 msgid "User is not a member of group."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "אין משתמש כזה."
@@ -1662,92 +1693,92 @@ msgstr "אין זיהוי."
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "קבוצות"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "עידכון המשתמש נכשל."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "העדפות נשמרו."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "למשתמש אין פרופיל."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "התמונה עודכנה."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "עדכון התמונה נכשל."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "מיקרובלוג מאת %s"
@@ -2001,16 +2032,19 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "שלח"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2045,7 +2079,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "אין כינוי"
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2054,12 +2093,12 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "הסטטוס של %1$s ב-%2$s "
@@ -2077,8 +2116,7 @@ msgstr "שם משתמש או סיסמה לא נכונים."
 msgid "Error setting user. You are probably not authorized."
 msgstr "לא מורשה."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "היכנס"
 
@@ -2327,8 +2365,8 @@ msgstr "התחבר"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2476,7 +2514,7 @@ msgstr "לא ניתן לשמור את הסיסמה"
 msgid "Password saved."
 msgstr "הסיסמה נשמרה."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2509,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2691,7 +2728,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1 עד 64 אותיות אנגליות קטנות או מספרים, ללא סימני פיסוק או רווחים."
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "שם מלא"
@@ -2720,7 +2757,7 @@ msgid "Bio"
 msgstr "ביוגרפיה"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2784,25 +2821,26 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "כתובת אתר הבית '%s' אינה חוקית"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "שמירת הפרופיל נכשלה."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "שמירת הפרופיל נכשלה."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "שמירת הפרופיל נכשלה."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "ההגדרות נשמרו."
 
@@ -2815,48 +2853,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "קו זמן ציבורי"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "קו זמן ציבורי"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "הזנת זרם הציבורי"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "הזנת זרם הציבורי"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "הזנת זרם הציבורי"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2865,7 +2903,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3036,8 +3074,7 @@ msgstr "שגיאה באישור הקוד."
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "הירשם"
 
@@ -3164,7 +3201,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "כתובת הפרופיל שלך בשרות ביקרובלוג תואם אחר"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "הירשם כמנוי"
 
@@ -3205,7 +3242,7 @@ msgstr "לא ניתן להירשם ללא הסכמה לרשיון"
 msgid "You already repeated that notice."
 msgstr "כבר נכנסת למערכת!"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "צור"
@@ -3215,47 +3252,47 @@ msgstr "צור"
 msgid "Repeated!"
 msgstr "צור"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "תגובת עבור %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "תגובת עבור %s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3283,7 +3320,6 @@ msgid "User is already sandboxed."
 msgstr "למשתמש אין פרופיל."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3308,7 +3344,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "הגדרות"
@@ -3343,7 +3379,7 @@ msgstr "מיקום"
 msgid "Description"
 msgstr "הרשמות"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "סטטיסטיקה"
@@ -3404,35 +3440,35 @@ msgstr "%s וחברים"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "הזנות החברים של %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "הזנות החברים של %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "הזנות החברים של %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3440,7 +3476,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3454,71 +3490,71 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "כל המנויים"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "אין הודעה כזו."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 #, fuzzy
 msgid "Note"
 msgstr "הודעות"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "הזנת הודעות של %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "חבר מאז"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "צור"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3528,7 +3564,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3537,7 +3573,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3891,17 +3927,27 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "יצירת המנוי נכשלה."
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "×\90×\99×\9f ×\9eשת×\9eש ×\9b×\96×\94."
+msgid "No such profile."
+msgstr "×\90×\99×\9f ×\94×\95×\93×¢×\94 ×\9b×\96×\95."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "לא שלחנו אלינו את הפרופיל הזה"
+
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "הירשם כמנוי"
@@ -3962,7 +4008,7 @@ msgstr "אלה האנשים שלהודעות שלהם אתה מאזין."
 msgid "These are the people whose notices %s listens to."
 msgstr "אלה האנשים ש%s מאזין להודעות שלהם."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3972,36 +4018,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s כעת מאזין להודעות שלך ב-%2$s"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "אין זיהוי Jabber כזה."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "סמס"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "מיקרובלוג מאת %s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "הזנת הודעות של %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "הזנת הודעות של %s"
@@ -4055,7 +4101,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "אין הודעה כזו."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -4090,74 +4136,76 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "מתשמש"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "פרופיל"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "מחק"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "כל המנויים"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "ההרשמה אושרה"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "מיקום"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4342,7 +4390,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "אישי"
@@ -4383,6 +4431,11 @@ msgstr "עידכון המשתמש נכשל."
 msgid "Group leave failed."
 msgstr "אין הודעה כזו."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "עידכון המשתמש נכשל."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4400,70 +4453,102 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "שגיאת מסד נתונים בהכנסת התגובה: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "User has blocked you."
+msgstr "למשתמש אין פרופיל."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "לא מנוי!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "מחיקת המנוי לא הצליחה."
+
+#: classes/Subscription.php:179 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:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "שמירת מידע התמונה נכשל"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "יצירת המנוי נכשלה."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "יצירת המנוי נכשלה."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "יצירת המנוי נכשלה."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4507,127 +4592,188 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "בית"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "אישי"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "התחבר"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "שנה סיסמה"
 
-#: lib/action.php:444
+#: lib/action.php:447
 #, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "אודות"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "נכשלה ההפניה לשרת: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "התחבר"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "הרשמות"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
 msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "צא"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "גודל לא חוקי."
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
 #, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "צא"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "צור חשבון חדש"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "הירשם"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "עזרה"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "היכנס"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "עזרה"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "חיפוש"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "עזרה"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "חיפוש"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "הרשמות"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "עזרה"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "אודות"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "רשימת שאלות נפוצות"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "פרטיות"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "מקור"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "צור קשר"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4636,12 +4782,12 @@ msgstr ""
 "**%%site.name%%** הוא שרות ביקרובלוג הניתן על ידי [%%site.broughtby%%](%%"
 "site.broughtbyurl%%)."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** הוא שרות ביקרובלוג."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4652,101 +4798,165 @@ msgstr ""
 "s, המופצת תחת רשיון [GNU Affero General Public License](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)"
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "הודעה חדשה"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "<< אחרי"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "לפני >>"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "הרשמות"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "הודעה חדשה"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "אישי"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "הרשמות"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "מתשמש"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "הרשמות"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "הרשמות"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "הרשמות"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "אישי"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4842,12 +5052,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "הסיסמה נשמרה."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "הסיסמה נשמרה."
@@ -5003,83 +5213,93 @@ msgstr "בעיה בשמירת ההודעה."
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "אין משתמש כזה."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "בטל מנוי"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "לא שלחנו אלינו את הפרופיל הזה"
 msgstr[1] "לא שלחנו אלינו את הפרופיל הזה"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "הרשמה מרוחקת"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "הרשמה מרוחקת"
 msgstr[1] "הרשמה מרוחקת"
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "לא שלחנו אלינו את הפרופיל הזה"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "לא שלחנו אלינו את הפרופיל הזה"
 msgstr[1] "לא שלחנו אלינו את הפרופיל הזה"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5093,6 +5313,7 @@ msgid ""
 "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"
@@ -5120,20 +5341,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "אין קוד אישור."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5328,24 +5549,24 @@ msgstr "שגיאת מערכת בהעלאת הקובץ."
 msgid "Not an image or corrupt file."
 msgstr "זהו לא קובץ תמונה, או שחל בו שיבוש."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "פורמט התמונה אינו נתמך."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "אין הודעה כזו."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5558,7 +5779,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr ""
 
@@ -5649,6 +5870,12 @@ msgstr "אל"
 msgid "Available characters"
 msgstr "לפחות 6 אותיות"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "שלח"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5683,52 +5910,52 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "לא"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "אין תוכן!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "צור"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "הגב"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "הודעות"
@@ -5762,10 +5989,6 @@ msgstr "שגיאה בהכנסת פרופיל מרוחק"
 msgid "Duplicate notice"
 msgstr "הודעה חדשה"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "הכנסת מנוי חדש נכשלה."
@@ -5782,6 +6005,10 @@ msgstr "תגובות"
 msgid "Favorites"
 msgstr "מועדפים"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "מתשמש"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5877,7 +6104,7 @@ msgstr "אין הודעה כזו."
 msgid "Repeat this notice"
 msgstr "אין הודעה כזו."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5899,6 +6126,10 @@ msgstr "חיפוש"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "חיפוש"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -5953,37 +6184,15 @@ msgstr "הרשמה מרוחקת"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-#, fuzzy
-msgid "User has blocked you."
-msgstr "למשתמש אין פרופיל."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "לא מנוי!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "מחיקת המנוי לא הצליחה."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "מחיקת המנוי לא הצליחה."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6038,69 +6247,69 @@ msgstr "תמונה"
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "הגדרות הפרופיל"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 #, fuzzy
 msgid "Message"
 msgstr "הודעה חדשה"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "לפני מספר שניות"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "לפני כדקה"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "לפני כ-%d דקות"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "לפני כשעה"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "לפני כ-%d שעות"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "לפני כיום"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "לפני כ-%d ימים"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "לפני כחודש"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "לפני כ-%d חודשים"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "לפני כשנה"
 
index daecf17e80bffcf20e378da3ba264295896eacb2..f46e7357ad184577bac5f806137118722361c7aa 100644 (file)
@@ -9,79 +9,86 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:54+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:02:57+0000\n"
 "Language-Team: Dutch\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : (n%100==3 || "
 "n%100==4) ? 2 : 3)\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Přistup"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Sydłowe nastajenja składować"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Registrować"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Priwatny"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "Jenož přeprosyć"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Priwatny"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Začinjeny"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Jenož přeprosyć"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Nowe registrowanja znjemóžnić."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Składować"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Začinjeny"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Sydłowe nastajenja składować"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Składować"
+
+#. 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 "Strona njeeksistuje"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -95,78 +102,87 @@ msgstr "Strona njeeksistuje"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Wužiwar njeeksistuje"
 
-#: actions/all.php:84
+#. 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 a přećeljo, strona %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s a přećeljo"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Kanal za přećelow wužiwarja %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Kanal za přećelow wužiwarja %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Kanal za přećelow wužiwarja %s (Atom)"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Ty a přećeljo"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -179,20 +195,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metoda njenamakana."
 
@@ -224,8 +240,9 @@ msgstr "Wužiwar njeje so dał aktualizować."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Wužiwar nima profil."
 
@@ -249,7 +266,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -359,68 +376,68 @@ msgstr ""
 msgid "Could not find target user."
 msgstr ""
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "Přimjeno so hižo wužiwa. Spytaj druhe."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Žane płaćiwe přimjeno."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Startowa strona njeje płaćiwy URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Dospołne mjeno je předołho (maks. 255 znamješkow)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Wopisanje je předołho (maks. %d znamješkow)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Městno je předołho (maks. 255 znamješkow)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Přewjele aliasow! Maksimum: %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Njepłaćiwy alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias \"%s\" so hižo wužiwa. Spytaj druhi."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias njemóže samsny kaž přimjeno być."
@@ -431,15 +448,15 @@ msgstr "Alias njemóže samsny kaž přimjeno być."
 msgid "Group not found!"
 msgstr "Skupina njenamakana!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Sy hižo čłon teje skupiny."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Njebě móžno wužiwarja %1$s skupinje %2%s přidać."
@@ -448,7 +465,7 @@ msgstr "Njebě móžno wužiwarja %1$s skupinje %2%s přidać."
 msgid "You are not a member of this group."
 msgstr "Njejsy čłon tuteje skupiny."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Njebě móžno wužiwarja %1$s ze skupiny %2$s wotstronić."
@@ -480,7 +497,7 @@ msgstr "Njepłaćiwa wulkosć."
 #: 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:309
+#: 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
@@ -489,7 +506,7 @@ msgstr "Njepłaćiwa wulkosć."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -523,7 +540,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -546,13 +563,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -628,18 +645,18 @@ msgstr "Njepodpěrany format."
 msgid "%1$s / Favorites from %2$s"
 msgstr ""
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -655,12 +672,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -670,17 +687,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -696,8 +713,7 @@ msgstr "Přiwěšk njeeksistuje."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Žane přimjeno."
 
@@ -709,7 +725,7 @@ msgstr "Žana wulkosć."
 msgid "Invalid size."
 msgstr "Njepłaćiwa wulkosć."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Awatar"
@@ -727,30 +743,30 @@ msgid "User without matching profile"
 msgstr "Wužiwar bjez hodźaceho so profila"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Nastajenja awatara"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Přehlad"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Zničić"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Nahrać"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -758,7 +774,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -790,22 +806,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Ně"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Tutoho wužiwarja njeblokować"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Haj"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Tutoho wužiwarja blokować"
 
@@ -813,39 +829,43 @@ msgstr "Tutoho wužiwarja blokować"
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Skupina njeeksistuje."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s zablokowa profile, stronu %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr ""
 
@@ -922,7 +942,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -948,12 +968,13 @@ msgstr "Tutu zdźělenku njewušmórnyć"
 msgid "Delete this application"
 msgstr "Tutu zdźělenku wušmórnyć"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Njepřizjewjeny."
@@ -980,7 +1001,7 @@ msgstr "Chceš woprawdźe tutu zdźělenku wušmórnyć?"
 msgid "Do not delete this notice"
 msgstr "Tutu zdźělenku njewušmórnyć"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Tutu zdźělenku wušmórnyć"
 
@@ -996,18 +1017,18 @@ msgstr "Móžeš jenož lokalnych wužiwarjow wušmórnyć."
 msgid "Delete user"
 msgstr "Wužiwarja wušmórnyć"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Tutoho wužiwarja wušmórnyć"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Design"
 
@@ -1109,6 +1130,17 @@ msgstr "Standardne designy wobnowić"
 msgid "Reset back to default"
 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/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 "Składować"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Design składować"
@@ -1202,29 +1234,29 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr "Dyrbiš přizjewjeny być, zo by skupinu wutworił."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Dyrbiš administrator być, zo by skupinu wobdźěłał."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Wuž tutón formular, zo by skupinu wobdźěłał."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "wopisanje je předołho (maks. %d znamješkow)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Skupina njeje so dała aktualizować."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Aliasy njejsu so dali wutworić."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Opcije składowane."
 
@@ -1553,7 +1585,7 @@ msgstr "Wužiwar je hižo za skupinu zablokowany."
 msgid "User is not a member of group."
 msgstr "Wužiwar njeje čłon skupiny."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Wužiwarja za skupinu blokować"
 
@@ -1585,30 +1617,30 @@ msgstr "Žadyn ID."
 msgid "You must be logged in to edit a group."
 msgstr "Dyrbiš přizjewjeny być, zo by skupinu wobdźěłał."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Skupinski design"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr ""
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Designowe nastajenja składowane."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Skupinske logo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1616,57 +1648,57 @@ msgstr ""
 "Móžeš logowy wobraz za swoju skupinu nahrać. Maksimalna datajowa wulkosć je %"
 "s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Wužiwar bjez hodźaceho so profila."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo zaktualizowane."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr ""
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s skupinskich čłonow, strona %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Lisćina wužiwarjow w tutej skupinje."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blokować"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Tutoho wužiwarja k administratorej činić"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
@@ -1904,16 +1936,19 @@ msgstr "Wosobinska powěsć"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Wosobinsku powěsć po dobrozdaću přeprošenju přidać."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Pósłać"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1948,7 +1983,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Žane přimjeno."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -1957,11 +1997,11 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr "Dyrbiš přizjewjeny być, zo by skupinu wopušćił."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Njejsy čłon teje skupiny."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr ""
@@ -1978,8 +2018,7 @@ msgstr "Wopačne wužiwarske mjeno abo hesło."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Zmylk při nastajenju wužiwarja. Snano njejsy awtorizowany."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Přizjewić"
 
@@ -2219,8 +2258,8 @@ msgstr ""
 msgid "Only "
 msgstr "Jenož "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Njeje podpěrany datowy format."
 
@@ -2359,7 +2398,7 @@ msgstr ""
 msgid "Password saved."
 msgstr "Hesło składowane."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Šćežki"
 
@@ -2392,7 +2431,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Sydło"
 
@@ -2560,7 +2598,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr ""
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Dospołne mjeno"
@@ -2588,7 +2626,7 @@ msgid "Bio"
 msgstr "Biografija"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2652,23 +2690,24 @@ msgstr "Mjeno rěče je předołhe (maks. 50 znamješkow)."
 msgid "Invalid tag: \"%s\""
 msgstr ""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Nastajenja městna njedachu so składować."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr ""
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr ""
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Nastajenja składowane."
 
@@ -2681,45 +2720,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr ""
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr ""
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2728,7 +2767,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2898,8 +2937,7 @@ msgstr "Wodaj, njepłaćiwy přeprošenski kod."
 msgid "Registration successful"
 msgstr "Registrowanje wuspěšne"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrować"
 
@@ -3022,7 +3060,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Abonować"
 
@@ -3058,7 +3096,7 @@ msgstr "Njemóžeš swójsku zdźělenku wospjetować."
 msgid "You already repeated that notice."
 msgstr "Sy tutu zdźělenku hižo wospjetował."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Wospjetowany"
 
@@ -3066,47 +3104,47 @@ msgstr "Wospjetowany"
 msgid "Repeated!"
 msgstr "Wospjetowany!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr ""
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr ""
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr ""
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr ""
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr ""
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3131,7 +3169,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Posedźenja"
 
@@ -3157,7 +3194,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Sydłowe nastajenja składować"
 
@@ -3187,7 +3224,7 @@ msgstr "Organizacija"
 msgid "Description"
 msgstr "Wopisanje"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistika"
@@ -3249,35 +3286,35 @@ msgstr "%1$s a přećeljo, strona %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr ""
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3285,7 +3322,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3299,67 +3336,67 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "%1$s skupinskich čłonow, strona %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Skupinski profil"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Aliasy"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Skupinske akcije"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Čłonojo"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Žadyn)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Wšitcy čłonojo"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Wutworjeny"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3369,7 +3406,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3378,7 +3415,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administratorojo"
 
@@ -3724,15 +3761,26 @@ msgstr "Žadyn kod zapodaty"
 msgid "You are not subscribed to that profile."
 msgstr "Njejsy tón profil abonował."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr ""
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Njeje lokalny wužiwar."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Dataja njeeksistuje."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Njejsy tón profil abonował."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonowany"
 
@@ -3792,7 +3840,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3802,35 +3850,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr ""
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -3880,7 +3928,7 @@ msgstr ""
 msgid "No such tag."
 msgstr ""
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -3910,70 +3958,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Wužiwar"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Wužiwarske nastajenja za sydło StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nowi wužiwarjo"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Powitanje noweho wužiwarja"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Powitanski tekst za nowych wužiwarjow (maks. 255 znamješkow)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Standardny abonement"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Přeprošenja"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Přeprošenja zmóžnjene"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4146,7 +4196,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Wersija"
 
@@ -4183,6 +4233,11 @@ msgstr "Njeje dźěl skupiny."
 msgid "Group leave failed."
 msgstr "Wopušćenje skupiny je so njeporadźiło."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Skupina njeje so dała aktualizować."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4200,65 +4255,94 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1442
 #, php-format
-msgid "DB error inserting reply: %s"
+msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/Notice.php:1235
-#, php-format
-msgid "RT @%1$s %2$s"
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
 msgstr ""
 
-#: classes/User.php:385
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Hižo abonowany!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Wužiwar je će zablokował."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Njeje abonowany!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Sebjeabonement njeje so dał zničić."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Abonoment njeje so dał zničić."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Skupina njeje so dała aktualizować."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr ""
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Profil njeje so składować dał."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4300,132 +4384,203 @@ msgstr "Strona bjez titula"
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr ""
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Wosobinski"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "Zwjazać"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "Změń swoje hesło."
 
-#: lib/action.php:444
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr ""
+msgstr "Zwiski"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Zwjazać"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr ""
+msgstr "SMS-wobkrućenje"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Přeprosyć"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrator"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 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:458
-msgid "Logout"
-msgstr ""
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Přeprosyć"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
-msgstr ""
+msgstr "Šat za sydło."
+
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Logo"
 
-#: lib/action.php:463
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Konto załožić"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrować"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
-msgstr ""
+msgstr "Při sydle přizjewić"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Pomoc"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Přizjewić"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomhaj!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Pytać"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Pomoc"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Za ludźimi abo tekstom pytać"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Pytać"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Pomoc"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Wo"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Huste prašenja"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Priwatnosć"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Žórło"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4433,96 +4588,161 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr ""
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Změny na tutym woknje njejsu dowolene."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Sydło"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Design"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS-wobkrućenje"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Wužiwar"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS-wobkrućenje"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS-wobkrućenje"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Posedźenja"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4612,11 +4832,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Změnjenje hesła je so njeporadźiło"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Změnjenje hesła njeje dowolene"
 
@@ -4764,54 +4984,64 @@ msgstr ""
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Wužiwar njeeksistuje"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Wotskazany"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr ""
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Sy tutu wosobu abonował:"
@@ -4819,11 +5049,11 @@ msgstr[1] "Sy tutej wosobje abonował:"
 msgstr[2] "Sy tute wosoby abonował:"
 msgstr[3] "Sy tute wosoby abonował:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr ""
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Tuta wosoba je će abonowała:"
@@ -4831,11 +5061,11 @@ msgstr[1] "Tutej wosobje stej će abonowałoj:"
 msgstr[2] "Tute wosoby su će abonowali:"
 msgstr[3] "Tute wosoby su će abonowali:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr ""
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Sy čłon tuteje skupiny:"
@@ -4843,7 +5073,7 @@ msgstr[1] "Sy čłon tuteju skupinow:"
 msgstr[2] "Sy čłon tutych skupinow:"
 msgstr[3] "Sy čłon tutych skupinow:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4857,6 +5087,7 @@ msgid ""
 "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"
@@ -4884,19 +5115,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Žana konfiguraciska dataja namakana. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5082,23 +5313,23 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Naša dataja je so zhubiła."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Njeznaty datajowy typ"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "KB"
 
@@ -5302,7 +5533,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "wot"
 
@@ -5391,6 +5622,12 @@ msgstr "Komu"
 msgid "Available characters"
 msgstr "K dispoziciji stejace znamješka"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Pósłać"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Zdźělenku pósłać"
@@ -5422,48 +5659,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "S"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "J"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "W"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "Z"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Wospjetowany wot"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Na tutu zdźělenku wotmołwić"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Wotmołwić"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Zdźělenka wospjetowana"
 
@@ -5495,10 +5732,6 @@ msgstr "Zmylk při zasunjenju zdaleneho profila"
 msgid "Duplicate notice"
 msgstr "Dwójna zdźělenka"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr ""
@@ -5515,6 +5748,10 @@ msgstr "Wotmołwy"
 msgid "Favorites"
 msgstr "Fawority"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Wužiwar"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5604,7 +5841,7 @@ msgstr "Tutu zdźělenku wospjetować?"
 msgid "Repeat this notice"
 msgstr "Tutu zdźělenku wospjetować"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5624,6 +5861,10 @@ msgstr "Pytanske sydło"
 msgid "Keyword(s)"
 msgstr "Klučowe hesła"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Pytać"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Pytanska pomoc"
@@ -5675,34 +5916,15 @@ msgstr ""
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Hižo abonowany!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Wužiwar je će zablokował."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Abonowanje njebě móžno"
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Přeprosyć"
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Njeje abonowany!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Sebjeabonement njeje so dał zničić."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Abonoment njeje so dał zničić."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5753,67 +5975,67 @@ msgstr "Awatar wobdźěłać"
 msgid "User actions"
 msgstr "Wužiwarske akcije"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Profilowe nastajenja wobdźěłać"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Wobdźěłać"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Tutomu wužiwarja direktnu powěsć pósłać"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Powěsć"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "před něšto sekundami"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "před něhdźe jednej mjeńšinu"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "před %d mjeńšinami"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "před něhdźe jednej hodźinu"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "před něhdźe %d hodźinami"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "před něhdźe jednym dnjom"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "před něhdźe %d dnjemi"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "před něhdźe jednym měsacom"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "před něhdźe %d měsacami"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "před něhdźe jednym lětom"
 
index 698f779dd0be3876f3dfa072e5fb638ee002134e..cc6af7f0f783c84e92c61bfaadb3a84488d56123 100644 (file)
@@ -8,75 +8,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:14:57+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:00+0000\n"
 "Language-Team: Interlingua\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Accesso"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Configurationes de accesso al sito"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registration"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Private"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Prohibir al usatores anonyme (sin session aperte) de vider le sito?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Solmente per invitation"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Private"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Permitter le registration solmente al invitatos."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Claudite"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Solmente per invitation"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Disactivar le creation de nove contos."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Salveguardar"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Claudite"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Salveguardar configurationes de accesso"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Salveguardar"
+
+#. 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 "Pagina non existe"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -90,46 +97,53 @@ msgstr "Pagina non existe"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Usator non existe."
 
-#: actions/all.php:84
+#. 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 e amicos, pagina %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s e amicos"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Syndication pro le amicos de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Syndication pro le amicos de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Syndication pro le amicos de %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -137,7 +151,7 @@ msgstr ""
 "Isto es le chronologia pro %s e su amicos, ma necuno ha ancora publicate "
 "alique."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -146,7 +160,8 @@ msgstr ""
 "Proba subscriber te a altere personas, [face te membro de un gruppo](%%"
 "action.groups%%) o publica alique tu mesme."
 
-#: actions/all.php:134
+#. 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 "
@@ -155,7 +170,7 @@ msgstr ""
 "Tu pote tentar [dar un pulsata a %1$s](../%2$s) in su profilo o [publicar un "
 "message a su attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -164,12 +179,13 @@ msgstr ""
 "Proque non [registrar un conto](%%%%action.register%%%%) e postea dar un "
 "pulsata a %s o publicar un message a su attention."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Tu e amicos"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Actualisationes de %1$s e su amicos in %2$s!"
@@ -182,20 +198,20 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Methodo API non trovate."
 
@@ -229,8 +245,9 @@ msgstr "Non poteva actualisar le usator."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Le usator non ha un profilo."
 
@@ -256,7 +273,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -366,68 +383,68 @@ msgstr "Non poteva determinar le usator de origine."
 msgid "Could not find target user."
 msgstr "Non poteva trovar le usator de destination."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Le pseudonymo pote solmente haber minusculas e numeros, sin spatios."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Pseudonymo ja in uso. Proba un altere."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Non un pseudonymo valide."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Le pagina personal non es un URL valide."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Le nomine complete es troppo longe (max. 255 characteres)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Description es troppo longe (max %d charachteres)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Loco es troppo longe (max. 255 characteres)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Troppo de aliases! Maximo: %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Alias invalide: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Le alias \"%s\" es ja in uso. Proba un altere."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Le alias non pote esser identic al pseudonymo."
@@ -438,15 +455,15 @@ msgstr "Le alias non pote esser identic al pseudonymo."
 msgid "Group not found!"
 msgstr "Gruppo non trovate!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Tu es ja membro de iste gruppo."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Le administrator te ha blocate de iste gruppo."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Non poteva inscriber le usator %1$s in le gruppo %2$s."
@@ -455,7 +472,7 @@ msgstr "Non poteva inscriber le usator %1$s in le gruppo %2$s."
 msgid "You are not a member of this group."
 msgstr "Tu non es membro de iste gruppo."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Non poteva remover le usator %1$s del gruppo %2$s."
@@ -486,7 +503,7 @@ msgstr "Indicio invalide."
 #: 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:309
+#: 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
@@ -495,7 +512,7 @@ msgstr "Indicio invalide."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -532,7 +549,7 @@ msgstr "Le indicio de requesta %s ha essite refusate e revocate."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -558,13 +575,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Conto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -643,18 +660,18 @@ msgstr "Formato non supportate."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favorites de %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Chronologia de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -671,12 +688,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Chronologia public de %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Actualisationes de totes in %s!"
@@ -686,17 +703,17 @@ msgstr "Actualisationes de totes in %s!"
 msgid "Repeated to %s"
 msgstr "Repetite a %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Repetitiones de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notas con etiquetta %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualisationes con etiquetta %1$s in %2$s!"
@@ -712,8 +729,7 @@ msgstr "Annexo non existe."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Nulle pseudonymo."
 
@@ -725,7 +741,7 @@ msgstr "Nulle dimension."
 msgid "Invalid size."
 msgstr "Dimension invalide."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -743,30 +759,30 @@ msgid "User without matching profile"
 msgstr "Usator sin profilo correspondente"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Configuration del avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Previsualisation"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Deler"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Incargar"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Taliar"
 
@@ -774,7 +790,7 @@ msgstr "Taliar"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Selige un area quadrate del imagine pro facer lo tu avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Datos del file perdite."
 
@@ -809,22 +825,22 @@ msgstr ""
 "recipera notification de su @-responsas."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Non blocar iste usator"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Si"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Blocar iste usator"
 
@@ -832,39 +848,43 @@ msgstr "Blocar iste usator"
 msgid "Failed to save block information."
 msgstr "Falleva de salveguardar le information del blocada."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Gruppo non existe."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s profilos blocate"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s profilos blocate, pagina %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Un lista del usatores excludite del membrato de iste gruppo."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Disblocar le usator del gruppo"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Disblocar"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Disblocar iste usator"
 
@@ -939,7 +959,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Il habeva un problema con tu indicio de session."
 
@@ -965,12 +985,13 @@ msgstr "Non deler iste application"
 msgid "Delete this application"
 msgstr "Deler iste application"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Non identificate."
@@ -999,7 +1020,7 @@ msgstr "Es tu secur de voler deler iste nota?"
 msgid "Do not delete this notice"
 msgstr "Non deler iste nota"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Deler iste nota"
 
@@ -1015,7 +1036,7 @@ msgstr "Tu pote solmente deler usatores local."
 msgid "Delete user"
 msgstr "Deler usator"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1023,12 +1044,12 @@ msgstr ""
 "Es tu secur de voler deler iste usator? Isto radera tote le datos super le "
 "usator del base de datos, sin copia de reserva."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Deler iste usator"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Apparentia"
 
@@ -1131,6 +1152,17 @@ msgstr "Restaurar apparentias predefinite"
 msgid "Reset back to default"
 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/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 "Salveguardar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Salveguardar apparentia"
@@ -1222,29 +1254,29 @@ msgstr "Modificar gruppo %s"
 msgid "You must be logged in to create a group."
 msgstr "Tu debe aperir un session pro crear un gruppo."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Tu debe esser administrator pro modificar le gruppo."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Usa iste formulario pro modificar le gruppo."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "description es troppo longe (max %d chars)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Non poteva actualisar gruppo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Non poteva crear aliases."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Optiones salveguardate."
 
@@ -1584,7 +1616,7 @@ msgstr "Le usator es ja blocate del gruppo."
 msgid "User is not a member of group."
 msgstr "Le usator non es membro del gruppo."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Blocar usator del gruppo"
 
@@ -1619,11 +1651,11 @@ msgstr "Nulle ID."
 msgid "You must be logged in to edit a group."
 msgstr "Tu debe aperir un session pro modificar un gruppo."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Apparentia del gruppo"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1631,20 +1663,20 @@ msgstr ""
 "Personalisa le apparentia de tu gruppo con un imagine de fundo e un paletta "
 "de colores de tu preferentia."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Non poteva actualisar tu apparentia."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Preferentias de apparentia salveguardate."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logotypo del gruppo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1652,57 +1684,57 @@ msgstr ""
 "Tu pote incargar un imagine pro le logotypo de tu gruppo. Le dimension "
 "maximal del file es %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Usator sin profilo correspondente"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Selige un area quadrate del imagine que devenira le logotypo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logotypo actualisate."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Falleva de actualisar le logotypo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Membros del gruppo %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Membros del gruppo %1$s, pagina %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Un lista de usatores in iste gruppo."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blocar"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Facer le usator administrator del gruppo"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Facer administrator"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Facer iste usator administrator"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1967,16 +1999,19 @@ msgstr "Message personal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Si tu vole, adde un message personal al invitation."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Inviar"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s te ha invitate a accompaniar le/la in %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2037,7 +2072,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Tu debe aperir un session pro facer te membro de un gruppo."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Nulle pseudonymo."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s es ora membro del gruppo %2$s"
@@ -2046,11 +2086,11 @@ msgstr "%1$s es ora membro del gruppo %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Tu debe aperir un session pro quitar un gruppo."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Tu non es membro de iste gruppo."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s quitava le gruppo %2$s"
@@ -2068,8 +2108,7 @@ msgid "Error setting user. You are probably not authorized."
 msgstr ""
 "Error de acceder al conto de usator. Tu probabilemente non es autorisate."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Aperir session"
 
@@ -2327,8 +2366,8 @@ msgstr "typo de contento "
 msgid "Only "
 msgstr "Solmente "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Formato de datos non supportate."
 
@@ -2468,7 +2507,7 @@ msgstr "Non pote salveguardar le nove contrasigno."
 msgid "Password saved."
 msgstr "Contrasigno salveguardate."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Camminos"
 
@@ -2501,7 +2540,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Servitor SSL invalide. Le longitude maximal es 255 characteres."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Sito"
 
@@ -2675,7 +2713,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 minusculas o numeros, sin punctuation o spatios"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nomine complete"
@@ -2703,7 +2741,7 @@ msgid "Bio"
 msgstr "Bio"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2770,23 +2808,24 @@ msgstr "Lingua es troppo longe (max 50 chars)."
 msgid "Invalid tag: \"%s\""
 msgstr "Etiquetta invalide: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Non poteva actualisar usator pro autosubscription."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Non poteva salveguardar le preferentias de loco."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Non poteva salveguardar profilo."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Non poteva salveguardar etiquettas."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Preferentias confirmate."
 
@@ -2799,28 +2838,28 @@ msgstr "Ultra le limite de pagina (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Non poteva recuperar le fluxo public."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Chronologia public, pagina %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Chronologia public"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Syndication del fluxo public (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Syndication del fluxo public (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Syndication del fluxo public (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2829,11 +2868,11 @@ msgstr ""
 "Isto es le chronologia public pro %%site.name%%, ma nulle persona ha ancora "
 "scribite alique."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Sia le prime a publicar!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2841,7 +2880,7 @@ msgstr ""
 "Proque non [registrar un conto](%%action.register%%) e devenir le prime a "
 "publicar?"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2854,7 +2893,7 @@ msgstr ""
 "[Inscribe te ora](%%action.register%%) pro condivider notas super te con "
 "amicos, familia e collegas! ([Leger plus](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3032,8 +3071,7 @@ msgstr "Pardono, le codice de invitation es invalide."
 msgid "Registration successful"
 msgstr "Registration succedite"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Crear conto"
 
@@ -3181,7 +3219,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subscriber"
 
@@ -3219,7 +3257,7 @@ msgstr "Tu non pote repeter tu proprie nota."
 msgid "You already repeated that notice."
 msgstr "Tu ha ja repetite iste nota."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repetite"
 
@@ -3227,33 +3265,33 @@ msgstr "Repetite"
 msgid "Repeated!"
 msgstr "Repetite!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Responsas a %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Responsas a %1$s, pagina %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Syndication de responsas pro %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Syndication de responsas pro %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Syndication de responsas pro %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3262,7 +3300,7 @@ msgstr ""
 "Isto es le chronologia de responsas a %1$s, ma %2$s non ha ancora recipite "
 "alcun nota a su attention."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3271,7 +3309,7 @@ msgstr ""
 "Tu pote facer conversation con altere usatores, subscriber te a plus "
 "personas o [devenir membro de gruppos](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3298,7 +3336,6 @@ msgid "User is already sandboxed."
 msgstr "Usator es ja in cassa de sablo."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessiones"
 
@@ -3323,7 +3360,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salveguardar configurationes del sito"
 
@@ -3353,7 +3390,7 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Description"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statisticas"
@@ -3416,22 +3453,22 @@ msgstr "Notas favorite de %1$s, pagina %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Non poteva recuperar notas favorite."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Syndication del favorites de %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Syndication del favorites de %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Syndication del favorites de %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3440,7 +3477,7 @@ msgstr ""
 "Favorite sub notas que te place pro memorisar los pro plus tarde o pro "
 "mitter los in evidentia."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3449,7 +3486,7 @@ msgstr ""
 "%s non ha ancora addite alcun nota a su favorites. Publica alique "
 "interessante que ille favoritisarea :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3460,7 +3497,7 @@ msgstr ""
 "conto](%%%%action.register%%%%) e postea publicar alique interessante que "
 "ille favoritisarea :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Isto es un modo de condivider lo que te place."
 
@@ -3474,67 +3511,67 @@ msgstr "Gruppo %s"
 msgid "%1$s group, page %2$d"
 msgstr "Gruppo %1$s, pagina %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Profilo del gruppo"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Nota"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Aliases"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Actiones del gruppo"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, 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:334
+#: actions/showgroup.php:342
 #, 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:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Syndication de notas pro le gruppo %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Amico de un amico pro le gruppo %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nulle)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Tote le membros"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Create"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3549,7 +3586,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:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3562,7 +3599,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Su membros condivide breve messages super "
 "lor vita e interesses. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administratores"
 
@@ -3930,15 +3967,26 @@ msgstr "Nulle codice entrate"
 msgid "You are not subscribed to that profile."
 msgstr "Tu non es subscribite a iste profilo."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Non poteva salveguardar le subscription."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Le usator non es local."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "File non existe."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Tu non es subscribite a iste profilo."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subscribite"
 
@@ -4002,7 +4050,7 @@ msgstr "Tu seque le notas de iste personas."
 msgid "These are the people whose notices %s listens to."
 msgstr "%s seque le notas de iste personas."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4018,35 +4066,35 @@ msgstr ""
 "action.twittersettings%%), tu pote automaticamente subscriber te a personas "
 "que tu ja seque la."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s non seque alcuno."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Notas etiquettate con %1$s, pagina %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Syndication de notas pro le etiquetta %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Syndication de notas pro le etiquetta %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Syndication de notas pro le etiquetta %s (Atom)"
@@ -4101,7 +4149,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Etiquetta non existe."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Methodo API in construction."
 
@@ -4133,70 +4181,72 @@ msgstr ""
 "Le licentia del fluxo que tu ascolta, ‘%1$s’, non es compatibile con le "
 "licentia del sito ‘%2$s’."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Usator"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Configurationes de usator pro iste sito de StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Limite de biographia invalide. Debe esser un numero."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Texto de benvenita invalide. Longitude maximal es 255 characteres."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Subscription predefinite invalide: '%1$s' non es usator."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profilo"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Limite de biographia"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Le longitude maximal del biographia de un profilo in characteres."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nove usatores"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Message de benvenita a nove usatores"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Texto de benvenita pro nove usatores (max. 255 characteres)"
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Subscription predefinite"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Subscriber automaticamente le nove usatores a iste usator."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Invitationes"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Invitationes activate"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Si le usatores pote invitar nove usatores."
 
@@ -4392,7 +4442,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plug-ins"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Version"
 
@@ -4431,6 +4481,11 @@ msgstr "Non es membro del gruppo."
 msgid "Group leave failed."
 msgstr "Le cancellation del membrato del gruppo ha fallite."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Non poteva actualisar gruppo."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4448,27 +4503,27 @@ msgstr "Non poteva inserer message."
 msgid "Could not update message with new URI."
 msgstr "Non poteva actualisar message con nove URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Error in base de datos durante insertion del marca (hashtag): %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problema salveguardar nota. Troppo longe."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema salveguardar nota. Usator incognite."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4476,41 +4531,70 @@ msgstr ""
 "Troppo de messages duplicate troppo rapidemente; face un pausa e publica de "
 "novo post alcun minutas."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Il te es prohibite publicar notas in iste sito."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problema salveguardar nota."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Problema salveguardar le cassa de entrata del gruppo."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Error del base de datos durante le insertion del responsa: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Tu ha essite blocate del subscription."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Ja subscribite!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Le usator te ha blocate."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Non subscribite!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Non poteva deler auto-subscription."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Non poteva deler subscription."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Benvenite a %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Non poteva crear gruppo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Non poteva configurar le membrato del gruppo."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Non poteva configurar le membrato del gruppo."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Non poteva salveguardar le subscription."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Cambiar le optiones de tu profilo"
@@ -4552,120 +4636,190 @@ msgstr "Pagina sin titulo"
 msgid "Primary site navigation"
 msgstr "Navigation primari del sito"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Initio"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profilo personal e chronologia de amicos"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Cambiar tu e-mail, avatar, contrasigno, profilo"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Connecter"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Conto"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Connecter con servicios"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Connecter"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modificar le configuration del sito"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invitar"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrator"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Clauder session"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Terminar le session del sito"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Clauder session"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crear un conto"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Crear conto"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Identificar te a iste sito"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Adjuta"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Aperir session"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Adjuta me!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Cercar"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Adjuta"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cercar personas o texto"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Cercar"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Aviso del sito"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Vistas local"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Aviso de pagina"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navigation secundari del sito"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Adjuta"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "A proposito"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "CdS"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Confidentialitate"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Insignia"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licentia del software StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4674,12 +4828,12 @@ msgstr ""
 "**%%site.name%%** es un servicio de microblog offerite per [%%site.broughtby%"
 "%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** es un servicio de microblog. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4690,96 +4844,161 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licentia del contento del sito"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Totes "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licentia."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Post"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Ante"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Tu non pote facer modificationes in iste sito."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Le modification de iste pannello non es permittite."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() non implementate."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() non implementate."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Impossibile deler configuration de apparentia."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configuration basic del sito"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Sito"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configuration del apparentia"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Apparentia"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Configuration del usator"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Usator"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Configuration del accesso"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configuration del camminos"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Configuration del sessiones"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessiones"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "Le ressource de API require accesso pro lectura e scriptura, ma tu ha "
 "solmente accesso pro lectura."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4873,11 +5092,11 @@ msgstr "Notas ubi iste annexo appare"
 msgid "Tags for this attachment"
 msgstr "Etiquettas pro iste annexo"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Cambio del contrasigno fallite"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Cambio del contrasigno non permittite"
 
@@ -5028,82 +5247,92 @@ msgstr "Errur durante le salveguarda del nota."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Specifica le nomine del usator al qual subscriber te"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Usator non existe"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Subscribite a %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Specifica le nomine del usator al qual cancellar le subscription"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Subscription a %s cancellate"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Commando non ancora implementate."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notification disactivate."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Non pote disactivar notification."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notification activate."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Non pote activar notification."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Le commando de apertura de session es disactivate"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Iste ligamine pote esser usate solmente un vice, e es valide durante "
 "solmente 2 minutas: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Subscription a %s cancellate"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Tu non es subscribite a alcuno."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Tu es subscribite a iste persona:"
 msgstr[1] "Tu es subscribite a iste personas:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Necuno es subscribite a te."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Iste persona es subscribite a te:"
 msgstr[1] "Iste personas es subscribite a te:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Tu non es membro de alcun gruppo."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Tu es membro de iste gruppo:"
 msgstr[1] "Tu es membro de iste gruppos:"
 
-#: lib/command.php:728
+#: lib/command.php:769
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5117,6 +5346,7 @@ msgid ""
 "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"
@@ -5181,19 +5411,19 @@ msgstr ""
 "tracks - non ancora implementate.\n"
 "tracking - non ancora implementate.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Nulle file de configuration trovate. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Io cercava files de configuration in le sequente locos: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Considera executar le installator pro reparar isto."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Ir al installator."
 
@@ -5381,25 +5611,25 @@ msgstr "Error de systema durante le incargamento del file."
 
 #: lib/imagefile.php:96
 msgid "Not an image or corrupt file."
-msgstr "Le file non es un imagine o es defecte."
+msgstr "Le file non es un imagine o es defectuose."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato de file de imagine non supportate."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "File perdite."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Typo de file incognite"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "KB"
 
@@ -5689,7 +5919,7 @@ msgstr ""
 "altere usatores in conversation. Altere personas pote inviar te messages que "
 "solmente tu pote leger."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "de"
 
@@ -5782,6 +6012,12 @@ msgstr "A"
 msgid "Available characters"
 msgstr "Characteres disponibile"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Inviar"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Inviar un nota"
@@ -5815,48 +6051,48 @@ msgstr ""
 "Pardono, le obtention de tu geolocalisation prende plus tempore que "
 "previste. Per favor reproba plus tarde."
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "E"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "W"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "a"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "in contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Repetite per"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Responder a iste nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Nota repetite"
 
@@ -5888,10 +6124,6 @@ msgstr "Error durante le insertion del profilo remote"
 msgid "Duplicate notice"
 msgstr "Duplicar nota"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Tu ha essite blocate del subscription."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Non poteva inserer nove subscription."
@@ -5908,6 +6140,10 @@ msgstr "Responsas"
 msgid "Favorites"
 msgstr "Favorites"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Usator"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Cassa de entrata"
@@ -5997,7 +6233,7 @@ msgstr "Repeter iste nota?"
 msgid "Repeat this notice"
 msgstr "Repeter iste nota"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Nulle signule usator definite pro le modo de singule usator."
 
@@ -6017,6 +6253,10 @@ msgstr "Cercar in sito"
 msgid "Keyword(s)"
 msgstr "Parola(s)-clave"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Cercar"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Adjuta super le recerca"
@@ -6068,33 +6308,14 @@ msgstr "Personas qui seque %s"
 msgid "Groups %s is a member of"
 msgstr "Gruppos del quales %s es membro"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Ja subscribite!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Le usator te ha blocate."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Non poteva subscriber te."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Non poteva subcriber altere persona a te."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Non subscribite!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Non poteva deler auto-subscription."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invitar"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Non poteva deler subscription."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Invitar amicos e collegas a accompaniar te in %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6146,67 +6367,67 @@ msgstr "Modificar avatar"
 msgid "User actions"
 msgstr "Actiones de usator"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Modificar configuration de profilo"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Modificar"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Inviar un message directe a iste usator"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Message"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "alcun secundas retro"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "circa un minuta retro"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minutas retro"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "circa un hora retro"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d horas retro"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "circa un die retro"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d dies retro"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "circa un mense retro"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d menses retro"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "circa un anno retro"
 
index e8858302582a0884b51f74ea2e1e138278308713..aaf79c8f7f8feea9f6464900c55ddac1022945b2 100644 (file)
@@ -8,12 +8,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:11+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:04+0000\n"
 "Language-Team: Icelandic\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
@@ -21,71 +21,77 @@ msgstr ""
 "= 31 && n % 100 != 41 && n % 100 != 51 && n % 100 != 61 && n % 100 != 71 && "
 "n % 100 != 81 && n % 100 != 91);\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Samþykkja"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Stillingar fyrir mynd"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Nýskrá"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Friðhelgi"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "Bjóða"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 msgid "Closed"
 msgstr ""
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Vista"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Stillingar fyrir mynd"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Vista"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Ekkert þannig merki."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -99,78 +105,87 @@ msgstr "Ekkert þannig merki."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Enginn svoleiðis notandi."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s og vinirnir, síða %d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s og vinirnir"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr ""
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr ""
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Færslur frá %1$s og vinum á %2$s!"
@@ -183,20 +198,20 @@ msgstr "Færslur frá %1$s og vinum á %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Aðferð í forritsskilum fannst ekki!"
@@ -230,8 +245,9 @@ msgstr "Gat ekki uppfært notanda."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Notandi hefur enga persónulega síðu."
 
@@ -256,7 +272,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -373,68 +389,68 @@ msgstr ""
 msgid "Could not find target user."
 msgstr ""
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Stuttnefni geta bara verið lágstafir og tölustafir en engin bil."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Stuttnefni nú þegar í notkun. Prófaðu eitthvað annað."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Ekki tækt stuttnefni."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Heimasíða er ekki gild vefslóð."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Fullt nafn er of langt (í mesta lagi 255 stafir)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Lýsing er of löng (í mesta lagi 140 tákn)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Staðsetning er of löng (í mesta lagi 255 stafir)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr ""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr ""
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -446,16 +462,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Aðferð í forritsskilum fannst ekki!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "Þú ert nú þegar meðlimur í þessum hópi"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Gat ekki bætt notandanum %s í hópinn %s"
@@ -465,7 +481,7 @@ msgstr "Gat ekki bætt notandanum %s í hópinn %s"
 msgid "You are not a member of this group."
 msgstr "Þú ert ekki meðlimur í þessum hópi."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Gat ekki fjarlægt notandann %s úr hópnum %s"
@@ -497,7 +513,7 @@ msgstr "Ótæk stærð."
 #: 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:309
+#: 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
@@ -506,7 +522,7 @@ msgstr "Ótæk stærð."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -541,7 +557,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -564,13 +580,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Aðgangur"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -650,18 +666,18 @@ msgstr "Skráarsnið myndar ekki stutt."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Uppáhaldsbabl frá %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Rás %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -677,12 +693,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Almenningsrás %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s færslur frá öllum!"
@@ -692,17 +708,17 @@ msgstr "%s færslur frá öllum!"
 msgid "Repeated to %s"
 msgstr "Svör við %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Svör við %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Babl merkt með %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr ""
@@ -718,8 +734,7 @@ msgstr ""
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Ekkert stuttnefni."
 
@@ -731,7 +746,7 @@ msgstr "Engin stærð."
 msgid "Invalid size."
 msgstr "Ótæk stærð."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Mynd"
@@ -748,30 +763,30 @@ msgid "User without matching profile"
 msgstr "Notandi með enga persónulega síðu sem passar við"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Stillingar fyrir mynd"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Upphafleg mynd"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Forsýn"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Eyða"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Hlaða upp"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Skera af"
 
@@ -780,7 +795,7 @@ msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 "Veldu ferningslaga svæði á upphaflegu myndinni sem einkennismyndina þína"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Týndum skráargögnunum okkar"
 
@@ -813,23 +828,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nei"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Opna á þennan notanda"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Já"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Loka á þennan notanda"
 
@@ -837,39 +852,43 @@ msgstr "Loka á þennan notanda"
 msgid "Failed to save block information."
 msgstr "Mistókst að vista upplýsingar um notendalokun"
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Enginn þannig hópur."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s og vinirnir, síða %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Opna"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Opna á þennan notanda"
 
@@ -950,7 +969,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Það komu upp vandamál varðandi setutókann þinn."
 
@@ -976,12 +995,13 @@ msgstr "Gat ekki uppfært hóp."
 msgid "Delete this application"
 msgstr "Eyða þessu babli"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Ekki innskráð(ur)."
@@ -1008,7 +1028,7 @@ msgstr "Ertu viss um að þú viljir eyða þessu babli?"
 msgid "Do not delete this notice"
 msgstr ""
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Eyða þessu babli"
 
@@ -1027,19 +1047,19 @@ msgstr "Þú getur ekki eytt stöðu annars notanda."
 msgid "Delete user"
 msgstr "Eyða"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Eyða þessu babli"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1146,6 +1166,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Vista"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1248,30 +1279,30 @@ msgstr "Breyta hópnum %s"
 msgid "You must be logged in to create a group."
 msgstr "Þú verður að hafa skráð þig inn til að búa til hóp."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Þú verður að vera stjórnandi til að geta breytt hópnum"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Notaðu þetta eyðublað til að breyta hópnum."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Lýsing er of löng (í mesta lagi 140 tákn)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Gat ekki uppfært hóp."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr ""
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Valmöguleikar vistaðir."
 
@@ -1616,7 +1647,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr ""
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr ""
 
@@ -1649,87 +1680,87 @@ msgstr "Ekkert einkenni"
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr ""
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Einkennismynd hópsins"
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Notandi með enga persónulega síðu sem passar við"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Einkennismynd uppfærð."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Tókst ekki að uppfæra einkennismynd"
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Hópmeðlimir %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Hópmeðlimir %s, síða %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Listi yfir notendur í þessum hóp."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Stjórnandi"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Loka"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1986,16 +2017,19 @@ msgstr "Persónuleg skilaboð"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Bættu persónulegum skilaboðum við boðskortið ef þú vilt."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Senda"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s hefur boðið þér að slást í hópinn með þeim á %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2056,7 +2090,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Þú verður að hafa skráð þig inn til að bæta þér í hóp."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Ekkert stuttnefni."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s bætti sér í hópinn %s"
@@ -2065,11 +2104,11 @@ msgstr "%s bætti sér í hópinn %s"
 msgid "You must be logged in to leave a group."
 msgstr "Þú verður aða hafa skráð þig inn til að ganga úr hóp."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Þú ert ekki meðlimur í þessum hópi."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s gekk úr hópnum %s"
@@ -2087,8 +2126,7 @@ msgstr "Rangt notendanafn eða lykilorð."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Engin heimild."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Innskráning"
 
@@ -2347,8 +2385,8 @@ msgstr ""
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Enginn stuðningur við gagnasnið."
 
@@ -2495,7 +2533,7 @@ msgstr "Get ekki vistað nýja lykilorðið."
 msgid "Password saved."
 msgstr "Lykilorð vistað."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2528,7 +2566,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "Bjóða"
@@ -2711,7 +2748,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 lágstafir eða tölustafir, engin greinarmerki eða bil"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Fullt nafn"
@@ -2742,7 +2779,7 @@ msgid "Bio"
 msgstr "Lýsing"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2810,24 +2847,25 @@ msgstr "Tungumál er of langt (í mesta lagi 50 stafir)."
 msgid "Invalid tag: \"%s\""
 msgstr "Ógilt merki: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Gat ekki uppfært notanda í sjálfvirka áskrift."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Gat ekki vistað merki."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Gat ekki vistað persónulega síðu."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Gat ekki vistað merki."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Stillingar vistaðar."
 
@@ -2840,45 +2878,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Gat ekki sótt efni úr almenningsveitu."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Almenningsrás, síða %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Almenningsrás"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2887,7 +2925,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3060,8 +3098,7 @@ msgstr ""
 msgid "Registration successful"
 msgstr "Nýskráning tókst"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Nýskrá"
 
@@ -3206,7 +3243,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Gerast áskrifandi"
 
@@ -3251,7 +3288,7 @@ msgstr "Þú getur ekki nýskráð þig nema þú samþykkir leyfið."
 msgid "You already repeated that notice."
 msgstr "Þú hefur nú þegar lokað á þennan notanda."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Í sviðsljósinu"
@@ -3260,47 +3297,47 @@ msgstr "Í sviðsljósinu"
 msgid "Repeated!"
 msgstr ""
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Svör við %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Skilaboð til %1$s á %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr ""
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr ""
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Bablveita fyrir hópinn %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3327,7 +3364,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3352,7 +3388,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Stillingar fyrir mynd"
@@ -3387,7 +3423,7 @@ msgstr "Uppröðun"
 msgid "Description"
 msgstr "Lýsing"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Tölfræði"
@@ -3449,35 +3485,35 @@ msgstr "Uppáhaldsbabl %s"
 msgid "Could not retrieve favorite notices."
 msgstr "Gat ekki sótt uppáhaldsbabl."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Bablveita uppáhaldsbabls %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Bablveita uppáhaldsbabls %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Bablveita uppáhaldsbabls %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3485,7 +3521,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3499,67 +3535,67 @@ msgstr "%s hópurinn"
 msgid "%1$s group, page %2$d"
 msgstr "Hópmeðlimir %s, síða %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Hópssíðan"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "Vefslóð"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Athugasemd"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Hópsaðgerðir"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "%s hópurinn"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Meðlimir"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ekkert)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Allir meðlimir"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr ""
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3569,7 +3605,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3578,7 +3614,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3939,15 +3975,26 @@ msgstr "Enginn lykill sleginn inn"
 msgid "You are not subscribed to that profile."
 msgstr "Þú ert ekki áskrifandi."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Gat ekki vistað áskrift."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Ekki staðbundinn notandi."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Ekkert svoleiðis babl."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Þú ert ekki áskrifandi."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Þú ert nú í áskrift"
 
@@ -4007,7 +4054,7 @@ msgstr "Þetta er fólkið sem þú hlustar á bablið í."
 msgid "These are the people whose notices %s listens to."
 msgstr "Þetta er fólkið sem %s hlustar á bablið í."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4017,35 +4064,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber snarskilaboðaþjónusta"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Notendur sjálfmerktir með %s - síða %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Bablveita fyrir %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -4102,7 +4149,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Ekkert þannig merki."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Aðferð í forritsskilum er í þróun."
 
@@ -4135,77 +4182,79 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Notandi"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Persónuleg síða"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "Bjóða nýjum notendum að vera með"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Allar áskriftir"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Gerast sjálfkrafa áskrifandi að hverjum þeim sem gerist áskrifandi að þér "
 "(best fyrir ómannlega notendur)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Boðskort hefur verið sent út"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "Boðskort hefur verið sent út"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4389,7 +4438,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Persónulegt"
@@ -4430,6 +4479,11 @@ msgstr "Gat ekki uppfært hóp."
 msgid "Group leave failed."
 msgstr "Hópssíðan"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Gat ekki uppfært hóp."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4448,68 +4502,100 @@ msgstr "Gat ekki skeytt skilaboðum inn í."
 msgid "Could not update message with new URI."
 msgstr "Gat ekki uppfært skilaboð með nýju veffangi."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Gagnagrunnsvilla við innsetningu myllumerkis: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Gat ekki vistað babl. Óþekktur notandi."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 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:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Vandamál komu upp við að vista babl."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Vandamál komu upp við að vista babl."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Gagnagrunnsvilla við innsetningu svars: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+msgid "You have been banned from subscribing."
+msgstr "Þessi notandi hefur bannað þér að gerast áskrifandi"
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Notandinn hefur lokað á þig."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Ekki í áskrift!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Gat ekki eytt áskrift."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Gat ekki eytt áskrift."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Gat ekki búið til hóp."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Gat ekki skráð hópmeðlimi."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Gat ekki skráð hópmeðlimi."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Gat ekki vistað áskrift."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Breyta persónulegu stillingunum þínum"
@@ -4551,124 +4637,192 @@ msgstr "Ónafngreind síða"
 msgid "Primary site navigation"
 msgstr "Stikl aðalsíðu"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Heim"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persónuleg síða og vinarás"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Persónulegt"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr ""
 "Breyttu tölvupóstinum þínum, einkennismyndinni þinni, lykilorðinu þínu, "
 "persónulegu síðunni þinni"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Tengjast"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Aðgangur"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Gat ekki framsent til vefþjóns: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Tengjast"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Stikl aðalsíðu"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Bjóða"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Stjórnandi"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Útskráning"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Bjóða"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Skrá þig út af síðunni"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Útskráning"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Búa til aðgang"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Nýskrá"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Skrá þig inn á síðuna"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hjálp"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Innskráning"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjálp!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Leita"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hjálp"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Leita að fólki eða texta"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Leita"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Babl vefsíðunnar"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Staðbundin sýn"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Babl síðunnar"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Stikl undirsíðu"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hjálp"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Um"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Spurt og svarað"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Friðhelgi"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Frumþula"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Tengiliður"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Hugbúnaðarleyfi StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4677,12 +4831,12 @@ msgstr ""
 "**%%site.name%%** er örbloggsþjónusta í boði [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er örbloggsþjónusta."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4693,104 +4847,168 @@ msgstr ""
 "sem er gefinn út undir [GNU Affero almenningsleyfinu](http://www.fsf.org/"
 "licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "Hugbúnaðarleyfi StatusNet"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Allt "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "leyfi."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Uppröðun"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Eftir"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Áður"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Þú getur ekki sent þessum notanda skilaboð."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Nýskráning ekki leyfð."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Skipun hefur ekki verið fullbúin"
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Skipun hefur ekki verið fullbúin"
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Staðfesting tölvupóstfangs"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Bjóða"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS staðfesting"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Persónulegt"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS staðfesting"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Notandi"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS staðfesting"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS staðfesting"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS staðfesting"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Persónulegt"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4885,12 +5103,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Lykilorðabreyting"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Lykilorðabreyting"
@@ -5044,83 +5262,92 @@ msgstr "Vandamál komu upp við að vista babl."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Tilgreindu nafn notandans sem þú vilt gerast áskrifandi að"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Enginn svoleiðis notandi."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Nú ert þú áskrifandi að %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Tilgreindu nafn notandans sem þú vilt hætta sem áskrifandi að"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Nú ert þú ekki lengur áskrifandi að %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Skipun hefur ekki verið fullbúin"
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Tilkynningar af."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Get ekki slökkt á tilkynningum."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Tilkynningar á."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Get ekki kveikt á tilkynningum."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Nú ert þú ekki lengur áskrifandi að %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Þú ert ekki áskrifandi."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Þú ert nú þegar í áskrift að þessum notendum:"
 msgstr[1] "Þú ert nú þegar í áskrift að þessum notendum:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Gat ekki leyft öðrum að gerast áskrifandi að þér."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Gat ekki leyft öðrum að gerast áskrifandi að þér."
 msgstr[1] "Gat ekki leyft öðrum að gerast áskrifandi að þér."
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Þú ert ekki meðlimur í þessum hópi."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Þú ert ekki meðlimur í þessum hópi."
 msgstr[1] "Þú ert ekki meðlimur í þessum hópi."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5134,6 +5361,7 @@ msgid ""
 "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"
@@ -5161,20 +5389,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Enginn staðfestingarlykill."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Skrá þig inn á síðuna"
@@ -5366,23 +5594,23 @@ msgstr "Kerfisvilla kom upp við upphal skráar."
 msgid "Not an image or corrupt file."
 msgstr "Annaðhvort ekki mynd eða þá að skráin er gölluð."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Skráarsnið myndar ekki stutt."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Týndum skránni okkar"
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Óþekkt skráargerð"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5596,7 +5824,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr "frá"
@@ -5687,6 +5915,12 @@ msgstr "Til"
 msgid "Available characters"
 msgstr "Leyfileg tákn"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Senda"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Senda babl"
@@ -5720,50 +5954,50 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "Nei"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Í sviðsljósinu"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Svara þessu babli"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Svara"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Babl sent inn"
@@ -5797,11 +6031,6 @@ msgstr "Villa kom upp við að setja inn persónulega fjarsíðu"
 msgid "Duplicate notice"
 msgstr "Eyða babli"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Þessi notandi hefur bannað þér að gerast áskrifandi"
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Gat ekki sett inn nýja áskrift."
@@ -5818,6 +6047,10 @@ 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"
@@ -5911,7 +6144,7 @@ msgstr "Svara þessu babli"
 msgid "Repeat this notice"
 msgstr "Svara þessu babli"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5933,6 +6166,10 @@ msgstr ""
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Leita"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr ""
@@ -5986,35 +6223,14 @@ msgstr "Fólk sem eru áskrifendur að %s"
 msgid "Groups %s is a member of"
 msgstr "Hópar sem %s er meðlimur í"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Notandinn hefur lokað á þig."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Gat ekki farið í áskrift."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Gat ekki leyft öðrum að gerast áskrifandi að þér."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Ekki í áskrift!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Gat ekki eytt áskrift."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Bjóða"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Gat ekki eytt áskrift."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Bjóða vinum og vandamönnum að slást í hópinn á %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6068,67 +6284,67 @@ msgstr ""
 msgid "User actions"
 msgstr "Notandaaðgerðir"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr ""
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Senda bein skilaboð til þessa notanda"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Skilaboð"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "fyrir nokkrum sekúndum"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "fyrir um einni mínútu síðan"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fyrir um %d mínútum síðan"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "fyrir um einum klukkutíma síðan"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "fyrir um %d klukkutímum síðan"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "fyrir um einum degi síðan"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "fyrir um %d dögum síðan"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "fyrir um einum mánuði síðan"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "fyrir um %d mánuðum síðan"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "fyrir um einu ári síðan"
 
index 37ac228b23b131d67a51c22133a7437b4bea3dc8..61d4cfaf91d636f57603e64f132ea35359630c80 100644 (file)
@@ -9,77 +9,84 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:14+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:07+0000\n"
 "Language-Team: Italian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Accesso"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Impostazioni di accesso al sito"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registrazione"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privato"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr ""
 "Proibire agli utenti anonimi (che non hanno effettuato l'accesso) di vedere "
 "il sito?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Solo invito"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privato"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Rende la registrazione solo su invito"
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Chiuso"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Solo invito"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Disabilita la creazione di nuovi account"
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Salva"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Chiuso"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Salva impostazioni di accesso"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Salva"
+
+#. 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 "Pagina inesistente."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,46 +100,53 @@ msgstr "Pagina inesistente."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Utente inesistente."
 
-#: actions/all.php:84
+#. 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 e amici, pagina %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s e amici"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed degli amici di %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed degli amici di %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed degli amici di %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -140,7 +154,7 @@ msgstr ""
 "Questa è l'attività di %s e i suoi amici, ma nessuno ha ancora scritto "
 "qualche cosa."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -149,7 +163,8 @@ msgstr ""
 "Prova ad abbonarti a più persone, [entra in un gruppo](%%action.groups%%) o "
 "scrivi un messaggio."
 
-#: actions/all.php:134
+#. 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 "
@@ -159,7 +174,7 @@ msgstr ""
 "qualche cosa alla sua attenzione](%%%%action.newnotice%%%%?status_textarea=%3"
 "$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -168,12 +183,13 @@ msgstr ""
 "Perché non [crei un account](%%%%action.register%%%%) e richiami %s o scrivi "
 "un messaggio alla sua attenzione."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Tu e i tuoi amici"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Messaggi da %1$s e amici su %2$s!"
@@ -186,20 +202,20 @@ msgstr "Messaggi da %1$s e amici su %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Metodo delle API non trovato."
 
@@ -233,8 +249,9 @@ msgstr "Impossibile aggiornare l'utente."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "L'utente non ha un profilo."
 
@@ -260,7 +277,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -370,7 +387,7 @@ msgstr "Impossibile determinare l'utente sorgente."
 msgid "Could not find target user."
 msgstr "Impossibile trovare l'utente destinazione."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -378,62 +395,62 @@ msgstr ""
 "Il soprannome deve essere composto solo da lettere minuscole e numeri, senza "
 "spazi."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Soprannome già in uso. Prova con un altro."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Non è un soprannome valido."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "L'indirizzo della pagina web non è valido."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Nome troppo lungo (max 255 caratteri)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "La descrizione è troppo lunga (max %d caratteri)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Ubicazione troppo lunga (max 255 caratteri)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Troppi alias! Massimo %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Alias non valido: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "L'alias \"%s\" è già in uso. Prova con un altro."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "L'alias non può essere lo stesso del soprannome."
@@ -444,15 +461,15 @@ msgstr "L'alias non può essere lo stesso del soprannome."
 msgid "Group not found!"
 msgstr "Gruppo non trovato!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Fai già parte di quel gruppo."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "L'amministratore ti ha bloccato l'accesso a quel gruppo."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Impossibile iscrivere l'utente %1$s al gruppo %2$s."
@@ -461,7 +478,7 @@ msgstr "Impossibile iscrivere l'utente %1$s al gruppo %2$s."
 msgid "You are not a member of this group."
 msgstr "Non fai parte di questo gruppo."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Impossibile rimuovere l'utente %1$s dal gruppo %2$s."
@@ -492,7 +509,7 @@ msgstr "Token non valido."
 #: 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:309
+#: 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
@@ -501,7 +518,7 @@ msgstr "Token non valido."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -536,7 +553,7 @@ msgstr "Il token di richiesta %s è stato rifiutato o revocato."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -562,13 +579,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Account"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -618,7 +635,7 @@ msgstr "Messaggio eliminato."
 
 #: actions/apistatusesshow.php:144
 msgid "No status with that ID found."
-msgstr "Nessun stato trovato con quel ID."
+msgstr "Nessuno stato trovato con quel ID."
 
 #: actions/apistatusesupdate.php:161 actions/newnotice.php:155
 #: lib/mailhandler.php:60
@@ -645,18 +662,18 @@ msgstr "Formato non supportato."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Preferiti da %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Attività di %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -672,12 +689,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Attività pubblica di %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Aggiornamenti di %s da tutti!"
@@ -687,17 +704,17 @@ msgstr "Aggiornamenti di %s da tutti!"
 msgid "Repeated to %s"
 msgstr "Ripetuto a %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Ripetizioni di %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Messaggi etichettati con %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Messaggi etichettati con %1$s su %2$s!"
@@ -713,8 +730,7 @@ msgstr "Nessun allegato."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Nessun soprannome."
 
@@ -726,7 +742,7 @@ msgstr "Nessuna dimensione."
 msgid "Invalid size."
 msgstr "Dimensione non valida."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Immagine"
@@ -744,30 +760,30 @@ msgid "User without matching profile"
 msgstr "Utente senza profilo corrispondente"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Impostazioni immagine"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Originale"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Anteprima"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Elimina"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Carica"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Ritaglia"
 
@@ -775,7 +791,7 @@ msgstr "Ritaglia"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Scegli un'area quadrata per la tua immagine personale"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Perso il nostro file di dati."
 
@@ -810,22 +826,22 @@ msgstr ""
 "risposte che ti invierà."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Non bloccare questo utente"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Sì"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Blocca questo utente"
 
@@ -833,39 +849,43 @@ msgstr "Blocca questo utente"
 msgid "Failed to save block information."
 msgstr "Salvataggio delle informazioni per il blocco non riuscito."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Nessuna gruppo."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "Profili bloccati di %s"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Profili bloccati di %1$s, pagina %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Un elenco degli utenti a cui è bloccato l'accesso a questo gruppo."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Sblocca l'utente dal gruppo"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Sblocca"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Sblocca questo utente"
 
@@ -940,7 +960,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Si è verificato un problema con il tuo token di sessione."
 
@@ -965,12 +985,13 @@ msgstr "Non eliminare l'applicazione"
 msgid "Delete this application"
 msgstr "Elimina l'applicazione"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Accesso non effettuato."
@@ -999,7 +1020,7 @@ msgstr "Vuoi eliminare questo messaggio?"
 msgid "Do not delete this notice"
 msgstr "Non eliminare il messaggio"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Elimina questo messaggio"
 
@@ -1015,7 +1036,7 @@ msgstr "Puoi eliminare solo gli utenti locali."
 msgid "Delete user"
 msgstr "Elimina utente"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1023,12 +1044,12 @@ msgstr ""
 "Vuoi eliminare questo utente? Questa azione eliminerà tutti i dati "
 "dell'utente dal database, senza una copia di sicurezza."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Elimina questo utente"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Aspetto"
 
@@ -1131,6 +1152,17 @@ msgstr "Ripristina i valori predefiniti"
 msgid "Reset back to default"
 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/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 "Salva"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Salva aspetto"
@@ -1222,29 +1254,29 @@ msgstr "Modifica il gruppo %s"
 msgid "You must be logged in to create a group."
 msgstr "Devi eseguire l'accesso per creare un gruppo."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Devi essere amministratore per modificare il gruppo."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Usa questo modulo per modificare il gruppo."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "La descrizione è troppo lunga (max %d caratteri)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Impossibile aggiornare il gruppo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Impossibile creare gli alias."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Opzioni salvate."
 
@@ -1588,7 +1620,7 @@ msgstr "L'utente è già bloccato dal gruppo."
 msgid "User is not a member of group."
 msgstr "L'utente non fa parte del gruppo."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Blocca l'utente dal gruppo"
 
@@ -1623,11 +1655,11 @@ msgstr "Nessun ID."
 msgid "You must be logged in to edit a group."
 msgstr "Devi eseguire l'accesso per modificare un gruppo."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Aspetto del gruppo"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1635,20 +1667,20 @@ msgstr ""
 "Personalizza l'aspetto del tuo gruppo con un'immagine di sfondo e dei colori "
 "personalizzati."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Impossibile aggiornare l'aspetto."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Preferenze dell'aspetto salvate."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo del gruppo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1656,57 +1688,57 @@ msgstr ""
 "Puoi caricare un'immagine per il logo del tuo gruppo. La dimensione massima "
 "del file è di %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Utente senza profilo corrispondente."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Scegli un'area quadrata dell'immagine per il logo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo aggiornato."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Aggiornamento del logo non riuscito."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Membri del gruppo %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Membri del gruppo %1$s, pagina %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Un elenco degli utenti in questo gruppo."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Amministra"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blocca"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Rende l'utente amministratore del gruppo"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Rendi amm."
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Rende questo utente un amministratore"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1970,16 +2002,19 @@ msgstr "Messaggio personale"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Puoi aggiungere un messaggio personale agli inviti."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Invia"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "Hai ricevuto un invito per seguire %1$s su %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2040,7 +2075,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Devi eseguire l'accesso per iscriverti a un gruppo."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Nessun soprannome o ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s fa ora parte del gruppo %2$s"
@@ -2049,11 +2088,11 @@ msgstr "%1$s fa ora parte del gruppo %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Devi eseguire l'accesso per lasciare un gruppo."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Non fai parte di quel gruppo."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s ha lasciato il gruppo %2$s"
@@ -2070,8 +2109,7 @@ msgstr "Nome utente o password non corretto."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Errore nell'impostare l'utente. Forse non hai l'autorizzazione."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Accedi"
 
@@ -2325,8 +2363,8 @@ msgstr "tipo di contenuto "
 msgid "Only "
 msgstr "Solo "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Non è un formato di dati supportato."
 
@@ -2467,7 +2505,7 @@ msgstr "Impossibile salvare la nuova password."
 msgid "Password saved."
 msgstr "Password salvata."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Percorsi"
 
@@ -2500,7 +2538,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Server SSL non valido. La lunghezza massima è di 255 caratteri."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Sito"
 
@@ -2675,7 +2712,7 @@ msgstr ""
 "1-64 lettere minuscole o numeri, senza spazi o simboli di punteggiatura"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nome"
@@ -2703,7 +2740,7 @@ msgid "Bio"
 msgstr "Biografia"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2770,23 +2807,24 @@ msgstr "La lingua è troppo lunga (max 50 caratteri)."
 msgid "Invalid tag: \"%s\""
 msgstr "Etichetta non valida: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Impossibile aggiornare l'utente per auto-abbonarsi."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Impossibile salvare le preferenze della posizione."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Impossibile salvare il profilo."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Impossibile salvare le etichette."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Impostazioni salvate."
 
@@ -2799,28 +2837,28 @@ msgstr "Oltre il limite della pagina (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Impossibile recuperare l'attività pubblica."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Attività pubblica, pagina %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Attività pubblica"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Feed dell'attività pubblica (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Feed dell'attività pubblica (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Feed dell'attività pubblica (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2829,18 +2867,18 @@ msgstr ""
 "Questa è l'attività pubblica di %%site.name%%, ma nessuno ha ancora scritto "
 "qualche cosa."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Fallo tu!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 "Perché non [crei un account](%%action.register%%) e scrivi qualche cosa!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2853,7 +2891,7 @@ msgstr ""
 "net/). [Registrati](%%action.register%%) per condividere messaggi con i tuoi "
 "amici, i tuoi familiari e colleghi! ([Maggiori informazioni](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3030,10 +3068,9 @@ msgstr "Codice di invito non valido."
 msgid "Registration successful"
 msgstr "Registrazione riuscita"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
-msgstr "Registra"
+msgstr "Registrati"
 
 #: actions/register.php:135
 msgid "Registration not allowed."
@@ -3181,7 +3218,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Abbonati"
 
@@ -3219,7 +3256,7 @@ msgstr "Non puoi ripetere i tuoi stessi messaggi."
 msgid "You already repeated that notice."
 msgstr "Hai già ripetuto quel messaggio."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Ripetuti"
 
@@ -3227,33 +3264,33 @@ msgstr "Ripetuti"
 msgid "Repeated!"
 msgstr "Ripetuti!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Risposte a %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Risposte a %1$s, pagina %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Feed delle risposte di %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Feed delle risposte di %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Feed delle risposte di %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3262,7 +3299,7 @@ msgstr ""
 "Questa è l'attività delle risposte a %1$s, ma %2$s non ha ricevuto ancora "
 "alcun messaggio."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3271,7 +3308,7 @@ msgstr ""
 "Puoi avviare una discussione con altri utenti, abbonarti a più persone o "
 "[entrare in qualche gruppo](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3298,7 +3335,6 @@ msgid "User is already sandboxed."
 msgstr "L'utente è già nella \"sandbox\"."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessioni"
 
@@ -3323,7 +3359,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Abilita il debug per le sessioni"
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salva impostazioni"
 
@@ -3353,7 +3389,7 @@ msgstr "Organizzazione"
 msgid "Description"
 msgstr "Descrizione"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistiche"
@@ -3416,22 +3452,22 @@ msgstr "Messaggi preferiti di %1$s, pagina %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Impossibile recuperare i messaggi preferiti."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed dei preferiti di %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed dei preferiti di %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed dei preferiti di di %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3439,7 +3475,7 @@ msgstr ""
 "Non hai ancora scelto alcun messaggio come preferito. Fai clic sul pulsate a "
 "forma di cuore per salvare i messaggi e rileggerli in un altro momento."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3448,7 +3484,7 @@ msgstr ""
 "%s non ha aggiunto alcun messaggio tra i suoi preferiti. Scrivi qualche cosa "
 "di interessante in modo che lo inserisca tra i suoi preferiti. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3459,7 +3495,7 @@ msgstr ""
 "account](%%%%action.register%%%%) e quindi scrivi qualche cosa di "
 "interessante in modo che lo inserisca tra i suoi preferiti. :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Questo è un modo per condividere ciò che ti piace."
 
@@ -3473,67 +3509,67 @@ msgstr "Gruppo %s"
 msgid "%1$s group, page %2$d"
 msgstr "Gruppi di %1$s, pagina %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Profilo del gruppo"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Nota"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Alias"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Azioni dei gruppi"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, 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:334
+#: actions/showgroup.php:342
 #, 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:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Feed dei messaggi per il gruppo %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF per il gruppo %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membri"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(nessuno)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Tutti i membri"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Creato"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3549,7 +3585,7 @@ msgstr ""
 "stesso](%%%%action.register%%%%) per far parte di questo gruppo e di molti "
 "altri! ([Maggiori informazioni](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3561,7 +3597,7 @@ msgstr ""
 "(http://it.wikipedia.org/wiki/Microblogging) basato sul software libero "
 "[StatusNet](http://status.net/)."
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Amministratori"
 
@@ -3928,15 +3964,25 @@ msgstr "Nessun codice inserito"
 msgid "You are not subscribed to that profile."
 msgstr "Non hai una abbonamento a quel profilo."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Impossibile salvare l'abbonamento."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Non un utente locale."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Quest'azione accetta solo richieste POST."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Nessun profilo."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"Non è possibile abbonarsi a un profilo remoto OMB 0.1 con quest'azione."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abbonati"
 
@@ -4000,7 +4046,7 @@ msgstr "Queste sono le persone che stai seguendo."
 msgid "These are the people whose notices %s listens to."
 msgstr "Queste sono le persone seguite da %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4015,35 +4061,35 @@ msgstr ""
 "[usi Twitter](%%action.twittersettings%%), puoi abbonarti automaticamente "
 "alle persone che già seguivi lì."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s non sta seguendo nessuno."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Messaggi etichettati con %1$s, pagina %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Feed dei messaggi per l'etichetta %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Feed dei messaggi per l'etichetta %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Feed dei messaggi per l'etichetta %s (Atom)"
@@ -4099,7 +4145,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Nessuna etichetta."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Metodo delle API in lavorazione."
 
@@ -4131,71 +4177,73 @@ msgstr ""
 "La licenza \"%1$s\" dello stream di chi ascolti non è compatibile con la "
 "licenza \"%2$s\" di questo sito."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Utente"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Impostazioni utente per questo sito StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Limite per la biografia non valido. Deve essere numerico."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 "Testo di benvenuto non valido. La lunghezza massima è di 255 caratteri."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Abbonamento predefinito non valido: \"%1$s\" non è un utente."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profilo"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Limite biografia"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Lunghezza massima in caratteri della biografia"
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nuovi utenti"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Messaggio per nuovi utenti"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Messaggio di benvenuto per nuovi utenti (max 255 caratteri)"
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Abbonamento predefinito"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Abbonare automaticamente i nuovi utenti a questo utente"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Inviti"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Inviti abilitati"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Indica se consentire agli utenti di invitarne di nuovi"
 
@@ -4390,7 +4438,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugin"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Versione"
 
@@ -4431,6 +4479,10 @@ msgstr "Non si fa parte del gruppo."
 msgid "Group leave failed."
 msgstr "Uscita dal gruppo non riuscita."
 
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Impossibile aggiornare il gruppo locale."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4448,27 +4500,27 @@ msgstr "Impossibile inserire il messaggio."
 msgid "Could not update message with new URI."
 msgstr "Impossibile aggiornare il messaggio con il nuovo URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Errore del DB nell'inserire un hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problema nel salvare il messaggio. Troppo lungo."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema nel salvare il messaggio. Utente sconosciuto."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4476,41 +4528,68 @@ msgstr ""
 "Troppi messaggi duplicati troppo velocemente; fai una pausa e scrivi di "
 "nuovo tra qualche minuto."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Ti è proibito inviare messaggi su questo sito."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problema nel salvare il messaggio."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Problema nel salvare la casella della posta del gruppo."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Errore del DB nell'inserire la risposta: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Non ti è possibile abbonarti."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Hai già l'abbonamento!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "L'utente non ti consente di seguirlo."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Non hai l'abbonamento!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Impossibile eliminare l'auto-abbonamento."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Impossibile eliminare l'abbonamento."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Benvenuti su %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Impossibile creare il gruppo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Impossibile impostare l'URI del gruppo."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Impossibile impostare la membership al gruppo."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Impossibile salvare le informazioni del gruppo locale."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Modifica le impostazioni del tuo profilo"
@@ -4552,120 +4631,190 @@ msgstr "Pagina senza nome"
 msgid "Primary site navigation"
 msgstr "Esplorazione sito primaria"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Home"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profilo personale e attività degli amici"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personale"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Modifica la tua email, immagine, password o il tuo profilo"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Connetti"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Account"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Connettiti con altri servizi"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Connetti"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Modifica la configurazione del sito"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invita"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Amministra"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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:458
-msgid "Logout"
-msgstr "Esci"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invita"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Termina la tua sessione sul sito"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Esci"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Crea un account"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrati"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Accedi al sito"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Aiuto"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Accedi"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Aiutami!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Cerca"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Aiuto"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Cerca persone o del testo"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Cerca"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Messaggio del sito"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Viste locali"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Pagina messaggio"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Esplorazione secondaria del sito"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Aiuto"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Informazioni"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Sorgenti"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contatti"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Badge"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licenza del software StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4674,12 +4823,12 @@ msgstr ""
 "**%%site.name%%** è un servizio di microblog offerto da [%%site.broughtby%%]"
 "(%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** è un servizio di microblog. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4690,98 +4839,163 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licenza del contenuto del sito"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Tutti "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licenza."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginazione"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Successivi"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Precedenti"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Impossibile gestire contenuti remoti."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Impossibile gestire contenuti XML incorporati."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Impossibile gestire contenuti Base64."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Non puoi apportare modifiche al sito."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Le modifiche al pannello non sono consentite."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() non implementata."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() non implementata."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Impossibile eliminare le impostazioni dell'aspetto."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configurazione di base"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Sito"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configurazione aspetto"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Aspetto"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Configurazione utente"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Utente"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Configurazione di accesso"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configurazione percorsi"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Configurazione sessioni"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessioni"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "Le risorse API richiedono accesso lettura-scrittura, ma si dispone del solo "
 "accesso in lettura."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4874,11 +5088,11 @@ msgstr "Messaggi in cui appare questo allegato"
 msgid "Tags for this attachment"
 msgstr "Etichette per questo allegato"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Modifica della password non riuscita"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "La modifica della password non è permessa"
 
@@ -5029,82 +5243,91 @@ msgstr "Errore nel salvare il messaggio."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Specifica il nome dell'utente a cui abbonarti."
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Utente inesistente."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Abbonati a %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Specifica il nome dell'utente da cui annullare l'abbonamento."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Abbonamento a %s annullato"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Comando non ancora implementato."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notifiche disattivate."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Impossibile disattivare le notifiche."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notifiche attivate."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Impossibile attivare le notifiche."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Il comando di accesso è disabilitato"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Questo collegamento è utilizzabile una sola volta ed è valido solo per 2 "
 "minuti: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "%s ha annullato l'abbonamento"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Il tuo abbonamento è stato annullato."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Persona di cui hai già un abbonamento:"
 msgstr[1] "Persone di cui hai già un abbonamento:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Nessuno è abbonato ai tuoi messaggi."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Questa persona è abbonata ai tuoi messaggi:"
 msgstr[1] "Queste persone sono abbonate ai tuoi messaggi:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Non fai parte di alcun gruppo."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Non fai parte di questo gruppo:"
 msgstr[1] "Non fai parte di questi gruppi:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5118,6 +5341,7 @@ msgid ""
 "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"
@@ -5156,6 +5380,7 @@ msgstr ""
 "d <soprannome> <testo> - invia un messaggio diretto all'utente\n"
 "get <soprannome> - recupera l'ultimo messaggio dell'utente\n"
 "whois <soprannome> - recupera le informazioni del profilo dell'utente\n"
+"lose <soprannome> - forza un utente nel non seguirti più\n"
 "fav <soprannome> - aggiunge l'ultimo messaggio dell'utente tra i tuoi "
 "preferiti\n"
 "fav #<ID_messaggio> - aggiunge un messaggio con quell'ID tra i tuoi "
@@ -5184,21 +5409,21 @@ msgstr ""
 "tracks - non ancora implementato\n"
 "tracking - non ancora implementato\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Non è stato trovato alcun file di configurazione. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "I file di configurazione sono stati cercati in questi posti: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 "Potrebbe essere necessario lanciare il programma d'installazione per "
 "correggere il problema."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Vai al programma d'installazione."
 
@@ -5387,23 +5612,23 @@ msgstr "Errore di sistema nel caricare il file."
 msgid "Not an image or corrupt file."
 msgstr "Non è un'immagine o il file è danneggiato."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato file immagine non supportato."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Perso il nostro file."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tipo di file sconosciuto"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5693,7 +5918,7 @@ msgstr ""
 "iniziare una conversazione con altri utenti. Altre persone possono mandare "
 "messaggi riservati solamente a te."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "via"
 
@@ -5785,6 +6010,11 @@ msgstr "A"
 msgid "Available characters"
 msgstr "Caratteri disponibili"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Invia"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Invia un messaggio"
@@ -5818,48 +6048,48 @@ msgstr ""
 "Il recupero della tua posizione geografica sta impiegando più tempo del "
 "previsto. Riprova più tardi."
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "E"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "O"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "presso"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "in una discussione"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Ripetuto da"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Rispondi a questo messaggio"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Rispondi"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Messaggio ripetuto"
 
@@ -5891,10 +6121,6 @@ msgstr "Errore nell'inserire il profilo remoto"
 msgid "Duplicate notice"
 msgstr "Messaggio duplicato"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Non ti è possibile abbonarti."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Impossibile inserire un nuovo abbonamento."
@@ -5911,6 +6137,10 @@ msgstr "Risposte"
 msgid "Favorites"
 msgstr "Preferiti"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Utente"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "In arrivo"
@@ -6000,7 +6230,7 @@ msgstr "Ripetere questo messaggio?"
 msgid "Repeat this notice"
 msgstr "Ripeti questo messaggio"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Nessun utente singolo definito per la modalità single-user."
 
@@ -6020,6 +6250,10 @@ msgstr "Cerca nel sito"
 msgid "Keyword(s)"
 msgstr "Parole"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Cerca"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Aiuto sulla ricerca"
@@ -6071,33 +6305,14 @@ msgstr "Persone abbonate a %s"
 msgid "Groups %s is a member of"
 msgstr "Gruppi di cui %s fa parte"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Hai già l'abbonamento!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "L'utente non ti consente di seguirlo."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Impossibile abbonarsi."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Impossibile abbonare altri a te."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Non hai l'abbonamento!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Impossibile eliminare l'auto-abbonamento."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invita"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Impossibile eliminare l'abbonamento."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Invita amici e colleghi a seguirti su %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6149,67 +6364,67 @@ msgstr "Modifica immagine"
 msgid "User actions"
 msgstr "Azioni utente"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Modifica impostazioni del profilo"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Modifica"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Invia un messaggio diretto a questo utente"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Messaggio"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Modera"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "pochi secondi fa"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "circa un minuto fa"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minuti fa"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "circa un'ora fa"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d ore fa"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "circa un giorno fa"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d giorni fa"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "circa un mese fa"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d mesi fa"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "circa un anno fa"
 
index 3063f953896aca1ec16cd79fe7a71499192eebc8..acbcb457d3196bbb6d985efc083bea0b3c3b11b0 100644 (file)
@@ -11,75 +11,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:17+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:10+0000\n"
 "Language-Team: Japanese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "アクセス"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "サイトアクセス設定"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "登録"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "プライベート"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "招待のみ"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "プライベート"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "招待のみ登録する"
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "閉じられた"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "招待のみ"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "新規登録を無効。"
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "保存"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "閉じられた"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "アクセス設定の保存"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "保存"
+
+#. 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 "そのようなページはありません。"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,52 +100,59 @@ msgstr "そのようなページはありません。"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "そのようなユーザはいません。"
 
-#: actions/all.php:84
+#. 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 と友人、ページ %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s と友人"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "%s の友人のフィード (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "%s の友人のフィード (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "%s の友人のフィード (Atom)"
 
-#: actions/all.php:127
+#. 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 "これは %s と友人のタイムラインです。まだ誰も投稿していません。"
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -147,7 +161,8 @@ msgstr ""
 "もっと多くの人をフォローしてみましょう。[グループに参加](%%action.groups%%) "
 "してみたり、何か投稿してみましょう。"
 
-#: actions/all.php:134
+#. 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 "
@@ -156,7 +171,7 @@ msgstr ""
 "プロフィールから [%1$s さんに合図](../%2$s) したり、[知らせたいことについて投"
 "稿](%%%%action.newnotice%%%%?status_textarea=%3$s) したりできます。"
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -165,12 +180,13 @@ msgstr ""
 "[アカウントを登録](%%%%action.register%%%%) して %s さんに合図したり、お知ら"
 "せを送ってみませんか。"
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "あなたと友人"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "%2$s に %1$s と友人からの更新があります!"
@@ -183,20 +199,20 @@ msgstr "%2$s に %1$s と友人からの更新があります!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API メソッドが見つかりません。"
 
@@ -230,8 +246,9 @@ msgstr "ユーザを更新できませんでした。"
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "ユーザはプロフィールをもっていません。"
 
@@ -257,7 +274,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -368,7 +385,7 @@ msgstr "ソースユーザーを決定できません。"
 msgid "Could not find target user."
 msgstr "ターゲットユーザーを見つけられません。"
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -376,62 +393,62 @@ msgstr ""
 "ニックネームには、小文字アルファベットと数字のみ使用できます。スペースは使用"
 "できません。"
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "そのニックネームは既に使用されています。他のものを試してみて下さい。"
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "有効なニックネームではありません。"
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "ホームページのURLが不適切です。"
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "フルネームが長すぎます。(255字まで)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "記述が長すぎます。(最長140字)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "場所が長すぎます。(255字まで)"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "別名が多すぎます! 最大 %d。"
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "不正な別名: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "別名 \"%s\" は既に使用されています。他のものを試してみて下さい。"
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "別名はニックネームと同じではいけません。"
@@ -442,15 +459,15 @@ msgstr "別名はニックネームと同じではいけません。"
 msgid "Group not found!"
 msgstr "グループが見つかりません!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "すでにこのグループのメンバーです。"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "管理者によってこのグループからブロックされています。"
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "ユーザ %1$s はグループ %2$s に参加できません。"
@@ -459,7 +476,7 @@ msgstr "ユーザ %1$s はグループ %2$s に参加できません。"
 msgid "You are not a member of this group."
 msgstr "このグループのメンバーではありません。"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "ユーザ %1$s をグループ %2$s から削除できません。"
@@ -490,7 +507,7 @@ msgstr "不正なトークン。"
 #: 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:309
+#: 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
@@ -499,7 +516,7 @@ msgstr "不正なトークン。"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -533,7 +550,7 @@ msgstr "リクエストトークン%sは、拒否されて、取り消されま
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -556,13 +573,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "アカウント"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -638,18 +655,18 @@ msgstr "サポート外の形式です。"
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / %2$s からのお気に入り"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s のタイムライン"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +682,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s のパブリックタイムライン"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "皆からの %s アップデート!"
@@ -680,17 +697,17 @@ msgstr "皆からの %s アップデート!"
 msgid "Repeated to %s"
 msgstr "%s への返信"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "%s の返信"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "%s とタグ付けされたつぶやき"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s に %1$s による更新があります!"
@@ -706,8 +723,7 @@ msgstr "そのような添付はありません。"
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "ニックネームがありません。"
 
@@ -719,7 +735,7 @@ msgstr "サイズがありません。"
 msgid "Invalid size."
 msgstr "不正なサイズ。"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "アバター"
@@ -736,30 +752,30 @@ msgid "User without matching profile"
 msgstr "合っているプロフィールのないユーザ"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "アバター設定"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "オリジナル"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "プレビュー"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "削除"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "アップロード"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "切り取り"
 
@@ -767,7 +783,7 @@ msgstr "切り取り"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "あなたのアバターとなるイメージを正方形で指定"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "ファイルデータを紛失しました。"
 
@@ -803,22 +819,22 @@ msgstr ""
 "どんな @-返信 についてもそれらから通知されないでしょう。"
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "No"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "このユーザをアンブロックする"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Yes"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "このユーザをブロックする"
 
@@ -826,39 +842,43 @@ msgstr "このユーザをブロックする"
 msgid "Failed to save block information."
 msgstr "ブロック情報の保存に失敗しました。"
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "そのようなグループはありません。"
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s ブロックされたプロファイル"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s ブロックされたプロファイル、ページ %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "このグループへの参加をブロックされたユーザのリスト。"
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "グループからのアンブロックユーザ"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "アンブロック"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "このユーザをアンブロックする"
 
@@ -933,7 +953,7 @@ msgstr "このアプリケーションのオーナーではありません。"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "あなたのセッショントークンに関する問題がありました。"
 
@@ -959,12 +979,13 @@ msgstr "このアプリケーションを削除しないでください"
 msgid "Delete this application"
 msgstr "このアプリケーションを削除"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "ログインしていません。"
@@ -993,7 +1014,7 @@ msgstr "本当にこのつぶやきを削除しますか?"
 msgid "Do not delete this notice"
 msgstr "このつぶやきを削除できません。"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "このつぶやきを削除"
 
@@ -1009,7 +1030,7 @@ msgstr "ローカルユーザのみ削除できます。"
 msgid "Delete user"
 msgstr "ユーザ削除"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1017,12 +1038,12 @@ msgstr ""
 "あなたは本当にこのユーザを削除したいですか? これはバックアップなしでデータ"
 "ベースからユーザに関するすべてのデータをクリアします。"
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "このユーザを削除"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "デザイン"
 
@@ -1125,6 +1146,17 @@ msgstr "デフォルトデザインに戻す。"
 msgid "Reset back to default"
 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/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 "保存"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "デザインの保存"
@@ -1216,29 +1248,29 @@ msgstr "%s グループを編集"
 msgid "You must be logged in to create a group."
 msgstr "グループを作るにはログインしていなければなりません。"
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "グループを編集するには管理者である必要があります。"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "このフォームを使ってグループを編集します。"
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "記述が長すぎます。(最長 %d 字)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "グループを更新できません。"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "別名を作成できません。"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "オプションが保存されました。"
 
@@ -1582,7 +1614,7 @@ msgstr "ユーザはすでにグループからブロックされています。
 msgid "User is not a member of group."
 msgstr "ユーザはグループのメンバーではありません。"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "グループからユーザをブロック"
 
@@ -1616,11 +1648,11 @@ msgstr "ID がありません。"
 msgid "You must be logged in to edit a group."
 msgstr "グループを編集するにはログインしていなければなりません。"
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "グループデザイン"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1628,20 +1660,20 @@ msgstr ""
 "あなたが選んだパレットの色とバックグラウンドイメージであなたのグループをカス"
 "タマイズしてください。"
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "あなたのデザインを更新できません。"
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "デザイン設定が保存されました。"
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "グループロゴ"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1649,57 +1681,57 @@ msgstr ""
 "あなたのグループ用にロゴイメージをアップロードできます。最大ファイルサイズは "
 "%s。"
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "合っているプロフィールのないユーザ"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "ロゴとなるイメージの正方形を選択。"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "ロゴが更新されました。"
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "ロゴの更新に失敗しました。"
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s グループメンバー"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s グループメンバー、ページ %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "このグループのユーザのリスト。"
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "管理者"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "ブロック"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "ユーザをグループの管理者にする"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "管理者にする"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "このユーザを管理者にする"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s 上の %1$s のメンバーから更新する"
@@ -1962,16 +1994,19 @@ msgstr "パーソナルメッセージ"
 msgid "Optionally add a personal message to the invitation."
 msgstr "任意に招待にパーソナルメッセージを加えてください。"
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "投稿"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s があなたを %2$s へ招待しました"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2032,7 +2067,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "グループに入るためにはログインしなければなりません。"
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "ニックネームがありません。"
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s はグループ %2$s に参加しました"
@@ -2041,11 +2081,11 @@ msgstr "%1$s はグループ %2$s に参加しました"
 msgid "You must be logged in to leave a group."
 msgstr "グループから離れるにはログインしていなければなりません。"
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "あなたはそのグループのメンバーではありません。"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s はグループ %2$s に残りました。"
@@ -2062,8 +2102,7 @@ msgstr "ユーザ名またはパスワードが間違っています。"
 msgid "Error setting user. You are probably not authorized."
 msgstr "ユーザ設定エラー。 あなたはたぶん承認されていません。"
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "ログイン"
 
@@ -2316,8 +2355,8 @@ msgstr "内容種別 "
 msgid "Only "
 msgstr "だけ "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "サポートされていないデータ形式。"
 
@@ -2458,7 +2497,7 @@ msgstr "新しいパスワードを保存できません。"
 msgid "Password saved."
 msgstr "パスワードが保存されました。"
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "パス"
 
@@ -2491,7 +2530,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "不正な SSL サーバー。最大 255 文字まで。"
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "サイト"
 
@@ -2664,7 +2702,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64文字の、小文字アルファベットか数字で、スペースや句読点は除く"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "フルネーム"
@@ -2692,7 +2730,7 @@ msgid "Bio"
 msgstr "自己紹介"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2758,23 +2796,24 @@ msgstr "言語が長すぎます。(最大50字)"
 msgid "Invalid tag: \"%s\""
 msgstr "不正なタグ: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "自動フォローのためのユーザを更新できませんでした。"
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "場所情報を保存できません。"
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "プロファイルを保存できません"
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "タグを保存できません。"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "設定が保存されました。"
 
@@ -2787,28 +2826,28 @@ msgstr "ページ制限を超えました (%s)"
 msgid "Could not retrieve public stream."
 msgstr "パブリックストリームを検索できません。"
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "パブリックタイムライン、ページ %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "パブリックタイムライン"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "パブリックストリームフィード (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "パブリックストリームフィード (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "パブリックストリームフィード (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2817,11 +2856,11 @@ msgstr ""
 "これは %%site.name%% のパブリックタイムラインです、しかしまだ誰も投稿していま"
 "せん。"
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "投稿する1番目になってください!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2829,7 +2868,7 @@ msgstr ""
 "なぜ [アカウント登録](%%action.register%%) しないのですか、そして最初の投稿を"
 "してください!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2843,7 +2882,7 @@ msgstr ""
 "族そして同僚などについてのつぶやきを共有しましょう! ([もっと読む](%%doc.help%"
 "%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3020,8 +3059,7 @@ msgstr "すみません、不正な招待コード。"
 msgid "Registration successful"
 msgstr "登録成功"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "登録"
 
@@ -3167,7 +3205,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "プロファイルサービスまたはマイクロブロギングサービスのURL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "フォロー"
 
@@ -3206,7 +3244,7 @@ msgstr "自分のつぶやきは繰り返せません。"
 msgid "You already repeated that notice."
 msgstr "すでにそのつぶやきを繰り返しています。"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "繰り返された"
 
@@ -3214,33 +3252,33 @@ msgstr "繰り返された"
 msgid "Repeated!"
 msgstr "繰り返されました!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "%s への返信"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "%1$s への返信、ページ %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "%s の返信フィード (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "%s の返信フィード (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "%s の返信フィード (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3249,7 +3287,7 @@ msgstr ""
 "これは %1$s への返信を表示したタイムラインです、しかし %2$s はまだつぶやきを"
 "受け取っていません。"
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3258,7 +3296,7 @@ msgstr ""
 "あなたは、他のユーザを会話をするか、多くの人々をフォローするか、または [グ"
 "ループに加わる](%%action.groups%%)ことができます。"
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3285,7 +3323,6 @@ msgid "User is already sandboxed."
 msgstr "ユーザはすでにサンドボックスです。"
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "セッション"
 
@@ -3310,7 +3347,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "セッションのためのデバッグ出力をオン。"
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "サイト設定の保存"
 
@@ -3340,7 +3377,7 @@ msgstr "組織"
 msgid "Description"
 msgstr "概要"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "統計データ"
@@ -3404,22 +3441,22 @@ msgstr "%1$s のお気に入りのつぶやき、ページ %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "お気に入りのつぶやきを検索できません。"
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "%s のお気に入りのフィード (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "%s のお気に入りのフィード (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "%s のお気に入りのフィード (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3428,7 +3465,7 @@ msgstr ""
 "加するあなたがそれらがお気に入りのつぶやきのときにお気に入りボタンをクリック"
 "するか、またはそれらの上でスポットライトをはじいてください。"
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3437,7 +3474,7 @@ msgstr ""
 "%s はまだ彼のお気に入りに少しのつぶやきも加えていません。 彼らがお気に入りに"
 "加えることおもしろいものを投稿してください:)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3448,7 +3485,7 @@ msgstr ""
 "%%%action.register%%%%) しないのですか。そして、彼らがお気に入りに加えるおも"
 "しろい何かを投稿しませんか:)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "これは、あなたが好きなことを共有する方法です。"
 
@@ -3462,67 +3499,67 @@ msgstr "%s グループ"
 msgid "%1$s group, page %2$d"
 msgstr "%1$s グループ、ページ %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "グループプロファイル"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "ノート"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "別名"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "グループアクション"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s グループのつぶやきフィード (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s グループのつぶやきフィード (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s グループのつぶやきフィード (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s グループの FOAF"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "メンバー"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(なし)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "全てのメンバー"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "作成日"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3537,7 +3574,7 @@ msgstr ""
 "する短いメッセージを共有します。[今すぐ参加](%%%%action.register%%%%) してこ"
 "のグループの一員になりましょう! ([もっと読む](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3550,7 +3587,7 @@ msgstr ""
 "wikipedia.org/wiki/Micro-blogging) サービス。メンバーは彼らの暮らしと興味に関"
 "する短いメッセージを共有します。"
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "管理者"
 
@@ -3921,15 +3958,26 @@ msgstr "コードが入力されていません"
 msgid "You are not subscribed to that profile."
 msgstr "あなたはそのプロファイルにフォローされていません。"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "フォローを保存できません。"
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "ローカルユーザではありません。"
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "そのようなファイルはありません。"
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "あなたはそのプロファイルにフォローされていません。"
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "フォローしている"
 
@@ -3993,7 +4041,7 @@ msgstr "あなたがつぶやきを聞いている人"
 msgid "These are the people whose notices %s listens to."
 msgstr "%s がつぶやきを聞いている人"
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4009,35 +4057,35 @@ msgstr ""
 "twittersettings%%)であれば、あなたは自動的に既にフォローしている人々をフォ"
 "ローできます。"
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s はだれも言うことを聞いていません。"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "%1$s とタグ付けされたつぶやき、ページ %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "%s とタグ付けされたつぶやきフィード (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "%s とタグ付けされたつぶやきフィード (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "%s とタグ付けされたつぶやきフィード (Atom)"
@@ -4090,7 +4138,7 @@ msgstr "このフォームを使用して、フォロー者かフォローにタ
 msgid "No such tag."
 msgstr "そのようなタグはありません。"
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API メソッドが工事中です。"
 
@@ -4122,70 +4170,72 @@ msgstr ""
 "リスニーストリームライセンス ‘%1$s’ は、サイトライセンス ‘%2$s’ と互換性があ"
 "りません。"
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "ユーザ"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "この StatusNet サイトのユーザ設定。"
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "不正な自己紹介制限。数字である必要があります。"
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "不正なウェルカムテキスト。最大長は255字です。"
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "不正なデフォルトフォローです: '%1$s'  はユーザではありません。"
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "プロファイル"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "自己紹介制限"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "プロファイル自己紹介の最大文字長。"
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "新しいユーザ"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "新しいユーザを歓迎"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "新しいユーザへのウェルカムテキスト (最大255字)。"
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "デフォルトフォロー"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "自動的にこのユーザに新しいユーザをフォローしてください。"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "招待"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "招待が可能"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "ユーザが新しいユーザを招待するのを許容するかどうか。"
 
@@ -4371,7 +4421,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "プラグイン"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "バージョン"
 
@@ -4413,6 +4463,11 @@ msgstr "グループの一部ではありません。"
 msgid "Group leave failed."
 msgstr "グループ脱退に失敗しました。"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "グループを更新できません。"
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4430,26 +4485,26 @@ msgstr "メッセージを追加できません。"
 msgid "Could not update message with new URI."
 msgstr "新しいURIでメッセージをアップデートできませんでした。"
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "ハッシュタグ追加 DB エラー: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "つぶやきを保存する際に問題が発生しました。長すぎです。"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "つぶやきを保存する際に問題が発生しました。不明なユーザです。"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "多すぎるつぶやきが速すぎます; 数分間の休みを取ってから再投稿してください。"
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4457,41 +4512,70 @@ msgstr ""
 "多すぎる重複メッセージが速すぎます; 数分間休みを取ってから再度投稿してくださ"
 "い。"
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止されています。"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "つぶやきを保存する際に問題が発生しました。"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "グループ受信箱を保存する際に問題が発生しました。"
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "返信を追加する際にデータベースエラー : %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "フォローを削除できません"
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "ようこそ %1$s、@%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "グループを作成できません。"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "グループメンバーシップをセットできません。"
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "グループメンバーシップをセットできません。"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "フォローを保存できません。"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "プロファイル設定の変更"
@@ -4533,120 +4617,190 @@ msgstr "名称未設定ページ"
 msgid "Primary site navigation"
 msgstr "プライマリサイトナビゲーション"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "ホーム"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "パーソナルプロファイルと友人のタイムライン"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "パーソナル"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "メールアドレス、アバター、パスワード、プロパティの変更"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "接続"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "アカウント"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "サービスへ接続"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "接続"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "サイト設定の変更"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "招待"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "管理者"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "友人や同僚が %s で加わるよう誘ってください。"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "ログアウト"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "招待"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "サイトからログアウト"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "ログアウト"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "アカウントを作成"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "登録"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "サイトへログイン"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "ヘルプ"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "ログイン"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "助けて!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "検索"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "ヘルプ"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "人々かテキストを検索"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "検索"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "サイトつぶやき"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "ローカルビュー"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "ページつぶやき"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "セカンダリサイトナビゲーション"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "ヘルプ"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "About"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "よくある質問"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "プライバシー"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "ソース"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "連絡先"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "バッジ"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet ソフトウェアライセンス"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4655,12 +4809,12 @@ msgstr ""
 "**%%site.name%%** は [%%site.broughtby%%](%%site.broughtbyurl%%) が提供するマ"
 "イクロブログサービスです。 "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** はマイクロブログサービスです。 "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4671,95 +4825,160 @@ msgstr ""
 "いています。 ライセンス [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)。"
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "サイト内容ライセンス"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "全て "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "ライセンス。"
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "ページ化"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "<<後"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "前>>"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "あなたはこのサイトへの変更を行うことができません。"
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "そのパネルへの変更は許可されていません。"
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() は実装されていません。"
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() は実装されていません。"
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "デザイン設定を削除できません。"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "基本サイト設定"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "サイト"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "デザイン設定"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "デザイン"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "ユーザ設定"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "ユーザ"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "アクセス設定"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "パス設定"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "セッション設定"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "セッション"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "APIリソースは読み書きアクセスが必要です、しかしあなたは読みアクセスしか持って"
 "いません。"
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4851,11 +5070,11 @@ msgstr "この添付が現れるつぶやき"
 msgid "Tags for this attachment"
 msgstr "この添付のタグ"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "パスワード変更に失敗しました"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "パスワード変更は許可されていません"
 
@@ -5006,77 +5225,87 @@ msgstr "つぶやき保存エラー。"
 msgid "Specify the name of the user to subscribe to"
 msgstr "フォローするユーザの名前を指定してください"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "そのようなユーザはいません。"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "%s をフォローしました"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "フォローをやめるユーザの名前を指定してください"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "%s のフォローをやめる"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "コマンドはまだ実装されていません。"
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "通知オフ。"
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "通知をオフできません。"
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "通知オン。"
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "通知をオンできません。"
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "ログインコマンドが無効になっています。"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr "このリンクは、かつてだけ使用可能であり、2分間だけ良いです: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "%s のフォローをやめる"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "あなたはだれにもフォローされていません。"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "あなたはこの人にフォローされています:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "誰もフォローしていません。"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "この人はあなたにフォローされている:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "あなたはどのグループのメンバーでもありません。"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "あなたはこのグループのメンバーではありません:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5090,6 +5319,7 @@ msgid ""
 "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"
@@ -5117,21 +5347,21 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "コンフィギュレーションファイルがありません。 "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "私は以下の場所でコンフィギュレーションファイルを探しました: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 "あなたは、これを修理するためにインストーラを動かしたがっているかもしれませ"
 "ん。"
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "インストーラへ。"
 
@@ -5319,23 +5549,23 @@ msgstr "ファイルのアップロードでシステムエラー"
 msgid "Not an image or corrupt file."
 msgstr "画像ではないかファイルが破損しています。"
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "サポート外の画像形式です。"
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "ファイルを紛失。"
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "不明なファイルタイプ"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5624,7 +5854,7 @@ msgstr ""
 "に引き込むプライベートメッセージを送ることができます。人々はあなただけへの"
 "メッセージを送ることができます。"
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "from"
 
@@ -5719,6 +5949,12 @@ msgstr "To"
 msgid "Available characters"
 msgstr "利用可能な文字"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "投稿"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "つぶやきを送る"
@@ -5752,52 +5988,52 @@ msgstr ""
 "すみません、あなたの位置を検索するのが予想より長くかかっています、後でもう一"
 "度試みてください"
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "北"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "S"
 msgstr "南"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 #, fuzzy
 msgid "E"
 msgstr "東"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 #, fuzzy
 msgid "W"
 msgstr "西"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "at"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr ""
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "このつぶやきへ返信"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "返信"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "つぶやきを繰り返しました"
 
@@ -5829,10 +6065,6 @@ msgstr "リモートプロファイル追加エラー"
 msgid "Duplicate notice"
 msgstr "重複したつぶやき"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "あなたはフォローが禁止されました。"
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "サブスクリプションを追加できません"
@@ -5849,6 +6081,10 @@ msgstr "返信"
 msgid "Favorites"
 msgstr "お気に入り"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "ユーザ"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "受信箱"
@@ -5938,7 +6174,7 @@ msgstr "このつぶやきを繰り返しますか?"
 msgid "Repeat this notice"
 msgstr "このつぶやきを繰り返す"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "single-user モードのためのシングルユーザが定義されていません。"
 
@@ -5958,6 +6194,10 @@ msgstr "サイト検索"
 msgid "Keyword(s)"
 msgstr "キーワード"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "検索"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "ヘルプ検索"
@@ -6009,33 +6249,14 @@ msgstr "人々は %s をフォローしました。"
 msgid "Groups %s is a member of"
 msgstr "グループ %s はメンバー"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "すでにフォローしています!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "ユーザはあなたをブロックしました。"
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "フォローできません。"
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "他の人があなたをフォローできません。"
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "フォローしていません!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "自己フォローを削除できません。"
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "招待"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "フォローを削除できません"
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "友人や同僚が %s で加わるよう誘ってください。"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6087,68 +6308,68 @@ msgstr "アバターを編集する"
 msgid "User actions"
 msgstr "利用者アクション"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "プロファイル設定編集"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "編集"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "この利用者にダイレクトメッセージを送る"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "メッセージ"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 #, fuzzy
 msgid "Moderate"
 msgstr "管理"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "数秒前"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "約 1 分前"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "約 %d 分前"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "約 1 時間前"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "約 %d 時間前"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "約 1 日前"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "約 %d 日前"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "約 1 ヵ月前"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "約 %d ヵ月前"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "約 1 年前"
 
index 7be2acfca1ff925166794f631a10eef8cebd11b8..aca8a093adfd1eae3f4e0ccb2882495f1f4fc251 100644 (file)
@@ -7,83 +7,89 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:20+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:13+0000\n"
 "Language-Team: Korean\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "수락"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "아바타 설정"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "회원가입"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "개인정보 취급방침"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "초대"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "차단하기"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "저장"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "아바타 설정"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "저장"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "그러한 태그가 없습니다."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -97,79 +103,88 @@ msgstr "그러한 태그가 없습니다."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "그러한 사용자는 없습니다."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s 와 친구들, %d 페이지"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s 및 친구들"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s 및 친구들"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "%1$s 및 %2$s에 있는 친구들의 업데이트!"
@@ -182,20 +197,20 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 메서드를 찾을 수 없습니다."
@@ -229,8 +244,9 @@ msgstr "사용자를 업데이트 할 수 없습니다."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "이용자가 프로필을 가지고 있지 않습니다."
 
@@ -255,7 +271,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -374,7 +390,7 @@ msgstr "공개 stream을 불러올 수 없습니다."
 msgid "Could not find target user."
 msgstr "어떠한 상태도 찾을 수 없습니다."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -382,62 +398,62 @@ msgstr ""
 "별명은 반드시 영소문자와 숫자로만 이루어져야 하며 스페이스의 사용이 불가 합니"
 "다."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "별명이 이미 사용중 입니다. 다른 별명을 시도해 보십시오."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "유효한 별명이 아닙니다"
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "홈페이지 주소형식이 올바르지 않습니다."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "실명이 너무 깁니다. (최대 255글자)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "설명이 너무 길어요. (최대 140글자)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "위치가 너무 깁니다. (최대 255글자)"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "유효하지 않은태그: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "별명이 이미 사용중 입니다. 다른 별명을 시도해 보십시오."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -449,16 +465,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "API 메서드를 찾을 수 없습니다."
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "당신은 이미 이 그룹의 멤버입니다."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "그룹 %s에 %s는 가입할 수 없습니다."
@@ -468,7 +484,7 @@ msgstr "그룹 %s에 %s는 가입할 수 없습니다."
 msgid "You are not a member of this group."
 msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다."
@@ -500,7 +516,7 @@ msgstr "옳지 않은 크기"
 #: 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:309
+#: 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
@@ -509,7 +525,7 @@ msgstr "옳지 않은 크기"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -544,7 +560,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -567,13 +583,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "계정"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -654,18 +670,18 @@ msgstr "지원하지 않는 그림 파일 형식입니다."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / %s의 좋아하는 글들"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s 타임라인"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,12 +697,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s 공개 타임라인"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "모두로부터의 업데이트 %s개!"
@@ -696,17 +712,17 @@ msgstr "모두로부터의 업데이트 %s개!"
 msgid "Repeated to %s"
 msgstr "%s에 답신"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "%s에 답신"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "%s 태그된 통지"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s에 있는 %1$s의 업데이트!"
@@ -723,8 +739,7 @@ msgstr "그러한 문서는 없습니다."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "별명이 없습니다."
 
@@ -736,7 +751,7 @@ msgstr "사이즈가 없습니다."
 msgid "Invalid size."
 msgstr "옳지 않은 크기"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "아바타"
@@ -753,30 +768,30 @@ msgid "User without matching profile"
 msgstr "프로필 매칭이 없는 사용자"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "아바타 설정"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "원래 설정"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "미리보기"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "삭제"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "올리기"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "자르기"
 
@@ -784,7 +799,7 @@ msgstr "자르기"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "당신의 아바타가 될 이미지영역을 지정하세요."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "파일 데이터를 잃어버렸습니다."
 
@@ -818,23 +833,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "아니오"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "이 사용자를 차단해제합니다."
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "네, 맞습니다."
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "이 사용자 차단하기"
 
@@ -842,41 +857,45 @@ msgstr "이 사용자 차단하기"
 msgid "Failed to save block information."
 msgstr "정보차단을 저장하는데 실패했습니다."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "그러한 그룹이 없습니다."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "이용자 프로필"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s 와 친구들, %d 페이지"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 #, fuzzy
 msgid "A list of the users blocked from joining this group."
 msgstr "이 그룹의 회원리스트"
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "사용자 차단 해제에 실패했습니다."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "차단해제"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "이 사용자를 차단해제합니다."
 
@@ -957,7 +976,7 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "당신의 세션토큰관련 문제가 있습니다."
 
@@ -983,12 +1002,13 @@ msgstr "이 통지를 지울 수 없습니다."
 msgid "Delete this application"
 msgstr "이 게시글 삭제하기"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "로그인하고 있지 않습니다."
@@ -1018,7 +1038,7 @@ msgstr "정말로 통지를 삭제하시겠습니까?"
 msgid "Do not delete this notice"
 msgstr "이 통지를 지울 수 없습니다."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "이 게시글 삭제하기"
 
@@ -1037,19 +1057,19 @@ msgstr "당신은 다른 사용자의 상태를 삭제하지 않아도 된다."
 msgid "Delete user"
 msgstr "삭제"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "이 게시글 삭제하기"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1160,6 +1180,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "저장"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1262,31 +1293,31 @@ msgstr "%s 그룹 편집"
 msgid "You must be logged in to create a group."
 msgstr "그룹을 만들기 위해서는 로그인해야 합니다."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "관리자만 그룹을 편집할 수 있습니다."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "다음 양식을 이용해 그룹을 편집하십시오."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "설명이 너무 길어요. (최대 140글자)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "그룹을 업데이트 할 수 없습니다."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "좋아하는 게시글을 생성할 수 없습니다."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "옵션들이 저장되었습니다."
 
@@ -1635,7 +1666,7 @@ msgstr "회원이 당신을 차단해왔습니다."
 msgid "User is not a member of group."
 msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "사용자를 차단합니다."
@@ -1672,93 +1703,93 @@ msgstr "ID가 없습니다."
 msgid "You must be logged in to edit a group."
 msgstr "그룹을 만들기 위해서는 로그인해야 합니다."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "그룹"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "사용자를 업데이트 할 수 없습니다."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "싱크설정이 저장되었습니다."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "그룹 로고"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, fuzzy, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "당신그룹의 로고 이미지를 업로드할 수 있습니다."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "프로필 매칭이 없는 사용자"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 #, fuzzy
 msgid "Pick a square area of the image to be the logo."
 msgstr "당신의 아바타가 될 이미지영역을 지정하세요."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "로고를 업데이트했습니다."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "로고 업데이트에 실패했습니다."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s 그룹 회원"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%s 그룹 회원, %d페이지"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "이 그룹의 회원리스트"
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "관리자"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "차단하기"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 #, fuzzy
 msgid "Make user an admin of the group"
 msgstr "관리자만 그룹을 편집할 수 있습니다."
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 #, fuzzy
 msgid "Make Admin"
 msgstr "관리자"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s에 있는 %1$s의 업데이트!"
@@ -2012,16 +2043,19 @@ msgstr "개인적인 메시지"
 msgid "Optionally add a personal message to the invitation."
 msgstr "초대장에 메시지 첨부하기."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "보내기"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s님이 귀하를 %2$s에 초대하였습니다."
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2077,7 +2111,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "그룹가입을 위해서는 로그인이 필요합니다."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "별명이 없습니다."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s 는 그룹 %s에 가입했습니다."
@@ -2086,11 +2125,11 @@ msgstr "%s 는 그룹 %s에 가입했습니다."
 msgid "You must be logged in to leave a group."
 msgstr "그룹을 떠나기 위해서는 로그인해야 합니다."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s가 그룹%s를 떠났습니다."
@@ -2108,8 +2147,7 @@ msgstr "틀린 계정 또는 비밀 번호"
 msgid "Error setting user. You are probably not authorized."
 msgstr "인증이 되지 않았습니다."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "로그인"
 
@@ -2365,8 +2403,8 @@ msgstr "연결"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "지원하는 형식의 데이터가 아닙니다."
 
@@ -2512,7 +2550,7 @@ msgstr "새 비밀번호를 저장 할 수 없습니다."
 msgid "Password saved."
 msgstr "비밀 번호 저장"
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2545,7 +2583,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "초대"
@@ -2729,7 +2766,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64자 사이에 영소문자, 숫자로만 씁니다. 기호나 공백을 쓰면 안 됩니다."
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "실명"
@@ -2758,7 +2795,7 @@ msgid "Bio"
 msgstr "자기소개"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2822,24 +2859,25 @@ msgstr "언어가 너무 깁니다. (최대 50글자)"
 msgid "Invalid tag: \"%s\""
 msgstr "유효하지 않은태그: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "자동구독에 사용자를 업데이트 할 수 없습니다."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "태그를 저장할 수 없습니다."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "프로필을 저장 할 수 없습니다."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "태그를 저장할 수 없습니다."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "설정 저장"
 
@@ -2852,48 +2890,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "공개 stream을 불러올 수 없습니다."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "공개 타임라인, %d 페이지"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "퍼블릭 타임라인"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "퍼블릭 스트림 피드"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "퍼블릭 스트림 피드"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "퍼블릭 스트림 피드"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2902,7 +2940,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3075,8 +3113,7 @@ msgstr "확인 코드 오류"
 msgid "Registration successful"
 msgstr "회원 가입이 성공적입니다."
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "회원가입"
 
@@ -3222,7 +3259,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "다른 마이크로블로깅 서비스의 귀하의 프로필 URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "구독"
 
@@ -3265,7 +3302,7 @@ msgstr "라이선스에 동의하지 않는다면 등록할 수 없습니다."
 msgid "You already repeated that notice."
 msgstr "당신은 이미 이 사용자를 차단하고 있습니다."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "생성"
@@ -3275,47 +3312,47 @@ msgstr "생성"
 msgid "Repeated!"
 msgstr "생성"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "%s에 답신"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "%2$s에서 %1$s까지 메시지"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "%s의 통지 피드"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "%s의 통지 피드"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "%s의 통지 피드"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3343,7 +3380,6 @@ msgid "User is already sandboxed."
 msgstr "회원이 당신을 차단해왔습니다."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3368,7 +3404,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "아바타 설정"
@@ -3403,7 +3439,7 @@ msgstr "페이지수"
 msgid "Description"
 msgstr "설명"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "통계"
@@ -3465,35 +3501,35 @@ msgstr "%s 님의 좋아하는 글들"
 msgid "Could not retrieve favorite notices."
 msgstr "좋아하는 게시글을 복구할 수 없습니다."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "%s의 친구들을 위한 피드"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3501,7 +3537,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3515,68 +3551,68 @@ msgstr "%s 그룹"
 msgid "%1$s group, page %2$d"
 msgstr "%s 그룹 회원, %d페이지"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "그룹 프로필"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "설명"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "그룹 행동"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s 그룹을 위한 공지피드"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s의 보낸쪽지함"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "회원"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(없습니다.)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "모든 회원"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "생성"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3586,7 +3622,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3597,7 +3633,7 @@ msgstr ""
 "**%s** 는 %%%%site.name%%%% [마이크로블로깅)(http://en.wikipedia.org/wiki/"
 "Micro-blogging)의 사용자 그룹입니다. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 #, fuzzy
 msgid "Admins"
 msgstr "관리자"
@@ -3963,15 +3999,26 @@ msgstr "코드가 입력 되지 않았습니다."
 msgid "You are not subscribed to that profile."
 msgstr "당신은 이 프로필에 구독되지 않고있습니다."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "구독을 저장할 수 없습니다."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "로컬 사용자 아닙니다."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "그러한 통지는 없습니다."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "당신은 이 프로필에 구독되지 않고있습니다."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "구독하였습니다."
 
@@ -4031,7 +4078,7 @@ msgstr "귀하의 통지를 받고 있는 사람"
 msgid "These are the people whose notices %s listens to."
 msgstr "%s님이 받고 있는 통지의 사람"
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4041,35 +4088,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s 는 지금 듣고 있습니다."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "이용자 셀프 테크 %s - %d 페이지"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "%s의 통지 피드"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "%s의 통지 피드"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "%s의 통지 피드"
@@ -4123,7 +4170,7 @@ msgstr "당신의 구독자나 구독하는 사람에 태깅을 위해 이 양
 msgid "No such tag."
 msgstr "그러한 태그가 없습니다."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API 메서드를 구성중 입니다."
 
@@ -4156,75 +4203,77 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "이용자"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "프로필"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "새 사용자를 초대"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "모든 예약 구독"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "나에게 구독하는 사람에게 자동 구독 신청"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "초대권을 보냈습니다"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "초대권을 보냈습니다"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4410,7 +4459,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "개인적인"
@@ -4451,6 +4500,11 @@ msgstr "그룹을 업데이트 할 수 없습니다."
 msgid "Group leave failed."
 msgstr "그룹 프로필"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "그룹을 업데이트 할 수 없습니다."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4469,28 +4523,28 @@ msgstr "메시지를 삽입할 수 없습니다."
 msgid "Could not update message with new URI."
 msgstr "새 URI와 함께 메시지를 업데이트할 수 없습니다."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "해쉬테그를 추가 할 때에 데이타베이스 에러 : %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "게시글 저장문제. 알려지지않은 회원"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4499,42 +4553,74 @@ msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었습니다."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "답신을 추가 할 때에 데이타베이스 에러 : %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "구독하고 있지 않습니다!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "예약 구독을 삭제 할 수 없습니다."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "예약 구독을 삭제 할 수 없습니다."
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%2$s에서 %1$s까지 메시지"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "새 그룹을 만들 수 없습니다."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "그룹 맴버십을 세팅할 수 없습니다."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "그룹 맴버십을 세팅할 수 없습니다."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "구독을 저장할 수 없습니다."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "프로필 세팅 바꾸기"
@@ -4577,123 +4663,191 @@ msgstr "제목없는 페이지"
 msgid "Primary site navigation"
 msgstr "주 사이트 네비게이션"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "홈"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "개인 프로필과 친구 타임라인"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "개인적인"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "당신의 이메일, 아바타, 비밀 번호, 프로필을 변경하세요."
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "연결"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "계정"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "서버에 재접속 할 수 없습니다 : %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "연결"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "주 사이트 네비게이션"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "초대"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "관리자"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "%s에 친구를 가입시키기 위해 친구와 동료를 초대합니다."
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "로그아웃"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "초대"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "이 사이트로부터 로그아웃"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "로그아웃"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "계정 만들기"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "회원가입"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "이 사이트 로그인"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "도움말"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "로그인"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "도움이 필요해!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "검색"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "도움말"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "프로필이나 텍스트 검색"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "검색"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "사이트 공지"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "로컬 뷰"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "페이지 공지"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "보조 사이트 네비게이션"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "도움말"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "정보"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "자주 묻는 질문"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "개인정보 취급방침"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "소스 코드"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "연락하기"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "찔러 보기"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "라코니카 소프트웨어 라이선스"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4702,12 +4856,12 @@ msgstr ""
 "**%%site.name%%** 는 [%%site.broughtby%%](%%site.broughtbyurl%%)가 제공하는 "
 "마이크로블로깅서비스입니다."
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** 는 마이크로블로깅서비스입니다."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4718,105 +4872,169 @@ msgstr ""
 "을 사용합니다. StatusNet는 [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html) 라이선스에 따라 사용할 수 있습니다."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "라코니카 소프트웨어 라이선스"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "모든 것"
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "라이선스"
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "페이지수"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "뒷 페이지"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "앞 페이지"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "당신은 이 사용자에게 메시지를 보낼 수 없습니다."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "가입이 허용되지 않습니다."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "명령이 아직 실행되지 않았습니다."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "명령이 아직 실행되지 않았습니다."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "트위터 환경설정을 저장할 수 없습니다."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "이메일 주소 확인서"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "초대"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS 인증"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "개인적인"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS 인증"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "이용자"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS 인증"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS 인증"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS 인증"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "개인적인"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4912,12 +5130,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "비밀번호 변경"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "비밀번호 변경"
@@ -5071,80 +5289,89 @@ msgstr "통지를 저장하는데 문제가 발생했습니다."
 msgid "Specify the name of the user to subscribe to"
 msgstr "구독하려는 사용자의 이름을 지정하십시오."
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "그러한 사용자는 없습니다."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "%s에게 구독되었습니다."
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "구독을 해제하려는 사용자의 이름을 지정하십시오."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "%s에서 구독을 해제했습니다."
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "명령이 아직 실행되지 않았습니다."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "알림끄기."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "알림을 끌 수 없습니다."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "알림이 켜졌습니다."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "알림을 켤 수 없습니다."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "%s에서 구독을 해제했습니다."
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "당신은 이 프로필에 구독되지 않고있습니다."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "당신은 다음 사용자를 이미 구독하고 있습니다."
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "다른 사람을 구독 하실 수 없습니다."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "다른 사람을 구독 하실 수 없습니다."
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "당신은 해당 그룹의 멤버가 아닙니다."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5158,6 +5385,7 @@ msgid ""
 "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"
@@ -5185,20 +5413,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "확인 코드가 없습니다."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "이 사이트 로그인"
@@ -5391,23 +5619,23 @@ msgstr "파일을 올리는데 시스템 오류 발생"
 msgid "Not an image or corrupt file."
 msgstr "그림 파일이 아니거나 손상된 파일 입니다."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "지원하지 않는 그림 파일 형식입니다."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "파일을 잃어버렸습니다."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "알 수 없는 종류의 파일입니다"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5619,7 +5847,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr "다음에서:"
@@ -5710,6 +5938,12 @@ msgstr "에게"
 msgid "Available characters"
 msgstr "사용 가능한 글자"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "보내기"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "게시글 보내기"
@@ -5743,51 +5977,51 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "아니오"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "내용이 없습니다!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "생성"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "이 게시글에 대해 답장하기"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "답장하기"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "게시글이 등록되었습니다."
@@ -5821,11 +6055,6 @@ msgstr "리모트 프로필 추가 오류"
 msgid "Duplicate notice"
 msgstr "통지 삭제"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "이 회원은 구독으로부터 당신을 차단해왔다."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "예약 구독을 추가 할 수 없습니다."
@@ -5842,6 +6071,10 @@ msgstr "답신"
 msgid "Favorites"
 msgstr "좋아하는 글들"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "이용자"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "받은 쪽지함"
@@ -5936,7 +6169,7 @@ msgstr "이 게시글에 대해 답장하기"
 msgid "Repeat this notice"
 msgstr "이 게시글에 대해 답장하기"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5959,6 +6192,10 @@ msgstr "검색"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "검색"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6013,35 +6250,14 @@ msgstr "%s에 의해 구독되는 사람들"
 msgid "Groups %s is a member of"
 msgstr "%s 그룹들은  의 멤버입니다."
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "회원이 당신을 차단해왔습니다."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "구독 하실 수 없습니다."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "다른 사람을 구독 하실 수 없습니다."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "구독하고 있지 않습니다!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "예약 구독을 삭제 할 수 없습니다."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "초대"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "예약 구독을 삭제 할 수 없습니다."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "%s에 친구를 가입시키기 위해 친구와 동료를 초대합니다."
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6096,68 +6312,68 @@ msgstr "아바타"
 msgid "User actions"
 msgstr "사용자 동작"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "프로필 세팅"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "이 회원에게 직접 메시지를 보냅니다."
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "메시지"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "몇 초 전"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "1분 전"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d분 전"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "1시간 전"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d시간 전"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "하루 전"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "%d일 전"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "1달 전"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "%d달 전"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "1년 전"
 
index 92209e72ea0a45772c5e0db955cfea57bfd2118e..b80b0c905ea0f480c4802d5345b8f7de1caa8816 100644 (file)
@@ -9,77 +9,84 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:23+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:16+0000\n"
 "Language-Team: Macedonian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Пристап"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Нагодувања за пристап на веб-страницата"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Регистрација"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Приватен"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "Само со покана"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Приватен"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Регистрирање само со покана."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Затворен"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Само со покана"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Оневозможи нови регистрации."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Зачувај"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Затворен"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Зачувај нагодувања на пристап"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зачувај"
+
+#. 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 "Нема таква страница"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,53 +100,60 @@ msgstr "Нема таква страница"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Нема таков корисник."
 
-#: actions/all.php:84
+#. 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 и пријателите, стр. %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s и пријатели"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Канал со пријатели на %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Канал со пријатели на %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Канал за пријатели на %S (Atom)"
 
-#: actions/all.php:127
+#. 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 ""
 "Ова е историјата за %s и пријателите, но досега никој нема објавено ништо."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -148,7 +162,8 @@ msgstr ""
 "Пробајте да се претплатите на повеќе луѓе, [зачленете се во група](%%action."
 "groups%%) или објавете нешто самите."
 
-#: actions/all.php:134
+#. 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 "
@@ -158,7 +173,7 @@ msgstr ""
 "на корисникот или да [објавите нешто што сакате тој да го прочита](%%%%"
 "action.newnotice%%%%?status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -168,12 +183,13 @@ msgstr ""
 "го подбуцнете корисникот %s или да објавите забелешка што сакате тој да ја "
 "прочита."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Вие и пријателите"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Подновувања од %1$s и пријатели на %2$s!"
@@ -186,20 +202,20 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API методот не е пронајден."
 
@@ -233,8 +249,9 @@ msgstr "Не можев да го подновам корисникот."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Корисникот нема профил."
 
@@ -260,7 +277,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -373,68 +390,68 @@ msgstr "Не можев да го утврдам целниот корисник
 msgid "Could not find target user."
 msgstr "Не можев да го пронајдам целниот корисник."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "Тој прекар е во употреба. Одберете друг."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Неправилен прекар."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Главната страница не е важечка URL-адреса."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Целото име е предолго (максимум 255 знаци)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Описот е предолг (дозволено е највеќе %d знаци)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Локацијата е предолга (максимумот е 255 знаци)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Премногу алијаси! Дозволено е највеќе %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Неважечки алијас: „%s“"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Алијасот „%s“ е зафатен. Одберете друг."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Алијасот не може да биде ист како прекарот."
@@ -445,15 +462,15 @@ msgstr "Алијасот не може да биде ист како прека
 msgid "Group not found!"
 msgstr "Групата не е пронајдена!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Веќе членувате во таа група."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Блокирани сте од таа група од администраторот."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Не можам да го зачленам корисникот %1$s во групата 2$s."
@@ -462,7 +479,7 @@ msgstr "Не можам да го зачленам корисникот %1$s в
 msgid "You are not a member of this group."
 msgstr "Не членувате во оваа група."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Не можев да го отстранам корисникот %1$s од групата %2$s."
@@ -493,7 +510,7 @@ msgstr "Погрешен жетон."
 #: 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:309
+#: 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
@@ -502,7 +519,7 @@ msgstr "Погрешен жетон."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -536,7 +553,7 @@ msgstr "Жетонот на барањето %s е одбиен и поништ
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -562,13 +579,13 @@ msgstr ""
 "<strong>%3$s</strong> податоците за Вашата %4$s сметка. Треба да дозволувате "
 "пристап до Вашата %4$s сметка само на трети страни на кои им верувате."
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Сметка"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -646,18 +663,18 @@ msgstr "Неподдржан формат."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Омилени од %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Историја на %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -673,12 +690,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Јавна историја на %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s подновуввања од сите!"
@@ -688,17 +705,17 @@ msgstr "%s подновуввања од сите!"
 msgid "Repeated to %s"
 msgstr "Повторено за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Повторувања на %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Забелешки означени со %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Подновувањата се означени со %1$s на %2$s!"
@@ -714,8 +731,7 @@ msgstr "Нема таков прилог."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Нема прекар."
 
@@ -727,7 +743,7 @@ msgstr "Нема големина."
 msgid "Invalid size."
 msgstr "Погрешна големина."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Аватар"
@@ -746,30 +762,30 @@ msgid "User without matching profile"
 msgstr "Корисник без соодветен профил"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Нагодувања на аватарот"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Оригинал"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Преглед"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Бриши"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Подигни"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Отсечи"
 
@@ -777,7 +793,7 @@ msgstr "Отсечи"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Одберете квадратна површина од сликата за аватар"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Податоците за податотеката се изгубени."
 
@@ -813,22 +829,22 @@ msgstr ""
 "од корисникот."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Не"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Не го блокирај корисников"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Да"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Блокирај го корисников"
 
@@ -836,39 +852,43 @@ msgstr "Блокирај го корисников"
 msgid "Failed to save block information."
 msgstr "Не можев да ги снимам инофрмациите за блокот."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Нема таква група."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s блокирани профили"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s блокирани профили, стр. %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Листана корисниците блокирани од придружување во оваа група."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Одблокирај корисник од група"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Одблокирај"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Одблокирај го овој корсник"
 
@@ -943,7 +963,7 @@ msgstr "Не сте сопственик на овој програм."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Се појави проблем со Вашиот сесиски жетон."
 
@@ -969,12 +989,13 @@ msgstr "Не го бриши овој програм"
 msgid "Delete this application"
 msgstr "Избриши го програмов"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Не сте најавени."
@@ -1003,7 +1024,7 @@ msgstr "Дали сте сигурни дека сакате да ја избр
 msgid "Do not delete this notice"
 msgstr "Не ја бриши оваа забелешка"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Бриши ја оваа забелешка"
 
@@ -1019,7 +1040,7 @@ msgstr "Може да бришете само локални корисници.
 msgid "Delete user"
 msgstr "Бриши корисник"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1027,12 +1048,12 @@ msgstr ""
 "Дали се сигурни дека сакате да го избришете овој корисник? Ова воедно ќе ги "
 "избрише сите податоци за корисникот од базата, без да може да се вратат."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Избриши овој корисник"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Изглед"
 
@@ -1135,6 +1156,17 @@ msgstr "Врати основно-зададени нагодувања"
 msgid "Reset back to default"
 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/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 "Зачувај"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Зачувај изглед"
@@ -1226,29 +1258,29 @@ msgstr "Уреди ја групата %s"
 msgid "You must be logged in to create a group."
 msgstr "Мора да сте најавени за да можете да создавате групи."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Мора да сте администратор за да можете да ја уредите групата."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "ОБразецов служи за уредување на групата."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "описот е предолг (максимум  %d знаци)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Не можев да ја подновам групата."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Не можеше да се создадат алијаси."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Нагодувањата се зачувани."
 
@@ -1591,7 +1623,7 @@ msgstr "Корисникот е веќе блокиран од оваа груп
 msgid "User is not a member of group."
 msgstr "Корисникот не членува во групата."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Блокирај корисник од група"
 
@@ -1628,11 +1660,11 @@ msgstr "Нема ID."
 msgid "You must be logged in to edit a group."
 msgstr "Мора да сте најавени за да можете да уредувате група."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Изглед на групата"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1640,20 +1672,20 @@ msgstr ""
 "Прилагодете го изгледот на Вашата група со позадинска слика и палета од бои "
 "по Ваш избор."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Не можев да го подновам Вашиот изглед."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Нагодувањата се зачувани."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Лого на групата"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1661,57 +1693,57 @@ msgstr ""
 "Можете да подигнете слика за логото на Вашата група. Максималната дозволена "
 "големина на податотеката е %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Корисник без соодветен профил."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Одберете квадратен простор на сликата за лого."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Логото е подновено."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Подновата на логото не успеа."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Членови на групата %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Членови на групата %1$s, стр. %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Листа на корисниците на овааг група."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Администратор"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Блокирај"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Направи го корисникот администратор на групата"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Направи го/ја администратор"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Направи го корисникот администратор"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Подновувања од членови на %1$s на %2$s!"
@@ -1977,16 +2009,19 @@ msgstr "Лична порака"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Можете да додадете и лична порака во поканата."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Испрати"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s ве покани да се придружите на %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2047,7 +2082,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Мора да сте најавени за да можете да се зачлените во група."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Нема прекар или ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s се зачлени во групата %2$s"
@@ -2056,11 +2095,11 @@ msgstr "%1$s се зачлени во групата %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Мора да сте најавени за да можете да ја напуштите групата."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Не членувате во таа група."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s ја напушти групата %2$s"
@@ -2077,8 +2116,7 @@ msgstr "Неточно корисничко име или лозинка"
 msgid "Error setting user. You are probably not authorized."
 msgstr "Грешка при поставувањето на корисникот. Веројатно не се заверени."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Најава"
 
@@ -2335,8 +2373,8 @@ msgstr "тип на содржини "
 msgid "Only "
 msgstr "Само "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Ова не е поддржан формат на податотека."
 
@@ -2477,7 +2515,7 @@ msgstr "Не можам да ја зачувам новата лозинка."
 msgid "Password saved."
 msgstr "Лозинката е зачувана."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Патеки"
 
@@ -2510,7 +2548,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Неважечки SSL-сервер. Дозволени се најмногу  255 знаци"
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Веб-страница"
 
@@ -2685,7 +2722,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 мали букви или бројки. Без интерпукциски знаци и празни места."
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Цело име"
@@ -2713,7 +2750,7 @@ msgid "Bio"
 msgstr "Биографија"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2781,23 +2818,24 @@ msgstr "Јазикот е предлог (највеќе до 50 знаци)."
 msgid "Invalid tag: \"%s\""
 msgstr "Неважечка ознака: „%s“"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Не можев да го подновам корисникот за автопретплата."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Не можев да ги зачувам нагодувањата за локација"
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Не можам да го зачувам профилот."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Не можев да ги зачувам ознаките."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Нагодувањата се зачувани"
 
@@ -2810,28 +2848,28 @@ msgstr "Надминато е ограничувањето на страница
 msgid "Could not retrieve public stream."
 msgstr "Не можам да го вратам јавниот поток."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Јавна историја, стр. %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Јавна историја"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Канал на јавниот поток (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Канал на јавниот поток (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Канал на јавниот поток (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2839,11 +2877,11 @@ msgid ""
 msgstr ""
 "Ова е јавната историја за %%site.name%%, но досега никој ништо нема објавено."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Создајте ја првата забелешка!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2851,7 +2889,7 @@ msgstr ""
 "Зошто не [регистрирате сметка](%%action.register%%) и станете првиот "
 "објавувач!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2865,7 +2903,7 @@ msgstr ""
 "споделувате забелешки за себе со приајтелите, семејството и колегите! "
 "([Прочитајте повеќе](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3045,8 +3083,7 @@ msgstr "Жалиме, неважечки код за поканата."
 msgid "Registration successful"
 msgstr "Регистрацијата е успешна"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Регистрирај се"
 
@@ -3196,7 +3233,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL на Вашиот профил на друга компатибилна служба за микроблогирање."
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Претплати се"
 
@@ -3234,7 +3271,7 @@ msgstr "Не можете да повторувате сопствена заб
 msgid "You already repeated that notice."
 msgstr "Веќе ја имате повторено таа забелешка."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3242,33 +3279,33 @@ msgstr "Повторено"
 msgid "Repeated!"
 msgstr "Повторено!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Одговори испратени до %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Одговори на %1$s, стр. %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Канал со одговори за %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Канал со одговори за %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Канал со одговори за %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3277,7 +3314,7 @@ msgstr ""
 "Ова е историјата на која се прикажани одговорите на %1$s, но %2$s сè уште "
 "нема добиено порака од некој што сака да ја прочита."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3286,7 +3323,7 @@ msgstr ""
 "Можете да започнувате разговори со други корисници, да се претплаќате на "
 "други луѓе или да [се зачленувате во групи](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3313,7 +3350,6 @@ msgid "User is already sandboxed."
 msgstr "Корисникот е веќе во песочен режим."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Сесии"
 
@@ -3338,7 +3374,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Вклучи извод од поправка на грешки за сесии."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Зачувај нагодувања на веб-страницата"
 
@@ -3368,7 +3404,7 @@ msgstr "Организација"
 msgid "Description"
 msgstr "Опис"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Статистики"
@@ -3433,22 +3469,22 @@ msgstr "Омилени забелешки на %1$s, стр. %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Не можев да ги вратам омилените забелешки."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Канал за омилени забелешки на %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Канал за омилени забелешки на %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Канал за омилени забелешки на %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3457,7 +3493,7 @@ msgstr ""
 "омилена забелешка веднаш до самата забелешката што Ви се допаѓа за да ја "
 "обележите за подоцна, или за да ѝ дадете на важност."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3466,7 +3502,7 @@ msgstr ""
 "%s сè уште нема додадено забелешки како омилени. Објавете нешто интересно, "
 "што корисникот би го обележал како омилено :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3477,7 +3513,7 @@ msgstr ""
 "%%action.register%%%%) и потоа објавите нешто интересно што корисникот би го "
 "додал како омилено :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Ова е начин да го споделите она што Ви се допаѓа."
 
@@ -3491,67 +3527,67 @@ msgstr "Група %s"
 msgid "%1$s group, page %2$d"
 msgstr "Група %1$s, стр. %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Профил на група"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Забелешка"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Алијаси"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Групни дејства"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Канал со забелешки за групата %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Канал со забелешки за групата %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Канал со забелешки за групата%s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF за групата %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Членови"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Нема)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Сите членови"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Создадено"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3567,7 +3603,7 @@ msgstr ""
 "се](%%%%action.register%%%%) за да станете дел од оваа група и многу повеќе! "
 "([Прочитајте повеќе](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3580,7 +3616,7 @@ msgstr ""
 "слободната програмска алатка [StatusNet](http://status.net/). Нејзините "
 "членови си разменуваат кратки пораки за нивниот живот и интереси. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Администратори"
 
@@ -3951,15 +3987,25 @@ msgstr "Нема внесено код"
 msgid "You are not subscribed to that profile."
 msgstr "Не сте претплатени на тој профил."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Не можев да ја зачувам претплатата."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Не е локален корисник."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Ова дејство прифаќа само POST-барања"
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Нема таков профил."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"Не можете да се претплатите на OMB 0.1 оддалечен профил со ова дејство."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Претплатено"
 
@@ -4023,7 +4069,7 @@ msgstr "Ова се луѓето чии забелешки ги следите."
 msgid "These are the people whose notices %s listens to."
 msgstr "Ова се луѓето чии забелешки ги следи %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4038,35 +4084,35 @@ msgstr ""
 "(%%action.featured%%). Ако сте [корисник на Twitter](%%action.twittersettings"
 "%%), тука можете автоматски да се претплатите на луѓе кои таму ги следите."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s не следи никого."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "СМС"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Забелешки означени со %1$s, стр. %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Канал со забелешки за ознаката %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Канал со забелешки за ознаката %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Канал со забелешки за ознаката %s (Atom)"
@@ -4120,7 +4166,7 @@ msgstr "Со овој образец додавајте ознаки во Ваш
 msgid "No such tag."
 msgstr "Нема таква ознака."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-методот е во изработка."
 
@@ -4152,70 +4198,72 @@ msgstr ""
 "Лиценцата на потокот на следачот „%1$s“ не е компатибилна со лиценцата на "
 "веб-страницата „%2$s“."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Корисник"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Кориснички нагодувања за оваа StatusNet веб-страница."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Неважечко ограничување за биографијата. Мора да е бројчено."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "НЕважечки текст за добредојде. Дозволени се највеќе 255 знаци."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Неважечки опис по основно: „%1$s“ не е корисник."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Профил"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Ограничување за биографијата"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Максимална големина на профилната биографија во знаци."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Нови корисници"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Добредојде за нов корисник"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Текст за добредојде на нови корисници (највеќе до 255 знаци)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Основно-зададена претплата"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Автоматски претплатувај нови корисници на овој корисник."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Покани"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Поканите се овозможени"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Дали да им е дозволено на корисниците да канат други корисници."
 
@@ -4413,7 +4461,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Приклучоци"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Верзија"
 
@@ -4453,6 +4501,10 @@ msgstr "Не е дел од групата."
 msgid "Group leave failed."
 msgstr "Напуштањето на групата не успеа."
 
+#: 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"
@@ -4470,27 +4522,27 @@ msgstr "Не можев да ја испратам пораката."
 msgid "Could not update message with new URI."
 msgstr "Не можев да ја подновам пораката со нов URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Грешка во базата на податоци при вметнувањето на хеш-ознака: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Проблем со зачувувањето на белешката. Премногу долго."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблем со зачувувањето на белешката. Непознат корисник."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Премногу забелњшки за прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4498,41 +4550,69 @@ msgstr ""
 "Премногу дуплирани пораки во прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Забрането Ви е да објавувате забелешки на оваа веб-страница."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Проблем во зачувувањето на белешката."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Проблем при зачувувањето на групното приемно сандаче."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Одговор од внесот во базата: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Не сте претплатени!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Не можам да ја избришам самопретплатата."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Претплата не може да се избрише."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добредојдовте на %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Не можев да ја создадам групата."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Не можев да поставам URI на групата."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Не можев да назначам членство во групата."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Не можев да ги зачувам информациите за локалните групи."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Смени профилни нагодувања"
@@ -4574,120 +4654,190 @@ msgstr "Страница без наслов"
 msgid "Primary site navigation"
 msgstr "Главна навигација"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Дома"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Личен профил и историја на пријатели"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Личен"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Промена на е-пошта, аватар, лозинка, профил"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Поврзи се"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Сметка"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Поврзи се со услуги"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Поврзи се"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Промена на конфигурацијата на веб-страницата"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Покани"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Администратор"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Поканете пријатели и колеги да Ви се придружат на %s"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Одјави се"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Покани"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Одјава"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Одјави се"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Создај сметка"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Регистрирај се"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Најава"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Помош"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Најава"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Напомош!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Барај"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Помош"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Пребарајте луѓе или текст"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Барај"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Напомена за веб-страницата"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Локални прегледи"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Напомена за страницата"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Споредна навигација"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Помош"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "За"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "ЧПП"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Услови"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Приватност"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Изворен код"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Значка"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Лиценца на програмот StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4696,12 +4846,12 @@ msgstr ""
 "**%%site.name%%** е сервис за микроблогирање што ви го овозможува [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** е сервис за микроблогирање."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4712,99 +4862,164 @@ msgstr ""
 "верзија %s, достапен пд [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Лиценца на содржините на веб-страницата"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Содржината и податоците на %1$s се лични и доверливи."
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Авторските права на содржината и податоците се во сопственост на %1$s. Сите "
 "права задржани."
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторските права на содржината и податоците им припаѓаат на учесниците. Сите "
 "права задржани."
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Сите "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "лиценца."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Прелом на страници"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "По"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Пред"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Сè уште не е поддржана обработката на оддалечена содржина."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Сè уште не е поддржана обработката на XML содржина."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Сè уште не е достапна обработката на вметната Base64 содржина."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Не можете да ја менувате оваа веб-страница."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Менувањето на тој алатник не е дозволено."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() не е имплементирано."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не е имплементирано."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Не можам да ги избришам нагодувањата за изглед."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Основни нагодувања на веб-страницата"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Веб-страница"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Конфигурација на изгледот"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Изглед"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Конфигурација на корисник"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Корисник"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Конфигурација на пристапот"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Конфигурација на патеки"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Конфигурација на сесиите"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Сесии"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "API-ресурсот бара да може и да чита и да запишува, а вие можете само да "
 "читате."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr "Неуспешен обид за API-заверка, прекар = %1$s, прокси = %2$s, IP = %3$s"
@@ -4895,11 +5110,11 @@ msgstr "Забелешки кадешто се јавува овој прило
 msgid "Tags for this attachment"
 msgstr "Ознаки за овој прилог"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Менувањето на лозинката не успеа"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Менувањето на лозинка не е дозволено"
 
@@ -5053,80 +5268,89 @@ msgstr "Грешка при зачувувањето на белешката."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Назначете го името на корисникот на којшто сакате да се претплатите"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Нема таков корисник"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Претплатено на %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Назначете го името на корисникот од кого откажувате претплата."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Претплатата на %s е откажана"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Наредбата сè уште не е имплементирана."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Известувањето е исклучено."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Не можам да исклучам известување."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Известувањето е вклучено."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Не можам да вклучам известување."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Наредбата за најава е оневозможена"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr "Оваа врска може да се употреби само еднаш, и трае само 2 минути: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Откажана претплата на  %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Не сте претплатени никому."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Не ни го испративте тој профил."
 msgstr[1] "Не ни го испративте тој профил."
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Никој не е претплатен на Вас."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Оддалечена претплата"
 msgstr[1] "Оддалечена претплата"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Не членувате во ниедна група."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Не ни го испративте тој профил."
 msgstr[1] "Не ни го испративте тој профил."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5140,6 +5364,7 @@ msgid ""
 "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"
@@ -5204,19 +5429,19 @@ msgstr ""
 "tracks - сè уште не е имплементирано.\n"
 "tracking - сè уште не е имплементирано.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Нема пронајдено конфигурациска податотека. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Побарав конфигурациони податотеки на следниве места: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Препорачуваме да го пуштите инсталатерот за да го поправите ова."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Оди на инсталаторот."
 
@@ -5406,23 +5631,23 @@ msgstr "Системска грешка при подигањето на под
 msgid "Not an image or corrupt file."
 msgstr "Не е слика или податотеката е пореметена."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Неподдржан фомрат на слики."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Податотеката е изгубена."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Непознат тип на податотека"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "МБ"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "кб"
 
@@ -5714,7 +5939,7 @@ msgstr ""
 "впуштите во разговор со други корисници. Луѓето можат да ви испраќаат пораки "
 "што ќе можете да ги видите само Вие."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "од"
 
@@ -5809,6 +6034,11 @@ msgstr "За"
 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 "Испрати забелешка"
@@ -5842,48 +6072,48 @@ msgstr ""
 "Жалиме, но добивањето на Вашата местоположба трае подолго од очекуваното. "
 "Обидете се подоцна."
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "С"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "Ј"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "И"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "З"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "во"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "во контекст"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Повторено од"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Одговори на забелешкава"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Одговор"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Забелешката е повторена"
 
@@ -5915,10 +6145,6 @@ msgstr "Грешка во внесувањето на оддалечениот 
 msgid "Duplicate notice"
 msgstr "Дуплирај забелешка"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Блокирани сте од претплаќање."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Не може да се внесе нова претплата."
@@ -5935,6 +6161,10 @@ msgstr "Одговори"
 msgid "Favorites"
 msgstr "Омилени"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Корисник"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Примени"
@@ -6024,7 +6254,7 @@ msgstr "Да ја повторам белешкава?"
 msgid "Repeat this notice"
 msgstr "Повтори ја забелешкава"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Не е зададен корисник за еднокорисничкиот режим."
 
@@ -6044,6 +6274,10 @@ msgstr "Пребарај по веб-страницата"
 msgid "Keyword(s)"
 msgstr "Клучен збор"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Барај"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Помош со пребарување"
@@ -6095,34 +6329,14 @@ msgstr "Луѓе претплатени на %s"
 msgid "Groups %s is a member of"
 msgstr "Групи кадешто членува %s"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Веќе претплатено!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Корисникот Ве има блокирано."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Претплатата е неуспешна."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Не можев да прептлатам друг корисник на Вас."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Не сте претплатени!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Не можам да ја избришам самопретплатата."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Покани"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Претплата не може да се избрише."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Поканете пријатели и колеги да Ви се придружат на %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6174,67 +6388,67 @@ msgstr "Уреди аватар"
 msgid "User actions"
 msgstr "Кориснички дејства"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Уреди нагодувања на профилот"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Уреди"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Испрати му директна порака на корисников"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Порака"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Модерирај"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "пред неколку секунди"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "пред една минута"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "пред %d минути"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "пред еден час"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "пред %d часа"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "пред еден ден"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "пред %d денови"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "пред еден месец"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "пред %d месеца"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "пред една година"
 
index ab74ad1dce5ad6a01cce9a41fe2a89ca6495502a..a3e64e0cb773b1c21e7ce2fbf1bceaba1b911166 100644 (file)
@@ -1,5 +1,6 @@
 # Translation of StatusNet to Norwegian (bokmål)‬
 #
+# Author@translatewiki.net: Laaknor
 # Author@translatewiki.net: Nghtwlkr
 # --
 # This file is distributed under the same license as the StatusNet package.
@@ -8,75 +9,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:26+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:19+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.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Tilgang"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Innstillinger for nettstedstilgang"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registrering"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privat"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Forhindre anonyme brukere (ikke innlogget) å se nettsted?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Kun invitasjon"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privat"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Gjør at registrering kun kan skje gjennom invitasjon."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Lukket"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Kun invitasjon"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Deaktiver nye registreringer."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Lagre"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Lukket"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Lagre tilgangsinnstillinger"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Lagre"
+
+#. 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 "Ingen slik side"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -90,52 +98,59 @@ msgstr "Ingen slik side"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Ingen slik bruker"
 
-#: actions/all.php:84
+#. 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 og venner, side %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s og venner"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Mating for venner av %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Mating for venner av %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Mating for venner av %s (Atom)"
 
-#: actions/all.php:127
+#. 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 "Dette er tidslinjen for %s og venner, men ingen har postet noe enda."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -144,7 +159,8 @@ msgstr ""
 "Prøv å abbonere på flere personer, [bli med i en gruppe](%%action.groups%%) "
 "eller post noe selv."
 
-#: actions/all.php:134
+#. 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 "
@@ -154,7 +170,7 @@ msgstr ""
 "å få hans eller hennes oppmerksomhet](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -163,12 +179,13 @@ msgstr ""
 "Hvorfor ikke [opprette en konto](%%%%action.register%%%%) og så knuff %s "
 "eller post en notis for å få hans eller hennes oppmerksomhet."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Du og venner"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Oppdateringer fra %1$s og venner på %2$s!"
@@ -181,20 +198,20 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metode ikke funnet!"
@@ -228,8 +245,9 @@ msgstr "Klarte ikke å oppdatere bruker."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Brukeren har ingen profil."
 
@@ -256,7 +274,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -367,68 +385,68 @@ msgstr "Kunne ikke bestemme kildebruker."
 msgid "Could not find target user."
 msgstr "Kunne ikke finne målbruker."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Kallenavn kan kun ha små bokstaver og tall og ingen mellomrom."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Det nicket er allerede i bruk. Prøv et annet."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Ugyldig nick."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Hjemmesiden er ikke en gyldig URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Beklager, navnet er for langt (max 250 tegn)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Beskrivelsen er for lang (maks %d tegn)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 ""
+msgstr "Plassering er for lang (maks 255 tegn)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "For mange alias! Maksimum %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Ugyldig alias: «%s»"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Aliaset «%s» er allerede i bruk. Prøv et annet."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias kan ikke være det samme som kallenavn."
@@ -439,15 +457,15 @@ msgstr "Alias kan ikke være det samme som kallenavn."
 msgid "Group not found!"
 msgstr "Gruppe ikke funnet!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Du er allerede medlem av den gruppen."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Du har blitt blokkert fra den gruppen av administratoren."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Kunne ikke legge bruker %1$s til gruppe %2$s."
@@ -456,7 +474,7 @@ msgstr "Kunne ikke legge bruker %1$s til gruppe %2$s."
 msgid "You are not a member of this group."
 msgstr "Du er ikke et medlem av denne gruppen."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Kunne ikke fjerne bruker %1$s fra gruppe %2$s."
@@ -481,14 +499,13 @@ msgid "No oauth_token parameter provided."
 msgstr "Ingen verdi for oauth_token er oppgitt."
 
 #: actions/apioauthauthorize.php:106
-#, fuzzy
 msgid "Invalid token."
-msgstr "Ugyldig størrelse"
+msgstr "Ugyldig symbol."
 
 #: 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:309
+#: 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
@@ -497,11 +514,11 @@ msgstr "Ugyldig størrelse"
 #: 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:46 actions/tagother.php:166
+#: 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 ""
+msgstr "Det var et problem med din sesjons-autentisering. Prøv igjen."
 
 #: actions/apioauthauthorize.php:135
 msgid "Invalid nickname / password!"
@@ -509,11 +526,11 @@ msgstr "Ugyldig kallenavn / passord!"
 
 #: actions/apioauthauthorize.php:159
 msgid "Database error deleting OAuth application user."
-msgstr ""
+msgstr "Databasefeil ved sletting av bruker fra programmet OAuth."
 
 #: actions/apioauthauthorize.php:185
 msgid "Database error inserting OAuth application user."
-msgstr ""
+msgstr "Databasefeil ved innsetting av bruker i programmet OAuth."
 
 #: actions/apioauthauthorize.php:214
 #, php-format
@@ -529,16 +546,16 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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 ""
+msgstr "Uventet skjemainnsending."
 
 #: actions/apioauthauthorize.php:259
 msgid "An application would like to connect to your account"
-msgstr ""
+msgstr "Et program ønsker å koble til kontoen din"
 
 #: actions/apioauthauthorize.php:276
 msgid "Allow or deny access"
@@ -551,14 +568,17 @@ msgid ""
 "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 ""
+"Programmet <strong>%1$s</strong> av <strong>%2$s</strong> ønsker å kunne "
+"<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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -583,7 +603,7 @@ msgstr "Tillat eller nekt tilgang til din kontoinformasjon."
 
 #: actions/apistatusesdestroy.php:107
 msgid "This method requires a POST or DELETE."
-msgstr ""
+msgstr "Denne metoden krever en POST eller DELETE."
 
 #: actions/apistatusesdestroy.php:130
 msgid "You may not delete another user's status."
@@ -614,7 +634,7 @@ msgstr "Ingen status med den ID-en funnet."
 #: lib/mailhandler.php:60
 #, php-format
 msgid "That's too long. Max notice size is %d chars."
-msgstr ""
+msgstr "Det er for langt. Maks notisstørrelse er %d tegn."
 
 #: actions/apistatusesupdate.php:202
 msgid "Not found"
@@ -623,29 +643,29 @@ msgstr "Ikke funnet"
 #: actions/apistatusesupdate.php:225 actions/newnotice.php:178
 #, php-format
 msgid "Max notice size is %d chars, including attachment URL."
-msgstr ""
+msgstr "Maks notisstørrelse er %d tegn, inklusive vedleggs-URL."
 
 #: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261
 msgid "Unsupported format."
-msgstr ""
+msgstr "Formatet støttes ikke."
 
 #: actions/apitimelinefavorites.php:108
 #, php-format
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favoritter fra %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s tidslinje"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -661,12 +681,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s offentlig tidslinje"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s oppdateringer fra alle sammen!"
@@ -676,17 +696,17 @@ msgstr "%s oppdateringer fra alle sammen!"
 msgid "Repeated to %s"
 msgstr "Gjentatt til %s"
 
-#: actions/apitimelineretweetsofme.php:112
-#, fuzzy, php-format
+#: actions/apitimelineretweetsofme.php:114
+#, php-format
 msgid "Repeats of %s"
-msgstr "Svar til %s"
+msgstr "Repetisjoner av %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notiser merket med %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Oppdateringer merket med %1$s på %2$s!"
@@ -702,8 +722,7 @@ msgstr "Ingen slike vedlegg."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Ingen kallenavn."
 
@@ -715,7 +734,7 @@ msgstr "Ingen størrelse."
 msgid "Invalid size."
 msgstr "Ugyldig størrelse"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Brukerbilde"
@@ -723,50 +742,49 @@ msgstr "Brukerbilde"
 #: actions/avatarsettings.php:78
 #, php-format
 msgid "You can upload your personal avatar. The maximum file size is %s."
-msgstr ""
+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
 msgid "User without matching profile"
-msgstr ""
+msgstr "Bruker uten samsvarende profil"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
-#, fuzzy
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
-msgstr "Innstillinger for IM"
+msgstr "Avatarinnstillinger"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Forhåndsvis"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Slett"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Last opp"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Beskjær"
 
 #: actions/avatarsettings.php:328
 msgid "Pick a square area of the image to be your avatar"
-msgstr ""
+msgstr "Velg et kvadratisk utsnitt av bildet som din avatar."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
-msgstr ""
+msgstr "Mistet våre fildata."
 
 #: actions/avatarsettings.php:366
 msgid "Avatar updated."
@@ -774,12 +792,11 @@ msgstr "Brukerbildet har blitt oppdatert."
 
 #: actions/avatarsettings.php:369
 msgid "Failed updating avatar."
-msgstr ""
+msgstr "Oppdatering av avatar mislyktes."
 
 #: actions/avatarsettings.php:393
-#, fuzzy
 msgid "Avatar deleted."
-msgstr "Brukerbildet har blitt oppdatert."
+msgstr "Avatar slettet."
 
 #: actions/block.php:69
 msgid "You already blocked that user."
@@ -795,74 +812,81 @@ msgid ""
 "unsubscribed from you, unable to subscribe to you in the future, and you "
 "will not be notified of any @-replies from them."
 msgstr ""
+"Er du sikker på at du vil blokkere denne brukeren? Etter dette vil de ikke "
+"lenger abbonere på deg, vil ikke kunne abbonere på deg i fremtiden og du vil "
+"ikke bli varslet om @-svar fra dem."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nei"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Ikke blokker denne brukeren"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ja"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Blokker denne brukeren"
 
 #: actions/block.php:167
 msgid "Failed to save block information."
-msgstr ""
-
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+msgstr "Kunne ikke lagre blokkeringsinformasjon."
+
+#: 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 "Ingen slik gruppe."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s blokkerte profiler"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s blokkerte profiler, side %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
-msgstr ""
+msgstr "En liste over brukere som er blokkert fra å delta i denne gruppen."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
-msgstr ""
+msgstr "Opphev blokkering av bruker fra gruppe"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
-msgstr ""
+msgstr "Opphev blokkering"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
-msgstr ""
+msgstr "Opphev blokkering av denne brukeren"
 
 #: actions/bookmarklet.php:50
 msgid "Post to "
-msgstr ""
+msgstr "Post til "
 
 #: actions/confirmaddress.php:75
 msgid "No confirmation code."
-msgstr ""
+msgstr "Ingen bekreftelseskode."
 
 #: actions/confirmaddress.php:80
 msgid "Confirmation code not found."
@@ -870,16 +894,16 @@ msgstr "Fant ikke bekreftelseskode."
 
 #: actions/confirmaddress.php:85
 msgid "That confirmation code is not for you!"
-msgstr ""
+msgstr "Den bekreftelseskoden er ikke til deg."
 
 #: actions/confirmaddress.php:90
 #, php-format
 msgid "Unrecognized address type %s"
-msgstr ""
+msgstr "Ukjent adressetype %s"
 
 #: actions/confirmaddress.php:94
 msgid "That address has already been confirmed."
-msgstr ""
+msgstr "Den adressen har allerede blitt bekreftet."
 
 #: actions/confirmaddress.php:114 actions/emailsettings.php:296
 #: actions/emailsettings.php:427 actions/imsettings.php:258
@@ -892,7 +916,7 @@ msgstr "Klarte ikke å oppdatere bruker."
 #: actions/confirmaddress.php:126 actions/emailsettings.php:391
 #: actions/imsettings.php:363 actions/smssettings.php:382
 msgid "Couldn't delete email confirmation."
-msgstr ""
+msgstr "Kunne ikke slette e-postbekreftelse."
 
 #: actions/confirmaddress.php:144
 msgid "Confirm address"
@@ -901,7 +925,7 @@ msgstr "Bekreft adresse"
 #: actions/confirmaddress.php:159
 #, php-format
 msgid "The address \"%s\" has been confirmed for your account."
-msgstr ""
+msgstr "Adressen «%s» har blitt bekreftet for din konto."
 
 #: actions/conversation.php:99
 msgid "Conversation"
@@ -910,34 +934,30 @@ msgstr "Samtale"
 #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87
 #: lib/profileaction.php:216 lib/searchgroupnav.php:82
 msgid "Notices"
-msgstr ""
+msgstr "Notiser"
 
 #: actions/deleteapplication.php:63
-#, fuzzy
 msgid "You must be logged in to delete an application."
-msgstr "Gjør brukeren til en administrator for gruppen"
+msgstr "Du må være innlogget for å slette et program."
 
 #: actions/deleteapplication.php:71
-#, fuzzy
 msgid "Application not found."
-msgstr "Fant ikke bekreftelseskode."
+msgstr "Program ikke funnet."
 
 #: actions/deleteapplication.php:78 actions/editapplication.php:77
 #: actions/showapplication.php:94
-#, fuzzy
 msgid "You are not the owner of this application."
-msgstr "Du er allerede logget inn!"
+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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
 #: actions/deleteapplication.php:123 actions/deleteapplication.php:147
-#, fuzzy
 msgid "Delete application"
-msgstr "Ingen slik side"
+msgstr "Slett program"
 
 #: actions/deleteapplication.php:149
 msgid ""
@@ -945,23 +965,25 @@ msgid ""
 "about the application from the database, including all existing user "
 "connections."
 msgstr ""
+"Er du sikker på at du vil slette dette programmet? Dette vil slette alle "
+"data om programmet fra databasen, inkludert alle eksisterende "
+"brukertilkoblinger."
 
 #: actions/deleteapplication.php:156
-#, fuzzy
 msgid "Do not delete this application"
-msgstr "Kan ikke slette notisen."
+msgstr "Ikke slett dette programmet"
 
 #: actions/deleteapplication.php:160
-#, fuzzy
 msgid "Delete this application"
-msgstr "Beskriv degselv og dine interesser med 140 tegn"
+msgstr "Slett dette programmet"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Ikke logget inn."
@@ -975,6 +997,8 @@ msgid ""
 "You are about to permanently delete a notice. Once this is done, it cannot "
 "be undone."
 msgstr ""
+"Du er i ferd med å slette en notis permanent. Når dette er gjort kan det "
+"ikke gjøres om."
 
 #: actions/deletenotice.php:109 actions/deletenotice.php:141
 msgid "Delete notice"
@@ -988,7 +1012,7 @@ msgstr "Er du sikker på at du vil slette denne notisen?"
 msgid "Do not delete this notice"
 msgstr "Ikke slett denne notisen"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Slett denne notisen"
 
@@ -1004,18 +1028,20 @@ msgstr "Du kan bare slette lokale brukere."
 msgid "Delete user"
 msgstr "Slett bruker"
 
-#: actions/deleteuser.php:135
+#: 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 ""
+"Er du sikker på at du vil slette denne brukeren? Dette vil slette alle data "
+"om brukeren fra databasen, uten sikkerhetskopi."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Slett denne brukeren"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1024,14 +1050,13 @@ msgid "Design settings for this StatusNet site."
 msgstr ""
 
 #: actions/designadminpanel.php:275
-#, fuzzy
 msgid "Invalid logo URL."
-msgstr "Ugyldig størrelse"
+msgstr "Ugyldig logo-URL."
 
 #: actions/designadminpanel.php:279
 #, php-format
 msgid "Theme not available: %s"
-msgstr ""
+msgstr "Tema ikke tilgjengelig: %s"
 
 #: actions/designadminpanel.php:375
 msgid "Change logo"
@@ -1042,18 +1067,16 @@ msgid "Site logo"
 msgstr "Nettstedslogo"
 
 #: actions/designadminpanel.php:387
-#, fuzzy
 msgid "Change theme"
-msgstr "Endre"
+msgstr "Endre tema"
 
 #: actions/designadminpanel.php:404
-#, fuzzy
 msgid "Site theme"
-msgstr "Endre"
+msgstr "Nettstedstema"
 
 #: actions/designadminpanel.php:405
 msgid "Theme for the site."
-msgstr ""
+msgstr "Tema for nettstedet."
 
 #: actions/designadminpanel.php:417 lib/designsettings.php:101
 msgid "Change background image"
@@ -1070,6 +1093,7 @@ msgid ""
 "You can upload a background image for the site. The maximum file size is %1"
 "$s."
 msgstr ""
+"Du kan laste opp et bakgrunnsbilde for nettstedet. Maks filstørrelse er %1$s."
 
 #: actions/designadminpanel.php:457 lib/designsettings.php:139
 msgid "On"
@@ -1118,7 +1142,18 @@ msgstr ""
 
 #: actions/designadminpanel.php:584 lib/designsettings.php:254
 msgid "Reset back to default"
-msgstr ""
+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/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 "Lagre"
 
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
@@ -1126,7 +1161,7 @@ msgstr ""
 
 #: actions/disfavor.php:81
 msgid "This notice is not a favorite!"
-msgstr ""
+msgstr "Denne notisen er ikke en favoritt!"
 
 #: actions/disfavor.php:94
 msgid "Add to favorites"
@@ -1135,27 +1170,24 @@ msgstr "Legg til i favoritter"
 #: actions/doc.php:158
 #, php-format
 msgid "No such document \"%s\""
-msgstr ""
+msgstr "Inget slikt dokument «%s»"
 
 #: actions/editapplication.php:54
-#, fuzzy
 msgid "Edit Application"
-msgstr "Ingen slik side"
+msgstr "Rediger program"
 
 #: actions/editapplication.php:66
-#, fuzzy
 msgid "You must be logged in to edit an application."
-msgstr "Gjør brukeren til en administrator for gruppen"
+msgstr "Du må være innlogget for å redigere et program."
 
 #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166
 #: actions/showapplication.php:87
-#, fuzzy
 msgid "No such application."
-msgstr "Ingen slik side"
+msgstr "Inget slikt program."
 
 #: actions/editapplication.php:161
 msgid "Use this form to edit your application."
-msgstr ""
+msgstr "Bruk dette skjemaet for å redigere programmet ditt."
 
 #: actions/editapplication.php:177 actions/newapplication.php:159
 msgid "Name is required."
@@ -1209,48 +1241,46 @@ msgstr "Klarte ikke å oppdatere bruker."
 #: actions/editgroup.php:56
 #, php-format
 msgid "Edit %s group"
-msgstr ""
+msgstr "Rediger %s gruppe"
 
 #: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65
 msgid "You must be logged in to create a group."
 msgstr "Du må være innlogget for å opprette en gruppe."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
-#, fuzzy
+#: 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 "Gjør brukeren til en administrator for gruppen"
+msgstr "Du må være en administrator for å redigere gruppen."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
-msgstr ""
+msgstr "Bruk dette skjemaet for å redigere gruppen."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "beskrivelse er for lang (maks %d tegn)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Kunne ikke oppdatere gruppe."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Kunne ikke opprette alias."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
-msgstr ""
+msgstr "Lagret valg."
 
 #: actions/emailsettings.php:60
-#, fuzzy
 msgid "Email settings"
-msgstr "Innstillinger for e-post"
+msgstr "E-postinnstillinger"
 
 #: actions/emailsettings.php:71
 #, php-format
 msgid "Manage how you get email from %%site.name%%."
-msgstr ""
+msgstr "Velg hvordan du mottar e-post fra %%site.name%%."
 
 #: actions/emailsettings.php:100 actions/imsettings.php:100
 #: actions/smssettings.php:104
@@ -1313,7 +1343,7 @@ msgstr "Ny"
 #: actions/emailsettings.php:153 actions/imsettings.php:139
 #: actions/smssettings.php:169
 msgid "Preferences"
-msgstr ""
+msgstr "Innstillinger"
 
 #: actions/emailsettings.php:158
 msgid "Send me notices of new subscriptions through email."
@@ -1346,7 +1376,7 @@ msgstr "Publiser en MicroID for min e-postadresse."
 #: actions/emailsettings.php:302 actions/imsettings.php:264
 #: actions/othersettings.php:180 actions/smssettings.php:284
 msgid "Preferences saved."
-msgstr ""
+msgstr "Innstillinger lagret."
 
 #: actions/emailsettings.php:320
 msgid "No email address."
@@ -1403,7 +1433,7 @@ msgstr "Det er ikke din e-postadresse."
 #: actions/emailsettings.php:432 actions/imsettings.php:408
 #: actions/smssettings.php:425
 msgid "The address was removed."
-msgstr ""
+msgstr "Adressen ble fjernet."
 
 #: actions/emailsettings.php:446 actions/smssettings.php:518
 msgid "No incoming email address."
@@ -1433,12 +1463,12 @@ msgstr ""
 #: actions/favorited.php:65 lib/popularnoticesection.php:91
 #: lib/publicgroupnav.php:93
 msgid "Popular notices"
-msgstr ""
+msgstr "Populære notiser"
 
 #: actions/favorited.php:67
 #, php-format
 msgid "Popular notices, page %d"
-msgstr ""
+msgstr "Populære notiser, side %d"
 
 #: actions/favorited.php:79
 msgid "The most popular notices on the site right now."
@@ -1499,11 +1529,11 @@ msgstr "Nytt nick"
 
 #: actions/file.php:42
 msgid "No attachments."
-msgstr ""
+msgstr "Ingen vedlegg."
 
 #: actions/file.php:51
 msgid "No uploaded attachments."
-msgstr ""
+msgstr "Ingen opplastede vedlegg."
 
 #: actions/finishremotesubscribe.php:69
 msgid "Not expecting this response!"
@@ -1522,9 +1552,8 @@ msgid "That user has blocked you from subscribing."
 msgstr ""
 
 #: actions/finishremotesubscribe.php:110
-#, fuzzy
 msgid "You are not authorized."
-msgstr "Ikke autorisert."
+msgstr "Du er ikke autorisert."
 
 #: actions/finishremotesubscribe.php:113
 msgid "Could not convert request token to access token."
@@ -1576,7 +1605,7 @@ msgstr "Du er allerede logget inn!"
 msgid "User is not a member of group."
 msgstr ""
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr ""
 
@@ -1608,88 +1637,88 @@ msgstr "Ingen ID."
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Klarte ikke å oppdatere bruker."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Gruppelogo"
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Brukeren har ingen profil."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo oppdatert."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
-msgstr ""
+msgstr "Kunne ikke oppdatere logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s gruppemedlemmer"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
-msgstr ""
+msgstr "%1$s gruppemedlemmer, side %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "En liste over brukerne i denne gruppen."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blokkér"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Gjør brukeren til en administrator for gruppen"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Gjør til administrator"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Gjør denne brukeren til administrator"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1702,7 +1731,7 @@ msgstr "Grupper"
 #: actions/groups.php:64
 #, php-format
 msgid "Groups, page %d"
-msgstr ""
+msgstr "Grupper, side %d"
 
 #: actions/groups.php:90
 #, php-format
@@ -1758,7 +1787,7 @@ msgstr ""
 
 #: actions/groupunblock.php:128 actions/unblock.php:86
 msgid "Error removing the block."
-msgstr ""
+msgstr "Feil under oppheving av blokkering."
 
 #: actions/imsettings.php:59
 #, fuzzy
@@ -1902,7 +1931,7 @@ msgstr ""
 
 #: actions/invite.php:144
 msgid "Invitation(s) sent to the following people:"
-msgstr ""
+msgstr "Invitasjon(er) sendt til følgende personer:"
 
 #: actions/invite.php:150
 msgid ""
@@ -1931,16 +1960,19 @@ msgstr "Personlig melding"
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Send"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s har invitert deg til %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1996,7 +2028,12 @@ msgstr ""
 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:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Ingen kallenavn."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2005,11 +2042,11 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr ""
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s forlot gruppe %2$s"
@@ -2027,8 +2064,7 @@ msgstr "Feil brukernavn eller passord"
 msgid "Error setting user. You are probably not authorized."
 msgstr "Ikke autorisert."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Logg inn"
 
@@ -2271,8 +2307,8 @@ msgstr "innholdstype "
 msgid "Only "
 msgstr "Bare "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2415,7 +2451,7 @@ msgstr "Klarer ikke å lagre nytt passord."
 msgid "Password saved."
 msgstr "Passordet ble lagret"
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2448,7 +2484,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2621,7 +2656,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 små bokstaver eller nummer, ingen punktum eller mellomrom"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Fullt navn"
@@ -2650,7 +2685,7 @@ msgid "Bio"
 msgstr "Om meg"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2715,25 +2750,26 @@ msgstr "Språk er for langt (maks 50 tegn)."
 msgid "Invalid tag: \"%s\""
 msgstr "Ugyldig hjemmeside '%s'"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr ""
 
@@ -2746,46 +2782,46 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr ""
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr ""
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "%s offentlig strøm"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2794,7 +2830,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2965,8 +3001,7 @@ msgstr ""
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr ""
 
@@ -3108,7 +3143,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr ""
 
@@ -3146,7 +3181,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr "Du er allerede logget inn!"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Gjentatt"
 
@@ -3154,47 +3189,47 @@ msgstr "Gjentatt"
 msgid "Repeated!"
 msgstr "Gjentatt!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Svar til %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Svar til %1$s, side %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Svarstrøm for %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Svarstrøm for %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Svarstrøm for %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, 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 "Dette er tidslinjen for %s og venner, men ingen har postet noe enda."
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, fuzzy, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3224,7 +3259,6 @@ msgid "User is already sandboxed."
 msgstr "Du er allerede logget inn!"
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3249,7 +3283,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Innstillinger for IM"
@@ -3280,7 +3314,7 @@ msgstr "Organisasjon"
 msgid "Description"
 msgstr "Beskrivelse"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistikk"
@@ -3342,35 +3376,35 @@ msgstr "%s og venner"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Feed for %s sine venner"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Feed for %s sine venner"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Feed for %s sine venner"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3378,7 +3412,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3392,70 +3426,70 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "Alle abonnementer"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "Klarte ikke å lagre profil."
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Medlem siden"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Opprett"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3465,7 +3499,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3474,7 +3508,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3830,17 +3864,26 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "Ugyldig OpenID"
+msgid "No such profile."
+msgstr "Ingen slik fil."
 
-#: actions/subscribe.php:69
+#: 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 ""
 
@@ -3900,7 +3943,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3910,36 +3953,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s lytter nå til dine notiser på %2$s."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "Ingen Jabber ID."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Mikroblogg av %s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Feed for taggen %s"
@@ -3992,7 +4035,7 @@ msgstr ""
 msgid "No such tag."
 msgstr ""
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-metode under utvikling."
 
@@ -4023,75 +4066,76 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "slett"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Alle abonnementer"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Abonner automatisk på de som abonnerer på meg (best for ikke-mennesker)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Bekreftelseskode"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4266,7 +4310,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Personlig"
@@ -4307,6 +4351,11 @@ msgstr "Klarte ikke å oppdatere bruker."
 msgid "Group leave failed."
 msgstr "Klarte ikke å lagre profil."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Kunne ikke oppdatere gruppe."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4324,67 +4373,98 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1442
 #, php-format
-msgid "DB error inserting reply: %s"
+msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/Notice.php:1235
-#, php-format
-msgid "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/User.php:385
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr ""
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Alle abonnementer"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Klarte ikke å lagre avatar-informasjonen"
+
+#: classes/Subscription.php:179 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:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Klarte ikke å lagre avatar-informasjonen"
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Klarte ikke å lagre avatar-informasjonen"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Endre profilinnstillingene dine"
@@ -4427,122 +4507,187 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Hjem"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personlig"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "Koble til"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "Endre passordet ditt"
 
-#: lib/action.php:444
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr ""
+msgstr "Koble til"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Koble til"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr ""
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr ""
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrator"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Logg ut"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Kun invitasjon"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
-msgstr ""
+msgstr "Tema for nettstedet."
+
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Logg ut"
 
-#: lib/action.php:463
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Opprett en ny konto"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrering"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
-msgstr ""
+msgstr "Tema for nettstedet."
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hjelp"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Logg inn"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjelp"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Søk"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hjelp"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Søk"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hjelp"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "OSS/FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Kilde"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4551,12 +4696,12 @@ msgstr ""
 "**%%site.name%%** er en mikrobloggingtjeneste av [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er en mikrobloggingtjeneste. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4564,94 +4709,157 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "Tidligere »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Nettstedslogo"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Personlig"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 msgid "Sessions configuration"
 msgstr ""
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Personlig"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4747,12 +4955,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Passordet ble lagret"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Passordet ble lagret"
@@ -4904,83 +5112,93 @@ msgstr ""
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Ingen slik bruker"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Svar til %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Ikke autorisert."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Ikke autorisert."
 msgstr[1] "Ikke autorisert."
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Svar til %s"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Svar til %s"
 msgstr[1] "Svar til %s"
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Du er allerede logget inn!"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Du er allerede logget inn!"
 msgstr[1] "Du er allerede logget inn!"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4994,6 +5212,7 @@ msgid ""
 "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"
@@ -5021,20 +5240,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Fant ikke bekreftelseskode."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5227,24 +5446,24 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Klarte ikke å lagre profil."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5458,7 +5677,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr "fra"
@@ -5550,6 +5769,12 @@ msgstr ""
 msgid "Available characters"
 msgstr "6 eller flere 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 ""
@@ -5583,50 +5808,50 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Opprett"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "svar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Nytt nick"
@@ -5659,10 +5884,6 @@ msgstr ""
 msgid "Duplicate notice"
 msgstr ""
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr ""
@@ -5679,6 +5900,10 @@ msgstr "Svar"
 msgid "Favorites"
 msgstr ""
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5773,7 +5998,7 @@ msgstr "Kan ikke slette notisen."
 msgid "Repeat this notice"
 msgstr "Kan ikke slette notisen."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5795,6 +6020,10 @@ msgstr "Søk"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Søk"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -5848,34 +6077,13 @@ msgstr "Svar til %s"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr ""
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr ""
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Alle abonnementer"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Klarte ikke å lagre avatar-informasjonen"
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
@@ -5931,68 +6139,68 @@ msgstr "Brukerbilde"
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Endre profilinnstillingene dine"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr ""
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "noen få sekunder siden"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "omtrent ett minutt siden"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "omtrent %d minutter siden"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "omtrent én time siden"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "omtrent %d timer siden"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "omtrent én dag siden"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "omtrent %d dager siden"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "omtrent én måned siden"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "omtrent %d måneder siden"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "omtrent ett år siden"
 
index b1a54d06a22cf2e376e70573f9de88a4e49384d7..a9e7579564ebc2380295d84f4fa1967b0524fee5 100644 (file)
@@ -10,75 +10,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:32+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:32+0000\n"
 "Language-Team: Dutch\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Toegang"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Instellingen voor sitetoegang"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registratie"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privé"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Mogen anonieme gebruikers (niet aangemeld) de website bekijken?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Alleen op uitnodiging"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privé"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Registratie alleen op uitnodiging."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Gesloten"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Alleen op uitnodiging"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Nieuwe registraties uitschakelen."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Opslaan"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Gesloten"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Toegangsinstellingen opslaan"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Opslaan"
+
+#. 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 "Deze pagina bestaat niet"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -92,46 +99,53 @@ msgstr "Deze pagina bestaat niet"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Onbekende gebruiker."
 
-#: actions/all.php:84
+#. 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 en vrienden, pagina %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s en vrienden"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Feed voor vrienden van %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Feed voor vrienden van %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Feed voor vrienden van %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -139,7 +153,7 @@ msgstr ""
 "Dit is de tijdlijn voor %s en vrienden, maar niemand heeft nog mededelingen "
 "geplaatst."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -148,7 +162,8 @@ msgstr ""
 "Probeer te abonneren op meer gebruikers, [word lid van een groep](%%action."
 "groups%%)  of plaats zelf berichten."
 
-#: actions/all.php:134
+#. 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 "
@@ -158,7 +173,7 @@ msgstr ""
 "bericht voor die gebruiker plaatsen](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -167,12 +182,13 @@ msgstr ""
 "U kunt een [gebruiker aanmaken](%%%%action.register%%%%) en %s dan porren of "
 "een bericht sturen."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "U en vrienden"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Updates van %1$s en vrienden op %2$s."
@@ -185,20 +201,20 @@ msgstr "Updates van %1$s en vrienden op %2$s."
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "De API-functie is niet aangetroffen."
 
@@ -232,8 +248,9 @@ msgstr "Het was niet mogelijk de gebruiker bij te werken."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Deze gebruiker heeft geen profiel."
 
@@ -259,7 +276,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -374,7 +391,7 @@ msgstr "Het was niet mogelijk de brongebruiker te bepalen."
 msgid "Could not find target user."
 msgstr "Het was niet mogelijk de doelgebruiker te vinden."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -382,63 +399,63 @@ msgstr ""
 "De gebruikersnaam mag alleen kleine letters en cijfers bevatten. Spaties "
 "zijn niet toegestaan."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 ""
 "De opgegeven gebruikersnaam is al in gebruik. Kies een andere gebruikersnaam."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Ongeldige gebruikersnaam!"
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "De thuispagina is geen geldige URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "De volledige naam is te lang (maximaal 255 tekens)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "De beschrijving is te lang (maximaal %d tekens)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Locatie is te lang (maximaal 255 tekens)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Te veel aliassen! Het maximale aantal is %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Ongeldige alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "De alias \"%s\" wordt al gebruikt. Geef een andere alias op."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Een alias kan niet hetzelfde zijn als de gebruikersnaam."
@@ -449,15 +466,15 @@ msgstr "Een alias kan niet hetzelfde zijn als de gebruikersnaam."
 msgid "Group not found!"
 msgstr "De groep is niet aangetroffen!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "U bent al lid van die groep."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Een beheerder heeft ingesteld dat u geen lid mag worden van die groep."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Het was niet mogelijk gebruiker %1$s toe te voegen aan de groep %2$s."
@@ -466,7 +483,7 @@ msgstr "Het was niet mogelijk gebruiker %1$s toe te voegen aan de groep %2$s."
 msgid "You are not a member of this group."
 msgstr "U bent geen lid van deze groep."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Het was niet mogelijk gebruiker %1$s uit de group %2$s te verwijderen."
@@ -497,7 +514,7 @@ msgstr "Ongeldig token."
 #: 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:309
+#: 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
@@ -506,7 +523,7 @@ msgstr "Ongeldig token."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -546,7 +563,7 @@ msgstr "Het verzoektoken %s is geweigerd en ingetrokken."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -572,13 +589,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Gebruiker"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -656,18 +673,18 @@ msgstr "Niet-ondersteund bestandsformaat."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favorieten van %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s tijdlijn"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -683,12 +700,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s publieke tijdlijn"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s updates van iedereen"
@@ -698,17 +715,17 @@ msgstr "%s updates van iedereen"
 msgid "Repeated to %s"
 msgstr "Herhaald naar %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Herhaald van %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Mededelingen met het label %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Updates met het label %1$s op %2$s!"
@@ -724,8 +741,7 @@ msgstr "Deze bijlage bestaat niet."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Geen gebruikersnaam."
 
@@ -737,7 +753,7 @@ msgstr "Geen afmeting."
 msgid "Invalid size."
 msgstr "Ongeldige afmetingen."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -755,30 +771,30 @@ msgid "User without matching profile"
 msgstr "Gebruiker zonder bijbehorend profiel"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Avatarinstellingen"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Origineel"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Voorvertoning"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Verwijderen"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Uploaden"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Uitsnijden"
 
@@ -787,7 +803,7 @@ msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 "Selecteer een vierkant in de afbeelding om deze als uw avatar in te stellen"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Ons bestand is verloren gegaan."
 
@@ -822,22 +838,22 @@ msgstr ""
 "van deze gebruiker."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nee"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Gebruiker niet blokkeren"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ja"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Deze gebruiker blokkeren"
 
@@ -845,39 +861,43 @@ msgstr "Deze gebruiker blokkeren"
 msgid "Failed to save block information."
 msgstr "Het was niet mogelijk om de blokkadeinformatie op te slaan."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "De opgegeven groep bestaat niet."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s geblokkeerde profielen"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s geblokkeerde profielen, pagina %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Een lijst met voor deze groep geblokkeerde gebruikers."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Deze gebruiker weer toegang geven tot de groep"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Deblokkeer"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Deblokkeer deze gebruiker."
 
@@ -952,7 +972,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Er is een probleem met uw sessietoken."
 
@@ -978,12 +998,13 @@ msgstr "Deze applicatie niet verwijderen"
 msgid "Delete this application"
 msgstr "Deze applicatie verwijderen"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Niet aangemeld."
@@ -1012,7 +1033,7 @@ msgstr "Weet u zeker dat u deze aankondiging wilt verwijderen?"
 msgid "Do not delete this notice"
 msgstr "Deze mededeling niet verwijderen"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Deze mededeling verwijderen"
 
@@ -1028,7 +1049,7 @@ msgstr "U kunt alleen lokale gebruikers verwijderen."
 msgid "Delete user"
 msgstr "Gebruiker verwijderen"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1037,12 +1058,12 @@ msgstr ""
 "worden alle gegevens van deze gebruiker uit de database verwijderd. Het is "
 "niet mogelijk ze terug te zetten."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Gebruiker verwijderen"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Uiterlijk"
 
@@ -1145,6 +1166,17 @@ msgstr "Standaardontwerp toepassen"
 msgid "Reset back to default"
 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/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 "Opslaan"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Ontwerp opslaan"
@@ -1236,29 +1268,29 @@ msgstr "Groep %s bewerken"
 msgid "You must be logged in to create a group."
 msgstr "U moet aangemeld zijn om een groep aan te kunnen maken."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "U moet beheerder zijn om de groep te kunnen bewerken."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Gebruik dit formulier om de groep te bewerken."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "de beschrijving is te lang (maximaal %d tekens)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Het was niet mogelijk de groep bij te werken."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Het was niet mogelijk de aliassen aan te maken."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "De instellingen zijn opgeslagen."
 
@@ -1605,7 +1637,7 @@ msgstr "Deze gebruiker is al de toegang tot de groep ontzegd."
 msgid "User is not a member of group."
 msgstr "De gebruiker is geen lid van de groep."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Gebruiker toegang tot de groep blokkeren"
 
@@ -1642,11 +1674,11 @@ msgstr "Geen ID."
 msgid "You must be logged in to edit a group."
 msgstr "U moet aangemeld zijn om een groep te kunnen bewerken."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Groepsontwerp"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1654,20 +1686,20 @@ msgstr ""
 "De vormgeving van uw groep aanpassen met een achtergrondafbeelding en een "
 "kleurenpalet van uw keuze."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Het was niet mogelijk uw ontwerp bij te werken."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "De ontwerpvoorkeuren zijn opgeslagen."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Groepslogo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1675,57 +1707,57 @@ msgstr ""
 "Hier kunt u een logo voor uw groep uploaden. De maximale bestandsgrootte is %"
 "s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Gebruiker zonder bijbehorend profiel."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Selecteer een vierkant uit de afbeelding die het logo wordt."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo geactualiseerd."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Het bijwerken van het logo is mislukt."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "leden van de groep %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s groeps leden, pagina %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Ledenlijst van deze groep"
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Beheerder"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blokkeren"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Deze gebruiker groepsbeheerder maken"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Beheerder maken"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Deze gebruiker beheerder maken"
 
-#: actions/grouprss.php:133
+#: 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."
@@ -1993,16 +2025,19 @@ msgstr "Persoonlijk bericht"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Persoonlijk bericht bij de uitnodiging (optioneel)."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Verzenden"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s heeft u uitgenodigd voor %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2063,7 +2098,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "U moet aangemeld zijn om lid te worden van een groep."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Geen gebruikersnaam of ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s is lid geworden van de groep %2$s"
@@ -2072,11 +2111,11 @@ msgstr "%1$s is lid geworden van de groep %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "U moet aangemeld zijn om een groep te kunnen verlaten."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "U bent geen lid van deze groep"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s heeft de groep %2$s verlaten"
@@ -2095,8 +2134,7 @@ msgstr ""
 "Er is een fout opgetreden bij het maken van de instellingen. U hebt "
 "waarschijnlijk niet de juiste rechten."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Aanmelden"
 
@@ -2354,8 +2392,8 @@ msgstr "inhoudstype "
 msgid "Only "
 msgstr "Alleen "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Geen ondersteund gegevensformaat."
 
@@ -2494,7 +2532,7 @@ msgstr "Het was niet mogelijk het nieuwe wachtwoord op te slaan."
 msgid "Password saved."
 msgstr "Het wachtwoord is opgeslagen."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Paden"
 
@@ -2527,7 +2565,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "De SSL-server is ongeldig. De maximale lengte is 255 tekens."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Website"
 
@@ -2702,7 +2739,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 kleine letters of cijfers, geen leestekens of spaties"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Volledige naam"
@@ -2730,7 +2767,7 @@ msgid "Bio"
 msgstr "Beschrijving"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2798,25 +2835,26 @@ msgstr "Taal is te lang (max 50 tekens)."
 msgid "Invalid tag: \"%s\""
 msgstr "Ongeldig label: '%s'"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 "Het was niet mogelijk de instelling voor automatisch abonneren voor de "
 "gebruiker bij te werken."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Het was niet mogelijk de locatievoorkeuren op te slaan."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Het profiel kon niet opgeslagen worden."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Het was niet mogelijk de labels op te slaan."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "De instellingen zijn opgeslagen."
 
@@ -2829,28 +2867,28 @@ msgstr "Meer dan de paginalimiet (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Het was niet mogelijk de publieke stream op te halen."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Openbare tijdlijn, pagina %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Openbare tijdlijn"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Publieke streamfeed (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Publieke streamfeed (RSS 1.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Publieke streamfeed (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2859,11 +2897,11 @@ msgstr ""
 "Dit is de publieke tijdlijn voor %%site.name%%, maar niemand heeft nog "
 "berichten geplaatst."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "U kunt de eerste zijn die een bericht plaatst!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2871,7 +2909,7 @@ msgstr ""
 "Waarom [registreert u geen gebruiker](%%action.register%%) en plaatst u als "
 "eerste een bericht?"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2884,7 +2922,7 @@ msgstr ""
 "net/). [Registreer nu](%%action.register%%) om mededelingen over uzelf te "
 "delen met vrienden, familie en collega's! [Meer lezen...](%%doc.help%%)"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3068,8 +3106,7 @@ msgstr "Sorry. De uitnodigingscode is ongeldig."
 msgid "Registration successful"
 msgstr "De registratie is voltooid"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registreren"
 
@@ -3217,7 +3254,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Abonneren"
 
@@ -3255,7 +3292,7 @@ msgstr "U kunt uw eigen mededeling niet herhalen."
 msgid "You already repeated that notice."
 msgstr "U hent die mededeling al herhaald."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Herhaald"
 
@@ -3263,33 +3300,33 @@ msgstr "Herhaald"
 msgid "Repeated!"
 msgstr "Herhaald!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Antwoorden aan %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Antwoorden aan %1$s, pagina %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Antwoordenfeed voor %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Antwoordenfeed voor %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Antwoordenfeed voor %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3298,7 +3335,7 @@ msgstr ""
 "Dit is de tijdlijn met de antwoorden aan %1$s, maar %2$s heeft nog geen "
 "antwoorden ontvangen."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3307,7 +3344,7 @@ msgstr ""
 "U kunt gesprekken aanknopen met andere gebruikers, op meer gebruikers "
 "abonneren of [lid worden van groepen](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3334,7 +3371,6 @@ msgid "User is already sandboxed."
 msgstr "Deze gebruiker is al in de zandbak geplaatst."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessies"
 
@@ -3359,7 +3395,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Debuguitvoer voor sessies inschakelen."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Websiteinstellingen opslaan"
 
@@ -3389,7 +3425,7 @@ msgstr "Organisatie"
 msgid "Description"
 msgstr "Beschrijving"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistieken"
@@ -3453,22 +3489,22 @@ msgstr "Favoriete mededelingen van %1$s, pagina %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Het was niet mogelijk de favoriete mededelingen op te halen."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Favorietenfeed van %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Favorietenfeed van %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Favorietenfeed van %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3477,7 +3513,7 @@ msgstr ""
 "toevoegen\" bij mededelingen die u aanstaan om ze op een lijst te bewaren en "
 "ze uit te lichten."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3487,7 +3523,7 @@ msgstr ""
 "een interessant bericht, en dan komt u misschien wel op de "
 "favorietenlijst. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3498,7 +3534,7 @@ msgstr ""
 "action.register%%%%) en dan interessante mededelingen plaatsten die "
 "misschien aan favorietenlijsten zijn toe te voegen. :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Dit is de manier om dat te delen wat u wilt."
 
@@ -3512,67 +3548,67 @@ msgstr "%s groep"
 msgid "%1$s group, page %2$d"
 msgstr "Groep %1$s, pagina %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Groepsprofiel"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Opmerking"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Aliassen"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Groepshandelingen"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Mededelingenfeed voor groep %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Mededelingenfeed voor groep %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Mededelingenfeed voor groep %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Vriend van een vriend voor de groep %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Leden"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(geen)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Alle leden"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Aangemaakt"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3588,7 +3624,7 @@ msgstr ""
 "lid te worden van deze groep en nog veel meer! [Meer lezen...](%%%%doc.help%%"
 "%%)"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3601,7 +3637,7 @@ msgstr ""
 "[StatusNet](http://status.net/). De leden wisselen korte mededelingen uit "
 "over hun ervaringen en interesses. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Beheerders"
 
@@ -3975,15 +4011,26 @@ msgstr "Er is geen code ingevoerd"
 msgid "You are not subscribed to that profile."
 msgstr "U bent niet geabonneerd op dat profiel."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Het was niet mogelijk het abonnement op te slaan."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Dit is geen lokale gebruiker."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Deze handeling accepteert alleen POST-verzoeken."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Het profiel bestaat niet."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"U kunt niet abonneren op een OMB 1.0 profiel van een andere omgeving via "
+"deze handeling."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Geabonneerd"
 
@@ -4047,7 +4094,7 @@ msgstr "Dit zijn de gebruikers van wie u de mededelingen volgt."
 msgid "These are the people whose notices %s listens to."
 msgstr "Dit zijn de gebruikers waarvan %s de mededelingen volgt."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4063,35 +4110,35 @@ msgstr ""
 "action.twittersettings%%), kunt u automatisch abonneren op de gebruikers die "
 "u daar al volgt."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s volgt niemand."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Mededelingen met het label %1$s, pagina %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Mededelingenfeed voor label %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Mededelingenfeed voor label %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Mededelingenfeed voor label %s (Atom)"
@@ -4147,7 +4194,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Onbekend label."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "De API-functie is in bewerking."
 
@@ -4179,70 +4226,72 @@ msgstr ""
 "De licentie \"%1$s\" voor de stream die u wilt volgen is niet compatibel met "
 "de sitelicentie \"%2$s\"."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Gebruiker"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Gebruikersinstellingen voor deze StatusNet-website."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Ongeldige beschrijvingslimiet. Het moet een getal zijn."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Ongeldige welkomsttekst. De maximale lengte is 255 tekens."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Ongeldig standaardabonnement: \"%1$s\" is geen gebruiker."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profiel"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Profiellimiet"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "De maximale lengte van de profieltekst in tekens."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nieuwe gebruikers"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Welkom voor nieuwe gebruikers"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Welkomsttekst voor nieuwe gebruikers. Maximaal 255 tekens."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Standaardabonnement"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Nieuwe gebruikers automatisch op deze gebruiker abonneren"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Uitnodigingen"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Uitnodigingen ingeschakeld"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Of gebruikers nieuwe gebruikers kunnen uitnodigen."
 
@@ -4440,7 +4489,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plug-ins"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Versie"
 
@@ -4481,6 +4530,10 @@ msgstr "Geen lid van groep."
 msgid "Group leave failed."
 msgstr "Groepslidmaatschap opzeggen is mislukt."
 
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Het was niet mogelijk de lokale groep bij te werken."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4498,31 +4551,31 @@ msgstr "Het was niet mogelijk het bericht in te voegen."
 msgid "Could not update message with new URI."
 msgstr "Het was niet mogelijk het bericht bij te werken met de nieuwe URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Er is een databasefout opgetreden bij de invoer van de hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 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:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 "Er was een probleem bij het opslaan van de mededeling. De gebruiker is "
 "onbekend."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4530,45 +4583,71 @@ msgstr ""
 "Te veel duplicaatberichten te snel achter elkaar. Neem een adempauze en "
 "plaats over een aantal minuten pas weer een bericht."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 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:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr ""
 "Er is een probleem opgetreden bij het opslaan van het Postvak IN van de "
 "groep."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr ""
-"Er is een databasefout opgetreden bij het invoegen van het antwoord: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "U mag zich niet abonneren."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "U bent al gebonneerd!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Deze gebruiker negeert u."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Niet geabonneerd!"
+
+#: classes/Subscription.php:163
+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
+msgid "Couldn't delete subscription."
+msgstr "Kon abonnement niet verwijderen."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Welkom bij %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Het was niet mogelijk de groep aan te maken."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Het was niet mogelijk de groeps-URI in te stellen."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Het was niet mogelijk het groepslidmaatschap in te stellen."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Het was niet mogelijk de lokale groepsinformatie op te slaan."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Uw profielgegevens wijzigen"
@@ -4610,120 +4689,190 @@ msgstr "Naamloze pagina"
 msgid "Primary site navigation"
 msgstr "Primaire sitenavigatie"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Start"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Persoonlijk profiel en tijdlijn van vrienden"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Persoonlijk"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Uw e-mailadres, avatar, wachtwoord of profiel wijzigen"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Koppelen"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Gebruiker"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Met diensten verbinden"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Koppelen"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Websiteinstellingen wijzigen"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Uitnodigen"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Beheerder"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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:458
-msgid "Logout"
-msgstr "Afmelden"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Uitnodigen"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Van de site afmelden"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Afmelden"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Gebruiker aanmaken"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registreren"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Bij de site aanmelden"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Help"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Aanmelden"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Help me!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Zoeken"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Help"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Naar gebruikers of tekst zoeken"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Zoeken"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Mededeling van de website"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Lokale weergaven"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Mededeling van de pagina"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Secundaire sitenavigatie"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Help"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Over"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Veel gestelde vragen"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Gebruiksvoorwaarden"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacy"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Broncode"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contact"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Widget"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licentie van de StatusNet-software"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4732,12 +4881,12 @@ msgstr ""
 "**%%site.name%%** is een microblogdienst van [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** is een microblogdienst. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4748,99 +4897,164 @@ msgstr ""
 "versie %s, beschikbaar onder de [GNU Affero General Public License](http://"
 "www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licentie voor siteinhoud"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licentie."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Later"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Eerder"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Het is nog niet mogelijk inhoud uit andere omgevingen te verwerken."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Het is nog niet mogelijk ingebedde XML-inhoud te verwerken"
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Het is nog niet mogelijk ingebedde Base64-inhoud te verwerken"
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "U mag geen wijzigingen maken aan deze website."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Wijzigingen aan dat venster zijn niet toegestaan."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() is niet geïmplementeerd."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() is nog niet geïmplementeerd."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Het was niet mogelijk om de ontwerpinstellingen te verwijderen."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Basisinstellingen voor de website"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Website"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Instellingen vormgeving"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Uiterlijk"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Gebruikersinstellingen"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Gebruiker"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Toegangsinstellingen"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Padinstellingen"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Sessieinstellingen"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessies"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "Het API-programma heeft lezen-en-schrijventoegang nodig, maar u hebt alleen "
 "maar leestoegang."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4932,11 +5146,11 @@ msgstr "Mededelingen die deze bijlage bevatten"
 msgid "Tags for this attachment"
 msgstr "Labels voor deze bijlage"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Wachtwoord wijzigen is mislukt"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Wachtwoord wijzigen is niet toegestaan"
 
@@ -5091,83 +5305,92 @@ msgstr "Er is een fout opgetreden bij het opslaan van de mededeling."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Geef de naam op van de gebruiker waarop u wilt abonneren"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "De opgegeven gebruiker bestaat niet"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Geabonneerd op %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 "Geef de naam op van de gebruiker waarvoor u het abonnement wilt opzeggen"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Uw abonnement op %s is opgezegd"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Dit commando is nog niet geïmplementeerd."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificaties uitgeschakeld."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Het is niet mogelijk de mededelingen uit te schakelen."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificaties ingeschakeld."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Het is niet mogelijk de notificatie uit te schakelen."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Het aanmeldcommando is uitgeschakeld"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Deze verwijzing kan slechts één keer gebruikt worden en is twee minuten "
 "geldig: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Het abonnement van %s is opgeheven"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "U bent op geen enkele gebruiker geabonneerd."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "U bent geabonneerd op deze gebruiker:"
 msgstr[1] "U bent geabonneerd op deze gebruikers:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Niemand heeft een abonnenment op u."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Deze gebruiker is op u geabonneerd:"
 msgstr[1] "Deze gebruikers zijn op u geabonneerd:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "U bent lid van geen enkele groep."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "U bent lid van deze groep:"
 msgstr[1] "U bent lid van deze groepen:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5181,6 +5404,7 @@ msgid ""
 "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"
@@ -5219,6 +5443,7 @@ msgstr ""
 "d <gebruiker> <tekst> - direct bericht aan gebruiker\n"
 "get <gebruiker> - laatste mededeling van gebruiker opvragen\n"
 "whois <gebruiker> - profielinformatie van gebruiker opvragen\n"
+"lose <gebruiker> - zorgt ervoor dat de gebruiker u niet meer volgt\n"
 "fav <gebruiker> - laatste mededeling van gebruiker op favorietenlijst "
 "zetten\n"
 "fav #<mededeling-ID> - mededelingen met aangegeven ID op favorietenlijst "
@@ -5247,20 +5472,20 @@ msgstr ""
 "tracks - nog niet beschikbaar\n"
 "tracking - nog niet beschikbaar\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Er is geen instellingenbestand aangetroffen. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Er is gezocht naar instellingenbestanden op de volgende plaatsen: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 "U kunt proberen de installer uit te voeren om dit probleem op te lossen."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Naar het installatieprogramma gaan."
 
@@ -5450,23 +5675,23 @@ msgstr "Er is een systeemfout opgetreden tijdens het uploaden van het bestand."
 msgid "Not an image or corrupt file."
 msgstr "Het bestand is geen afbeelding of het bestand is beschadigd."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Niet ondersteund beeldbestandsformaat."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Het bestand is zoekgeraakt."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Onbekend bestandstype"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5757,7 +5982,7 @@ msgstr ""
 "U hebt geen privéberichten. U kunt privéberichten verzenden aan andere "
 "gebruikers. Mensen kunnen u privéberichten sturen die alleen u kunt lezen."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "van"
 
@@ -5852,6 +6077,11 @@ msgstr "Aan"
 msgid "Available characters"
 msgstr "Beschikbare tekens"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "OK"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Mededeling verzenden"
@@ -5885,48 +6115,48 @@ msgstr ""
 "Het ophalen van uw geolocatie duurt langer dan verwacht. Probeer het later "
 "nog eens"
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "Z"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "O"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "W"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "op"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "in context"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Herhaald door"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Op deze mededeling antwoorden"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Antwoorden"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Mededeling herhaald"
 
@@ -5959,10 +6189,6 @@ msgstr ""
 msgid "Duplicate notice"
 msgstr "Duplicaatmelding"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "U mag zich niet abonneren."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Kon nieuw abonnement niet toevoegen."
@@ -5979,6 +6205,10 @@ msgstr "Antwoorden"
 msgid "Favorites"
 msgstr "Favorieten"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Gebruiker"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Postvak IN"
@@ -6068,7 +6298,7 @@ msgstr "Deze mededeling herhalen?"
 msgid "Repeat this notice"
 msgstr "Deze mededeling herhalen"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Er is geen gebruiker gedefinieerd voor single-usermodus."
 
@@ -6088,6 +6318,10 @@ msgstr "Site doorzoeken"
 msgid "Keyword(s)"
 msgstr "Term(en)"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Zoeken"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Hulp bij zoeken"
@@ -6139,33 +6373,14 @@ msgstr "Gebruikers met een abonnement op %s"
 msgid "Groups %s is a member of"
 msgstr "Groepen waar %s lid van is"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "U bent al gebonneerd!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Deze gebruiker negeert u."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Kan niet abonneren "
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Het was niet mogelijk om een ander op u te laten abonneren"
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Niet geabonneerd!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Het was niet mogelijk het abonnement op uzelf te verwijderen."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Uitnodigen"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kon abonnement niet verwijderen."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Vrienden en collega's uitnodigen om u te vergezellen op %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6217,67 +6432,67 @@ msgstr "Avatar bewerken"
 msgid "User actions"
 msgstr "Gebruikershandelingen"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Profielinstellingen bewerken"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Bewerken"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Deze gebruiker een direct bericht zenden"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Bericht"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Modereren"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "een paar seconden geleden"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "ongeveer een minuut geleden"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "ongeveer %d minuten geleden"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "ongeveer een uur geleden"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "ongeveer %d uur geleden"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "ongeveer een dag geleden"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "ongeveer %d dagen geleden"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "ongeveer een maand geleden"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "ongeveer %d maanden geleden"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "ongeveer een jaar geleden"
 
index e3e2cf80ed86f95abd7cfb33462358e4c7820208..ddd183e8704eb10c11c8514992e29f26a8c62513 100644 (file)
@@ -7,83 +7,89 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:29+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:22+0000\n"
 "Language-Team: Norwegian Nynorsk\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Godta"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Avatar-innstillingar"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Registrér"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Personvern"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "Invitér"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Blokkér"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Lagra"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Avatar-innstillingar"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Lagra"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Dette emneord finst ikkje."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -97,79 +103,88 @@ msgstr "Dette emneord finst ikkje."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Brukaren finst ikkje."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s med vener, side %d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s med vener"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Straum for vener av %s"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Straum for vener av %s"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Straum for vener av %s"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s med vener"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Oppdateringar frå %1$s og vener på %2$s!"
@@ -182,20 +197,20 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Fann ikkje API-metode."
@@ -229,8 +244,9 @@ msgstr "Kan ikkje oppdatera brukar."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Brukaren har inga profil."
 
@@ -255,7 +271,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -374,68 +390,68 @@ msgstr "Kan ikkje hente offentleg straum."
 msgid "Could not find target user."
 msgstr "Kan ikkje finna einkvan status."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Kallenamn må berre ha små bokstavar og nummer, ingen mellomrom."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Kallenamnet er allereie i bruk. Prøv eit anna."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Ikkje eit gyldig brukarnamn."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Heimesida er ikkje ei gyldig internettadresse."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Ditt fulle namn er for langt (maksimalt 255 teikn)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "skildringa er for lang (maks 140 teikn)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Plassering er for lang (maksimalt 255 teikn)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Ugyldig merkelapp: %s"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Kallenamnet er allereie i bruk. Prøv eit anna."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -447,16 +463,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Fann ikkje API-metode."
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "Du er allereie medlem av den gruppa"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Kunne ikkje melde brukaren %s inn i gruppa %s"
@@ -466,7 +482,7 @@ msgstr "Kunne ikkje melde brukaren %s inn i gruppa %s"
 msgid "You are not a member of this group."
 msgstr "Du er ikkje medlem av den gruppa."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Kunne ikkje fjerne %s fra %s gruppa "
@@ -498,7 +514,7 @@ msgstr "Ugyldig storleik."
 #: 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:309
+#: 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
@@ -507,7 +523,7 @@ msgstr "Ugyldig storleik."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -542,7 +558,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -565,13 +581,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -652,18 +668,18 @@ msgstr "Støttar ikkje bileteformatet."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s / Favorittar frå %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s tidsline"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -679,12 +695,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s offentleg tidsline"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s oppdateringar frå alle saman!"
@@ -694,17 +710,17 @@ msgstr "%s oppdateringar frå alle saman!"
 msgid "Repeated to %s"
 msgstr "Svar til %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Svar til %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notisar merka med %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Oppdateringar frå %1$s på %2$s!"
@@ -721,8 +737,7 @@ msgstr "Slikt dokument finst ikkje."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Ingen kallenamn."
 
@@ -734,7 +749,7 @@ msgstr "Ingen storleik."
 msgid "Invalid size."
 msgstr "Ugyldig storleik."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Brukarbilete"
@@ -751,30 +766,30 @@ msgid "User without matching profile"
 msgstr "Kan ikkje finne brukar"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Avatar-innstillingar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Forhandsvis"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Slett"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Last opp"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Skaler"
 
@@ -782,7 +797,7 @@ msgstr "Skaler"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Velg eit utvalg av bildet som vil blir din avatar."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Fant ikkje igjen fil data."
 
@@ -816,23 +831,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nei"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Lås opp brukaren"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Jau"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Blokkér denne brukaren"
 
@@ -840,41 +855,45 @@ msgstr "Blokkér denne brukaren"
 msgid "Failed to save block information."
 msgstr "Lagring av informasjon feila."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Denne gruppa finst ikkje."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Brukarprofil"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s med vener, side %d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 #, fuzzy
 msgid "A list of the users blocked from joining this group."
 msgstr "Ei liste over brukarane i denne gruppa."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "De-blokkering av brukar feila."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Lås opp"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Lås opp brukaren"
 
@@ -955,7 +974,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Det var eit problem med sesjons billetten din."
 
@@ -981,12 +1000,13 @@ msgstr "Kan ikkje sletta notisen."
 msgid "Delete this application"
 msgstr "Slett denne notisen"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Ikkje logga inn"
@@ -1017,7 +1037,7 @@ msgstr "Sikker på at du vil sletta notisen?"
 msgid "Do not delete this notice"
 msgstr "Kan ikkje sletta notisen."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Slett denne notisen"
 
@@ -1036,19 +1056,19 @@ msgstr "Du kan ikkje sletta statusen til ein annan brukar."
 msgid "Delete user"
 msgstr "Slett"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Slett denne notisen"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1159,6 +1179,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Lagra"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1261,31 +1292,31 @@ msgstr "Rediger %s gruppa"
 msgid "You must be logged in to create a group."
 msgstr "Du må være logga inn for å lage ei gruppe."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 må være administrator for å redigere gruppa"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Bruk dette skjemaet for å redigere gruppa"
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "skildringa er for lang (maks 140 teikn)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Kann ikkje oppdatera gruppa."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Kunne ikkje lagre favoritt."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Lagra innstillingar."
 
@@ -1635,7 +1666,7 @@ msgstr "Brukar har blokkert deg."
 msgid "User is not a member of group."
 msgstr "Du er ikkje medlem av den gruppa."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Blokker brukaren"
@@ -1672,93 +1703,93 @@ msgstr "Ingen ID"
 msgid "You must be logged in to edit a group."
 msgstr "Du må være logga inn for å lage ei gruppe."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "Grupper"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Kan ikkje oppdatera brukar."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Synkroniserings innstillingar blei lagra."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo åt gruppa"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, fuzzy, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "Du kan lasta opp ein logo for gruppa."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Kan ikkje finne brukar"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 #, fuzzy
 msgid "Pick a square area of the image to be the logo."
 msgstr "Velg eit utvalg av bildet som vil blir din avatar."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logo oppdatert."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Feil ved oppdatering av logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s medlemmar i gruppa"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%s medlemmar i gruppa, side %d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Ei liste over brukarane i denne gruppa."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blokkér"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 #, fuzzy
 msgid "Make user an admin of the group"
 msgstr "Du må være administrator for å redigere gruppa"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 #, fuzzy
 msgid "Make Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -2014,16 +2045,19 @@ msgstr "Personleg melding"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Eventuelt legg til ei personleg melding til invitasjonen."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Send"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s har invitert deg til %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2079,7 +2113,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Du må være logga inn for å bli med i ei gruppe."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Ingen kallenamn."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s blei medlem av gruppe %s"
@@ -2088,11 +2127,11 @@ msgstr "%s blei medlem av gruppe %s"
 msgid "You must be logged in to leave a group."
 msgstr "Du må være innlogga for å melde deg ut av ei gruppe."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Du er ikkje medlem av den gruppa."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s forlot %s gruppa"
@@ -2110,8 +2149,7 @@ msgstr "Feil brukarnamn eller passord"
 msgid "Error setting user. You are probably not authorized."
 msgstr "Ikkje autorisert."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Logg inn"
 
@@ -2370,8 +2408,8 @@ msgstr "Kopla til"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Ikkje eit støtta dataformat."
 
@@ -2517,7 +2555,7 @@ msgstr "Klarar ikkje lagra nytt passord."
 msgid "Password saved."
 msgstr "Lagra passord."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2550,7 +2588,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "Invitér"
@@ -2735,7 +2772,7 @@ msgstr ""
 "1-64 små bokstavar eller tal, ingen punktum (og liknande) eller mellomrom"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Fullt namn"
@@ -2764,7 +2801,7 @@ msgid "Bio"
 msgstr "Om meg"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2831,24 +2868,25 @@ msgstr "Språk er for langt (maksimalt 50 teikn)."
 msgid "Invalid tag: \"%s\""
 msgstr "Ugyldig merkelapp: %s"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Kan ikkje oppdatera brukar for automatisk tinging."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Kan ikkje lagra merkelapp."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Kan ikkje lagra profil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Kan ikkje lagra merkelapp."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Lagra innstillingar."
 
@@ -2861,48 +2899,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Kan ikkje hente offentleg straum."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Offentleg tidsline, side %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Offentleg tidsline"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Offentleg straum"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Offentleg straum"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Offentleg straum"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2911,7 +2949,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3085,8 +3123,7 @@ msgstr "Feil med stadfestingskode."
 msgid "Registration successful"
 msgstr "Registreringa gikk bra"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrér"
 
@@ -3235,7 +3272,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Ting"
 
@@ -3278,7 +3315,7 @@ msgstr "Du kan ikkje registrera deg om du ikkje godtek vilkåra i lisensen."
 msgid "You already repeated that notice."
 msgstr "Du har allereie blokkert denne brukaren."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Lag"
@@ -3288,47 +3325,47 @@ msgstr "Lag"
 msgid "Repeated!"
 msgstr "Lag"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Svar til %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Melding til %1$s på %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Notisstraum for %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Notisstraum for %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Notisstraum for %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3356,7 +3393,6 @@ msgid "User is already sandboxed."
 msgstr "Brukar har blokkert deg."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3381,7 +3417,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Avatar-innstillingar"
@@ -3416,7 +3452,7 @@ msgstr "Paginering"
 msgid "Description"
 msgstr "Beskriving"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistikk"
@@ -3478,35 +3514,35 @@ msgstr "%s's favoritt meldingar"
 msgid "Could not retrieve favorite notices."
 msgstr "Kunne ikkje hente fram favorittane."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Straum for vener av %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Straum for vener av %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Straum for vener av %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3514,7 +3550,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3528,68 +3564,68 @@ msgstr "%s gruppe"
 msgid "%1$s group, page %2$d"
 msgstr "%s medlemmar i gruppa, side %d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Gruppe profil"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Merknad"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Gruppe handlingar"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Notisstraum for %s gruppa"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Utboks for %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Medlemmar"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ingen)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Alle medlemmar"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Lag"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3599,7 +3635,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3610,7 +3646,7 @@ msgstr ""
 "**%s** er ei brukargruppe på %%%%site.name%%%%, ei [mikroblogging](http://en."
 "wikipedia.org/wiki/Micro-blogging)-teneste"
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 #, fuzzy
 msgid "Admins"
 msgstr "Administrator"
@@ -3977,15 +4013,26 @@ msgstr "Ingen innskriven kode"
 msgid "You are not subscribed to that profile."
 msgstr "Du tingar ikkje oppdateringar til den profilen."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Kunne ikkje lagra abonnement."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Ikkje ein lokal brukar."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Denne notisen finst ikkje."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Du tingar ikkje oppdateringar til den profilen."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonnent"
 
@@ -4045,7 +4092,7 @@ msgstr "Dette er dei du lyttar til."
 msgid "These are the people whose notices %s listens to."
 msgstr "Dette er folka som %s tingar oppdateringar frå."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4055,35 +4102,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s høyrer no på"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Brukarar sjølv-merka med %s, side %d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Notisstraum for %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Notisstraum for %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Notisstraum for %s"
@@ -4140,7 +4187,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Dette emneord finst ikkje."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-metoden er ikkje ferdig enno."
 
@@ -4173,76 +4220,78 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Brukar"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "Invitér nye brukarar"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Alle tingingar"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Automatisk ting notisane til dei som tingar mine (best for ikkje-menneskje)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Invitasjon(er) sendt"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "Invitasjon(er) sendt"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4429,7 +4478,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Personleg"
@@ -4470,6 +4519,11 @@ msgstr "Kann ikkje oppdatera gruppa."
 msgid "Group leave failed."
 msgstr "Gruppe profil"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Kann ikkje oppdatera gruppa."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4488,27 +4542,27 @@ msgstr "Kunne ikkje lagre melding."
 msgid "Could not update message with new URI."
 msgstr "Kunne ikkje oppdatere melding med ny URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "databasefeil ved innsetjing av skigardmerkelapp (#merkelapp): %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Feil ved lagring av notis.  Ukjend brukar."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4516,42 +4570,74 @@ msgid ""
 msgstr ""
 "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Du kan ikkje lengre legge inn notisar på denne sida."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Databasefeil, kan ikkje lagra svar: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+msgid "You have been banned from subscribing."
+msgstr "Brukaren tillet deg ikkje å tinga meldingane sine."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Brukar har blokkert deg."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Ikkje tinga."
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Kan ikkje sletta tinging."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Kan ikkje sletta tinging."
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Melding til %1$s på %2$s"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Kunne ikkje laga gruppa."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Kunne ikkje bli med i gruppa."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Kunne ikkje bli med i gruppa."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Kunne ikkje lagra abonnement."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Endra profilinnstillingane dine"
@@ -4594,123 +4680,191 @@ msgstr "Ingen tittel"
 msgid "Primary site navigation"
 msgstr "Navigasjon for hovudsida"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Heim"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personleg profil og oversyn over vener"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personleg"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Endra e-posten, avataren, passordet eller profilen"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Kopla til"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Klarte ikkje å omdirigera til tenaren: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Kopla til"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Navigasjon for hovudsida"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Invitér"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrator"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Logg ut"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Invitér"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logg ut or sida"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Logg ut"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Opprett ny konto"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrér"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Logg inn or sida"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hjelp"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Logg inn"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjelp meg!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Søk"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hjelp"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Søk etter folk eller innhald"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Søk"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Statusmelding"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Lokale syningar"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Sidenotis"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Andrenivås side navigasjon"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hjelp"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "OSS"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Personvern"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Kjeldekode"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "Dult"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNets programvarelisens"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4719,12 +4873,12 @@ msgstr ""
 "**%%site.name%%** er ei mikrobloggingteneste av [%%site.broughtby%%](%%site."
 "broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** er ei mikrobloggingteneste. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4735,105 +4889,169 @@ msgstr ""
 "%s, tilgjengeleg under [GNU Affero General Public License](http://www.fsf."
 "org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNets programvarelisens"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Alle"
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "lisens."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "« Etter"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Før »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 kan ikkje sende melding til denne brukaren."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Registrering ikkje tillatt."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "Kommando ikkje implementert."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "Kommando ikkje implementert."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Klarte ikkje å lagra Twitter-innstillingane dine!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Stadfesting av epostadresse"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Invitér"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS bekreftelse"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Personleg"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS bekreftelse"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Brukar"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS bekreftelse"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS bekreftelse"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS bekreftelse"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Personleg"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4929,12 +5147,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Endra passord"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Endra passord"
@@ -5088,83 +5306,92 @@ msgstr "Eit problem oppstod ved lagring av notis."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Spesifer namnet til brukaren du vil tinge"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Brukaren finst ikkje."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Tingar %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Spesifer namnet til brukar du vil fjerne tinging på"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Tingar ikkje %s lengre"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Kommando ikkje implementert."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notifikasjon av."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Kan ikkje skru av notifikasjon."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notifikasjon på."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Kan ikkje slå på notifikasjon."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Tingar ikkje %s lengre"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Du tingar ikkje oppdateringar til den profilen."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Du tingar allereie oppdatering frå desse brukarane:"
 msgstr[1] "Du tingar allereie oppdatering frå desse brukarane:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Kan ikkje tinga andre til deg."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Kan ikkje tinga andre til deg."
 msgstr[1] "Kan ikkje tinga andre til deg."
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Du er ikkje medlem av den gruppa."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Du er ikkje medlem av den gruppa."
 msgstr[1] "Du er ikkje medlem av den gruppa."
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5178,6 +5405,7 @@ msgid ""
 "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"
@@ -5205,20 +5433,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Ingen stadfestingskode."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Logg inn or sida"
@@ -5411,23 +5639,23 @@ msgstr "Systemfeil ved opplasting av fil."
 msgid "Not an image or corrupt file."
 msgstr "Korrupt bilete."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Støttar ikkje bileteformatet."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Mista fila vår."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Ukjend fil type"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5646,7 +5874,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " frå "
@@ -5737,6 +5965,12 @@ msgstr "Til"
 msgid "Available characters"
 msgstr "Tilgjenglege teikn"
 
+#: 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 "Send ei melding"
@@ -5770,51 +6004,51 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "Nei"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "Ingen innhald."
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Lag"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Svar på denne notisen"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Svar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Melding lagra"
@@ -5848,11 +6082,6 @@ msgstr "Feil med å henta inn ekstern profil"
 msgid "Duplicate notice"
 msgstr "Slett notis"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "Brukaren tillet deg ikkje å tinga meldingane sine."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Kan ikkje leggja til ny tinging."
@@ -5869,6 +6098,10 @@ msgstr "Svar"
 msgid "Favorites"
 msgstr "Favorittar"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Brukar"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Innboks"
@@ -5963,7 +6196,7 @@ msgstr "Svar på denne notisen"
 msgid "Repeat this notice"
 msgstr "Svar på denne notisen"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5986,6 +6219,10 @@ msgstr "Søk"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Søk"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6040,35 +6277,14 @@ msgstr "Mennesker som tingar %s"
 msgid "Groups %s is a member of"
 msgstr "Grupper %s er medlem av"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Brukar har blokkert deg."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Kan ikkje tinga."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Kan ikkje tinga andre til deg."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Ikkje tinga."
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Kan ikkje sletta tinging."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Invitér"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kan ikkje sletta tinging."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Inviter vennar og kollega til å bli med deg på %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6123,68 +6339,68 @@ msgstr "Brukarbilete"
 msgid "User actions"
 msgstr "Brukarverkty"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Profilinnstillingar"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Send ei direktemelding til denne brukaren"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Melding"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "eit par sekund sidan"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "omtrent eitt minutt sidan"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "~%d minutt sidan"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "omtrent ein time sidan"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "~%d timar sidan"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "omtrent ein dag sidan"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "~%d dagar sidan"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "omtrent ein månad sidan"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "~%d månadar sidan"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "omtrent eitt år sidan"
 
index a13f6362b4e47e358c325051555ccc6b76b641be..a8cef8d36c36438b7dafa2cac9f28cf596b47781 100644 (file)
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:35+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:35+0000\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -19,69 +19,76 @@ 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.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Dostęp"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Ustawienia dostępu witryny"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Rejestracja"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Prywatna"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Zabronić anonimowym użytkownikom (niezalogowanym) przeglądać witrynę?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Tylko zaproszeni"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Prywatna"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Rejestracja tylko za zaproszeniem."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Zamknięte"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Tylko zaproszeni"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Wyłączenie nowych rejestracji."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Zapisz"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Zamknięte"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Zapisz ustawienia dostępu"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Zapisz"
+
+#. 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 "Nie ma takiej strony"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -95,46 +102,53 @@ msgstr "Nie ma takiej strony"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Brak takiego użytkownika."
 
-#: actions/all.php:84
+#. 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 i przyjaciele, strona %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "Użytkownik %s i przyjaciele"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Kanał dla znajomych użytkownika %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Kanał dla znajomych użytkownika %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Kanał dla znajomych użytkownika %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -142,7 +156,7 @@ msgstr ""
 "To jest oś czasu użytkownika %s i przyjaciół, ale nikt jeszcze nic nie "
 "wysłał."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -151,7 +165,8 @@ msgstr ""
 "Spróbuj subskrybować więcej osób, [dołączyć do grupy](%%action.groups%%) lub "
 "wysłać coś samemu."
 
-#: actions/all.php:134
+#. 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 "
@@ -161,7 +176,7 @@ msgstr ""
 "[wysłać coś wymagającego jego uwagi](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -170,12 +185,13 @@ msgstr ""
 "Dlaczego nie [zarejestrujesz konta](%%%%action.register%%%%) i wtedy "
 "szturchniesz użytkownika %s lub wyślesz wpis wymagającego jego uwagi."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Ty i przyjaciele"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Aktualizacje z %1$s i przyjaciół na %2$s."
@@ -188,20 +204,20 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s."
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Nie odnaleziono metody API."
 
@@ -234,8 +250,9 @@ msgstr "Nie można zaktualizować użytkownika."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Użytkownik nie posiada profilu."
 
@@ -261,7 +278,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -374,68 +391,68 @@ msgstr "Nie można określić użytkownika źródłowego."
 msgid "Could not find target user."
 msgstr "Nie można odnaleźć użytkownika docelowego."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Pseudonim może zawierać tylko małe litery i cyfry, bez spacji."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Pseudonim jest już używany. Spróbuj innego."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "To nie jest prawidłowy pseudonim."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Strona domowa nie jest prawidłowym adresem URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Imię i nazwisko jest za długie (maksymalnie 255 znaków)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Opis jest za długi (maksymalnie %d znaków)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Położenie jest za długie (maksymalnie 255 znaków)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Za dużo aliasów. Maksymalnie %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Nieprawidłowy alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias \"%s\" jest już używany. Spróbuj innego."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias nie może być taki sam jak pseudonim."
@@ -446,15 +463,15 @@ msgstr "Alias nie może być taki sam jak pseudonim."
 msgid "Group not found!"
 msgstr "Nie odnaleziono grupy."
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Jesteś już członkiem tej grupy."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Zostałeś zablokowany w tej grupie przez administratora."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Nie można dołączyć użytkownika %1$s do grupy %2$s."
@@ -463,7 +480,7 @@ msgstr "Nie można dołączyć użytkownika %1$s do grupy %2$s."
 msgid "You are not a member of this group."
 msgstr "Nie jesteś członkiem tej grupy."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Nie można usunąć użytkownika %1$s z grupy %2$s."
@@ -494,7 +511,7 @@ msgstr "Nieprawidłowy token."
 #: 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:309
+#: 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
@@ -503,7 +520,7 @@ msgstr "Nieprawidłowy token."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -536,7 +553,7 @@ msgstr "Token żądania %s został odrzucony lub unieważniony."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -562,13 +579,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -644,18 +661,18 @@ msgstr "Nieobsługiwany format."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s/ulubione wpisy od %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Oś czasu użytkownika %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -671,12 +688,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Publiczna oś czasu użytkownika %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "Użytkownik %s aktualizuje od każdego."
@@ -686,17 +703,17 @@ msgstr "Użytkownik %s aktualizuje od każdego."
 msgid "Repeated to %s"
 msgstr "Powtórzone dla %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Powtórzenia %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Wpisy ze znacznikiem %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Aktualizacje ze znacznikiem %1$s na %2$s."
@@ -712,8 +729,7 @@ msgstr "Nie ma takiego załącznika."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Brak pseudonimu."
 
@@ -725,7 +741,7 @@ msgstr "Brak rozmiaru."
 msgid "Invalid size."
 msgstr "Nieprawidłowy rozmiar."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Awatar"
@@ -742,30 +758,30 @@ msgid "User without matching profile"
 msgstr "Użytkownik bez odpowiadającego profilu"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Ustawienia awatara"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Oryginał"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Podgląd"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Usuń"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Wyślij"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Przytnij"
 
@@ -773,7 +789,7 @@ msgstr "Przytnij"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Wybierz kwadratowy obszar obrazu do awatara"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Utracono dane pliku."
 
@@ -808,22 +824,22 @@ msgstr ""
 "i nie będziesz powiadamiany o żadnych odpowiedziach @ od niego."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nie"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Nie blokuj tego użytkownika"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Tak"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Zablokuj tego użytkownika"
 
@@ -831,39 +847,43 @@ msgstr "Zablokuj tego użytkownika"
 msgid "Failed to save block information."
 msgstr "Zapisanie informacji o blokadzie nie powiodło się."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Nie ma takiej grupy."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s zablokowane profile"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s zablokowane profile, strona %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Lista użytkowników zablokowanych w tej grupie."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Odblokuj użytkownika w tej grupie"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Odblokuj"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Odblokuj tego użytkownika"
 
@@ -938,7 +958,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Wystąpił problem z tokenem sesji."
 
@@ -963,12 +983,13 @@ msgstr "Nie usuwaj tej aplikacji"
 msgid "Delete this application"
 msgstr "Usuń tę aplikację"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Niezalogowany."
@@ -997,7 +1018,7 @@ msgstr "Jesteś pewien, że chcesz usunąć ten wpis?"
 msgid "Do not delete this notice"
 msgstr "Nie usuwaj tego wpisu"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Usuń ten wpis"
 
@@ -1013,7 +1034,7 @@ msgstr "Nie można usuwać lokalnych użytkowników."
 msgid "Delete user"
 msgstr "Usuń użytkownika"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1021,12 +1042,12 @@ msgstr ""
 "Na pewno usunąć tego użytkownika? Wyczyści to wszystkie dane o użytkowniku z "
 "bazy danych, bez utworzenia kopii zapasowej."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Usuń tego użytkownika"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Wygląd"
 
@@ -1101,7 +1122,7 @@ msgstr "Zmień kolory"
 
 #: actions/designadminpanel.php:510 lib/designsettings.php:191
 msgid "Content"
-msgstr "Zawartość"
+msgstr "Treść"
 
 #: actions/designadminpanel.php:523 lib/designsettings.php:204
 msgid "Sidebar"
@@ -1127,6 +1148,17 @@ msgstr "Przywróć domyślny wygląd"
 msgid "Reset back to default"
 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/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 "Zapisz"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Zapisz wygląd"
@@ -1218,29 +1250,29 @@ msgstr "Zmodyfikuj grupę %s"
 msgid "You must be logged in to create a group."
 msgstr "Musisz być zalogowany, aby utworzyć grupę."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Musisz być administratorem, aby zmodyfikować grupę."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Użyj tego formularza, aby zmodyfikować grupę."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "opis jest za długi (maksymalnie %d znaków)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Nie można zaktualizować grupy."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Nie można utworzyć aliasów."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Zapisano opcje."
 
@@ -1581,7 +1613,7 @@ msgstr "Użytkownik został już zablokował w grupie."
 msgid "User is not a member of group."
 msgstr "Użytkownik nie jest członkiem grupy."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Zablokuj użytkownika w grupie"
 
@@ -1616,86 +1648,86 @@ msgstr "Brak identyfikatora."
 msgid "You must be logged in to edit a group."
 msgstr "Musisz być zalogowany, aby zmodyfikować grupę."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Wygląd grupy"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
 msgstr "Dostosuj wygląd grupy za pomocą wybranego obrazu tła i palety kolorów."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Nie można zaktualizować wyglądu."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Zapisano preferencje wyglądu."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo grupy"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "Można wysłać obraz logo grupy. Maksymalny rozmiar pliku to %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Użytkownik bez odpowiadającego profilu."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Wybierz kwadratowy obszar obrazu, który będzie logo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Zaktualizowano logo."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Zaktualizowanie logo nie powiodło się."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Członkowie grupy %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Członkowie grupy %1$s, strona %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Lista użytkowników znajdujących się w tej grupie."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administrator"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Zablokuj"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Uczyń użytkownika administratorem grupy"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Uczyń administratorem"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Uczyń tego użytkownika administratorem"
 
-#: actions/grouprss.php:133
+#: 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."
@@ -1959,16 +1991,19 @@ msgstr "Osobista wiadomość"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Opcjonalnie dodaj osobistą wiadomość do zaproszenia."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Wyślij"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s zapraszają cię, abyś dołączył do nich w %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2029,7 +2064,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Musisz być zalogowany, aby dołączyć do grupy."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Brak pseudonimu lub identyfikatora."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "Użytkownik %1$s dołączył do grupy %2$s"
@@ -2038,11 +2077,11 @@ msgstr "Użytkownik %1$s dołączył do grupy %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Musisz być zalogowany, aby opuścić grupę."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Nie jesteś członkiem tej grupy."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "Użytkownik %1$s opuścił grupę %2$s"
@@ -2059,8 +2098,7 @@ msgstr "Niepoprawna nazwa użytkownika lub hasło."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Błąd podczas ustawiania użytkownika. Prawdopodobnie brak upoważnienia."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Zaloguj się"
 
@@ -2161,7 +2199,7 @@ msgstr "Nie można wysłać wiadomości do tego użytkownika."
 #: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:342
 #: lib/command.php:475
 msgid "No content!"
-msgstr "Brak zawartości."
+msgstr "Brak treści."
 
 #: actions/newmessage.php:158
 msgid "No recipient specified."
@@ -2199,7 +2237,7 @@ msgid ""
 "Search for notices on %%site.name%% by their contents. Separate search terms "
 "by spaces; they must be 3 characters or more."
 msgstr ""
-"Wyszukaj wpisy na %%site.name%% według ich zawartości. Oddziel wyszukiwane "
+"Wyszukaj wpisy na %%site.name%% według ich treści. Oddziel wyszukiwane "
 "terminy spacjami. Terminy muszą mieć trzy znaki lub więcej."
 
 #: actions/noticesearch.php:78
@@ -2314,8 +2352,8 @@ msgstr "typ zawartości "
 msgid "Only "
 msgstr "Tylko "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "To nie jest obsługiwany format danych."
 
@@ -2454,7 +2492,7 @@ msgstr "Nie można zapisać nowego hasła."
 msgid "Password saved."
 msgstr "Zapisano hasło."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Ścieżki"
 
@@ -2487,7 +2525,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Nieprawidłowy serwer SSL. Maksymalna długość to 255 znaków."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Witryny"
 
@@ -2662,7 +2699,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 małe litery lub liczby, bez spacji i znaków przestankowych"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Imię i nazwisko"
@@ -2690,7 +2727,7 @@ msgid "Bio"
 msgstr "O mnie"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2757,23 +2794,24 @@ msgstr "Język jest za długi (maksymalnie 50 znaków)."
 msgid "Invalid tag: \"%s\""
 msgstr "Nieprawidłowy znacznik: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Nie można zaktualizować użytkownika do automatycznej subskrypcji."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Nie można zapisać preferencji położenia."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Nie można zapisać profilu."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Nie można zapisać znaczników."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Zapisano ustawienia."
 
@@ -2786,28 +2824,28 @@ msgstr "Poza ograniczeniem strony (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Nie można pobrać publicznego strumienia."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Publiczna oś czasu, strona %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Publiczna oś czasu"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Kanał publicznego strumienia (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Kanał publicznego strumienia (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Kanał publicznego strumienia (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2816,11 +2854,11 @@ msgstr ""
 "To jest publiczna oś czasu dla %%site.name%%, ale nikt jeszcze nic nie "
 "wysłał."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Zostań pierwszym, który coś wyśle."
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2828,7 +2866,7 @@ msgstr ""
 "Dlaczego nie [zarejestrujesz konta](%%action.register%%) i zostaniesz "
 "pierwszym, który coś wyśle."
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2841,7 +2879,7 @@ msgstr ""
 "[Dołącz teraz](%%action.register%%), aby dzielić się wpisami o sobie z "
 "przyjaciółmi, rodziną i kolegami. ([Przeczytaj więcej](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3019,8 +3057,7 @@ msgstr "Nieprawidłowy kod zaproszenia."
 msgid "Registration successful"
 msgstr "Rejestracja powiodła się"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Zarejestruj się"
 
@@ -3169,7 +3206,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subskrybuj"
 
@@ -3207,7 +3244,7 @@ msgstr "Nie można powtórzyć własnego wpisu."
 msgid "You already repeated that notice."
 msgstr "Już powtórzono ten wpis."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Powtórzono"
 
@@ -3215,33 +3252,33 @@ msgstr "Powtórzono"
 msgid "Repeated!"
 msgstr "Powtórzono."
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Odpowiedzi na %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "odpowiedzi dla użytkownika %1$s, strona %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Kanał odpowiedzi dla użytkownika %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Kanał odpowiedzi dla użytkownika %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Kanał odpowiedzi dla użytkownika %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3250,7 +3287,7 @@ msgstr ""
 "To jest oś czasu wyświetlająca odpowiedzi na wpisy użytkownika %1$s, ale %2"
 "$s nie otrzymał jeszcze wpisów wymagających jego uwagi."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3259,7 +3296,7 @@ msgstr ""
 "Można nawiązać rozmowę z innymi użytkownikami, subskrybować więcej osób lub "
 "[dołączyć do grup](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3286,7 +3323,6 @@ msgid "User is already sandboxed."
 msgstr "Użytkownik jest już ograniczony."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sesje"
 
@@ -3311,7 +3347,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Włącza wyjście debugowania dla sesji."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Zapisz ustawienia witryny"
 
@@ -3341,7 +3377,7 @@ msgstr "Organizacja"
 msgid "Description"
 msgstr "Opis"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statystyki"
@@ -3404,22 +3440,22 @@ msgstr "Ulubione wpisy użytkownika %1$s, strona %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Nie można odebrać ulubionych wpisów."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Kanał dla ulubionych wpisów użytkownika %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Kanał dla ulubionych wpisów użytkownika %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Kanał dla ulubionych wpisów użytkownika %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3428,7 +3464,7 @@ msgstr ""
 "na wpisach, które chciałbyś dodać do zakładek na później lub rzucić na nie "
 "trochę światła."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3437,7 +3473,7 @@ msgstr ""
 "Użytkownik %s nie dodał jeszcze żadnych wpisów do ulubionych. Wyślij coś "
 "interesującego, aby chcieli dodać to do swoich ulubionych. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3448,7 +3484,7 @@ msgstr ""
 "[zarejestrujesz konta](%%%%action.register%%%%) i wyślesz coś "
 "interesującego, aby chcieli dodać to do swoich ulubionych. :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "To jest sposób na współdzielenie tego, co chcesz."
 
@@ -3462,67 +3498,67 @@ msgstr "Grupa %s"
 msgid "%1$s group, page %2$d"
 msgstr "Grupa %1$s, strona %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Profil grupy"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "Adres URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Wpis"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Aliasy"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Działania grupy"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Kanał wpisów dla grupy %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Kanał wpisów dla grupy %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Kanał wpisów dla grupy %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF dla grupy %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Członkowie"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Brak)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Wszyscy członkowie"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Utworzono"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3538,7 +3574,7 @@ msgstr ""
 "action.register%%%%), aby stać się częścią tej grupy i wiele więcej. "
 "([Przeczytaj więcej](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3551,7 +3587,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:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administratorzy"
 
@@ -3919,15 +3955,26 @@ msgstr "Nie podano kodu"
 msgid "You are not subscribed to that profile."
 msgstr "Nie jesteś subskrybowany do tego profilu."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Nie można zapisać subskrypcji."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Nie jest lokalnym użytkownikiem."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Ta czynność przyjmuje tylko żądania POST."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Nie ma takiego profilu."
+
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"Nie można subskrybować zdalnego profilu profilu OMB 0.1 za pomocą tej "
+"czynności."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subskrybowano"
 
@@ -3991,7 +4038,7 @@ msgstr "Osoby, których wpisy obserwujesz."
 msgid "These are the people whose notices %s listens to."
 msgstr "Osoby, których wpisy obserwuje użytkownik %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4007,35 +4054,35 @@ msgstr ""
 "twittersettings%%), można automatycznie subskrybować osoby, które tam już "
 "obserwujesz."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "Użytkownik %s nie obserwuje nikogo."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Wpisy ze znacznikiem %1$s, strona %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Kanał wpisów dla znacznika %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Kanał wpisów dla znacznika %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Kanał wpisów dla znacznika %s (Atom)"
@@ -4090,7 +4137,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Nie ma takiego znacznika."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Metoda API jest w trakcie tworzenia."
 
@@ -4122,70 +4169,72 @@ msgstr ""
 "Licencja nasłuchiwanego strumienia \"%1$s\" nie jest zgodna z licencją "
 "witryny \"%2$s\"."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Użytkownik"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Ustawienia użytkownika dla tej witryny StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Nieprawidłowe ograniczenie informacji o sobie. Musi być liczbowa."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Nieprawidłowy tekst powitania. Maksymalna długość to 255 znaków."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Nieprawidłowa domyślna subskrypcja: \"%1$s\" nie jest użytkownikiem."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Ograniczenie informacji o sobie"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Maksymalna długość informacji o sobie jako liczba znaków."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nowi użytkownicy"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Powitanie nowego użytkownika"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Tekst powitania nowych użytkowników (maksymalnie 255 znaków)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Domyślna subskrypcja"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Automatyczne subskrybowanie nowych użytkowników do tego użytkownika."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Zaproszenia"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Zaproszenia są włączone"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Czy zezwolić użytkownikom zapraszanie nowych użytkowników."
 
@@ -4380,7 +4429,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Wtyczki"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Wersja"
 
@@ -4422,6 +4471,10 @@ msgstr "Nie jest częścią grupy."
 msgid "Group leave failed."
 msgstr "Opuszczenie grupy nie powiodło się."
 
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Nie można zaktualizować lokalnej grupy."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4439,27 +4492,27 @@ msgstr "Nie można wprowadzić wiadomości."
 msgid "Could not update message with new URI."
 msgstr "Nie można zaktualizować wiadomości za pomocą nowego adresu URL."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Błąd bazy danych podczas wprowadzania znacznika mieszania: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problem podczas zapisywania wpisu. Za długi."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem podczas zapisywania wpisu. Nieznany użytkownik."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4467,41 +4520,68 @@ 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:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Zabroniono ci wysyłania wpisów na tej witrynie."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problem podczas zapisywania wpisu."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Błąd bazy danych podczas wprowadzania odpowiedzi: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Zablokowano subskrybowanie."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Już subskrybowane."
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Użytkownik zablokował cię."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Niesubskrybowane."
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Nie można usunąć autosubskrypcji."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Nie można usunąć subskrypcji."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Witaj w %1$s, @%2$s."
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Nie można utworzyć grupy."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Nie można ustawić adresu URI grupy."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Nie można ustawić członkostwa w grupie."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Nie można zapisać informacji o lokalnej grupie."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Zmień ustawienia profilu"
@@ -4543,120 +4623,190 @@ msgstr "Strona bez nazwy"
 msgid "Primary site navigation"
 msgstr "Główna nawigacja witryny"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Strona domowa"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Profil osobisty i oś czasu przyjaciół"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Osobiste"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Zmień adres e-mail, awatar, hasło, profil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Połącz"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Połącz z serwisami"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Połącz"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Zmień konfigurację witryny"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Zaproś"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administrator"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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:458
-msgid "Logout"
-msgstr "Wyloguj się"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Zaproś"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Wyloguj się z witryny"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Wyloguj się"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Utwórz konto"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Zarejestruj się"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Zaloguj się na witrynie"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Pomoc"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Zaloguj się"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Pomóż mi."
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Wyszukaj"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Pomoc"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Wyszukaj osoby lub tekst"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Wyszukaj"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Wpis witryny"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Lokalne widoki"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Wpis strony"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Druga nawigacja witryny"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Pomoc"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "O usłudze"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Prywatność"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Kod źródłowy"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Odznaka"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licencja oprogramowania StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4665,12 +4815,12 @@ msgstr ""
 "**%%site.name%%** jest usługą mikroblogowania prowadzoną przez [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** jest usługą mikroblogowania. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4681,99 +4831,164 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licencja zawartości witryny"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Wszystko "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licencja."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginacja"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Później"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Wcześniej"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Nie można jeszcze obsługiwać zdalnej treści."
+
+#: lib/activity.php:477
+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
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Nie można jeszcze obsługiwać zagnieżdżonej treści Base64."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Nie można wprowadzić zmian witryny."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Zmiany w tym panelu nie są dozwolone."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() nie jest zaimplementowane."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() nie jest zaimplementowane."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Nie można usunąć ustawienia wyglądu."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Podstawowa konfiguracja witryny"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Witryny"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Konfiguracja wyglądu"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Wygląd"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Konfiguracja użytkownika"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Użytkownik"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Konfiguracja dostępu"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Konfiguracja ścieżek"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Konfiguracja sesji"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sesje"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "Zasób API wymaga dostępu do zapisu i do odczytu, ale powiadasz dostęp tylko "
 "do odczytu."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4866,11 +5081,11 @@ msgstr "Powiadamia, kiedy pojawia się ten załącznik"
 msgid "Tags for this attachment"
 msgstr "Znaczniki dla tego załącznika"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Zmiana hasła nie powiodła się"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Zmiana hasła nie jest dozwolona"
 
@@ -5021,85 +5236,94 @@ msgstr "Błąd podczas zapisywania wpisu."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Podaj nazwę użytkownika do subskrybowania."
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Brak takiego użytkownika."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Subskrybowano użytkownika %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Podaj nazwę użytkownika do usunięcia subskrypcji."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Usunięto subskrypcję użytkownika %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Nie zaimplementowano polecenia."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Wyłączono powiadomienia."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Nie można wyłączyć powiadomień."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Włączono powiadomienia."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Nie można włączyć powiadomień."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Polecenie logowania jest wyłączone"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Tego odnośnika można użyć tylko raz i będzie prawidłowy tylko przez dwie "
 "minuty: %s."
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Usunięto subskrypcję użytkownika %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Nie subskrybujesz nikogo."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Subskrybujesz tę osobę:"
 msgstr[1] "Subskrybujesz te osoby:"
 msgstr[2] "Subskrybujesz te osoby:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Nikt cię nie subskrybuje."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Ta osoba cię subskrybuje:"
 msgstr[1] "Te osoby cię subskrybują:"
 msgstr[2] "Te osoby cię subskrybują:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Nie jesteś członkiem żadnej grupy."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Jesteś członkiem tej grupy:"
 msgstr[1] "Jesteś członkiem tych grup:"
 msgstr[2] "Jesteś członkiem tych grup:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5113,6 +5337,7 @@ msgid ""
 "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"
@@ -5143,14 +5368,15 @@ msgstr ""
 "on - włącza powiadomienia\n"
 "off - wyłącza powiadomienia\n"
 "help - wyświetla tę pomoc\n"
-"follow <pseudonim> - włącza obserwowanie użytkownika\n"
+"follow <pseudonim> - subskrybuje użytkownika\n"
 "groups - wyświetla listę grup, do których dołączyłeś\n"
 "subscriptions - wyświetla listę obserwowanych osób\n"
 "subscribers - wyświetla listę osób, które cię obserwują\n"
-"leave <pseudonim> - rezygnuje z obserwowania użytkownika\n"
+"leave <pseudonim> - usuwa subskrypcję użytkownika\n"
 "d <pseudonim> <tekst> - bezpośrednia wiadomość do użytkownika\n"
 "get <pseudonim> - zwraca ostatni wpis użytkownika\n"
 "whois <pseudonim> - zwraca informacje o profilu użytkownika\n"
+"lose <pseudonim> - wymusza użytkownika do zatrzymania obserwowania cię\n"
 "fav <pseudonim> - dodaje ostatni wpis użytkownika jako \"ulubiony\"\n"
 "fav #<identyfikator_wpisu> - dodaje wpis z podanym identyfikatorem jako "
 "\"ulubiony\"\n"
@@ -5179,19 +5405,19 @@ msgstr ""
 "tracks - jeszcze nie zaimplementowano\n"
 "tracking - jeszcze nie zaimplementowano\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Nie odnaleziono pliku konfiguracji."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Szukano plików konfiguracji w następujących miejscach: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Należy uruchomić instalator, aby to naprawić."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Przejdź do instalatora."
 
@@ -5381,23 +5607,23 @@ msgstr "Błąd systemu podczas wysyłania pliku."
 msgid "Not an image or corrupt file."
 msgstr "To nie jest obraz lub lub plik jest uszkodzony."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Nieobsługiwany format pliku obrazu."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Utracono plik."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Nieznany typ pliku"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "KB"
 
@@ -5688,7 +5914,7 @@ msgstr ""
 "rozmowę z innymi użytkownikami. Inni mogą wysyłać ci wiadomości tylko dla "
 "twoich oczu."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "z"
 
@@ -5778,6 +6004,11 @@ msgstr "Do"
 msgid "Available characters"
 msgstr "Dostępne znaki"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Wyślij"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Wyślij wpis"
@@ -5811,48 +6042,48 @@ msgstr ""
 "Pobieranie danych geolokalizacji trwa dłużej niż powinno, proszę spróbować "
 "ponownie później"
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "Północ"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "Południe"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "Wschód"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "Zachód"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "w"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "w rozmowie"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Powtórzone przez"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Odpowiedz na ten wpis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Odpowiedz"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Powtórzono wpis"
 
@@ -5884,10 +6115,6 @@ msgstr "Błąd podczas wprowadzania zdalnego profilu"
 msgid "Duplicate notice"
 msgstr "Duplikat wpisu"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Zablokowano subskrybowanie."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Nie można wprowadzić nowej subskrypcji."
@@ -5904,6 +6131,10 @@ msgstr "Odpowiedzi"
 msgid "Favorites"
 msgstr "Ulubione"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Użytkownik"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Odebrane"
@@ -5993,7 +6224,7 @@ msgstr "Powtórzyć ten wpis?"
 msgid "Repeat this notice"
 msgstr "Powtórz ten wpis"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 "Nie określono pojedynczego użytkownika dla trybu pojedynczego użytkownika."
@@ -6014,6 +6245,10 @@ msgstr "Przeszukaj witrynę"
 msgid "Keyword(s)"
 msgstr "Słowa kluczowe"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Wyszukaj"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Przeszukaj pomoc"
@@ -6065,33 +6300,14 @@ msgstr "Osoby subskrybowane do %s"
 msgid "Groups %s is a member of"
 msgstr "Grupy %s są członkiem"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Już subskrybowane."
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Użytkownik zablokował cię."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Nie można subskrybować."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Nie można subskrybować innych do ciebie."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Niesubskrybowane."
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Nie można usunąć autosubskrypcji."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Zaproś"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Nie można usunąć subskrypcji."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Zaproś przyjaciół i kolegów do dołączenia do ciebie na %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6143,67 +6359,67 @@ msgstr "Zmodyfikuj awatar"
 msgid "User actions"
 msgstr "Czynności użytkownika"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Zmodyfikuj ustawienia profilu"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Edycja"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Wyślij bezpośrednią wiadomość do tego użytkownika"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Wiadomość"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderuj"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "kilka sekund temu"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "około minutę temu"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "około %d minut temu"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "około godzinę temu"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "około %d godzin temu"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "blisko dzień temu"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "około %d dni temu"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "około miesiąc temu"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "około %d miesięcy temu"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "około rok temu"
 
index a2c8fd60cc438ffdb729c2f23fe30b101e26b6b0..2598008d9b811edcdd7226e3d013cf98734da73b 100644 (file)
@@ -9,78 +9,85 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:39+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:38+0000\n"
 "Language-Team: Portuguese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Acesso"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Gravar configurações do site"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Registar"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privado"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Proibir utilizadores anónimos (sem sessão iniciada) de ver o site?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Só por convite"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privado"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Permitir o registo só a convidados."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Fechado"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Só por convite"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Impossibilitar registos novos."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Gravar"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Fechado"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Gravar configurações do site"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Gravar"
+
+#. 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 "Página não encontrada."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -94,53 +101,60 @@ msgstr "Página não encontrada."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Utilizador não encontrado."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "Perfis bloqueados de %1$s, página %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s e amigos"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Fonte para os amigos de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Fonte para os amigos de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Fonte para os amigos de %s (Atom)"
 
-#: actions/all.php:127
+#. 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 ""
 "Estas são as notas de %s e dos amigos, mas ainda não publicaram nenhuma."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -149,7 +163,8 @@ msgstr ""
 "Tente subscrever mais pessoas, [juntar-se a um grupo] (%%action.groups%%) ou "
 "publicar qualquer coisa."
 
-#: actions/all.php:134
+#. 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 "
@@ -158,7 +173,7 @@ msgstr ""
 "Pode tentar [dar um toque em %1$s](../%2$s) a partir do perfil ou [publicar "
 "qualquer coisa à sua atenção](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -167,12 +182,13 @@ msgstr ""
 "Podia [registar uma conta](%%action.register%%) e depois tocar %s ou "
 "publicar uma nota à sua atenção."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Você e seus amigos"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Actualizações de %1$s e amigos no %2$s!"
@@ -185,20 +201,20 @@ msgstr "Actualizações de %1$s e amigos no %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método da API não encontrado."
 
@@ -231,8 +247,9 @@ msgstr "Não foi possível actualizar o utilizador."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Utilizador não tem perfil."
 
@@ -258,7 +275,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -370,68 +387,68 @@ msgstr "Não foi possível determinar o utilizador de origem."
 msgid "Could not find target user."
 msgstr "Não foi possível encontrar o utilizador de destino."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Utilizador só deve conter letras minúsculas e números. Sem espaços."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Utilizador já é usado. Tente outro."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Utilizador não é válido."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Página de ínicio não é uma URL válida."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Nome completo demasiado longo (máx. 255 caracteres)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Descrição demasiado longa (máx. 140 caracteres)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Localidade demasiado longa (máx. 255 caracteres)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Demasiados sinónimos (máx. %d)."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Sinónimo inválido: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Sinónimo \"%s\" já em uso. Tente outro."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Os sinónimos não podem ser iguais ao nome do utilizador."
@@ -442,15 +459,15 @@ msgstr "Os sinónimos não podem ser iguais ao nome do utilizador."
 msgid "Group not found!"
 msgstr "Grupo não foi encontrado!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Já é membro desse grupo."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Foi bloqueado desse grupo pelo gestor."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Não foi possível adicionar %1$s ao grupo %2$s."
@@ -459,7 +476,7 @@ msgstr "Não foi possível adicionar %1$s ao grupo %2$s."
 msgid "You are not a member of this group."
 msgstr "Não é membro deste grupo."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Não foi possível remover %1$s do grupo %2$s."
@@ -491,7 +508,7 @@ msgstr "Tamanho inválido."
 #: 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:309
+#: 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
@@ -500,7 +517,7 @@ msgstr "Tamanho inválido."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -535,7 +552,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -558,13 +575,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Conta"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -642,18 +659,18 @@ msgstr "Formato não suportado."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favoritas de %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Notas de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -669,12 +686,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "Notas públicas de %s"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s actualizações de todos!"
@@ -684,17 +701,17 @@ msgstr "%s actualizações de todos!"
 msgid "Repeated to %s"
 msgstr "Repetida para %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Repetências de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notas categorizadas com %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Actualizações categorizadas com %1$s em %2$s!"
@@ -710,8 +727,7 @@ msgstr "Anexo não encontrado."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Nenhuma utilizador."
 
@@ -723,7 +739,7 @@ msgstr "Tamanho não definido."
 msgid "Invalid size."
 msgstr "Tamanho inválido."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -740,30 +756,30 @@ msgid "User without matching profile"
 msgstr "Utilizador sem perfil correspondente"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Configurações do avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Antevisão"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Apagar"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Carregar"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Cortar"
 
@@ -771,7 +787,7 @@ msgstr "Cortar"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Escolha uma área quadrada da imagem para ser o seu avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Perdi os dados do nosso ficheiro."
 
@@ -806,22 +822,22 @@ msgstr ""
 "de futuro e você não receberá notificações das @-respostas dele."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Não"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Não bloquear este utilizador"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Sim"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Bloquear este utilizador"
 
@@ -829,39 +845,43 @@ msgstr "Bloquear este utilizador"
 msgid "Failed to save block information."
 msgstr "Não foi possível gravar informação do bloqueio."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Grupo não foi encontrado."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s perfis bloqueados"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Perfis bloqueados de %1$s, página %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Uma lista dos utilizadores com entrada bloqueada neste grupo."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Desbloquear utilizador do grupo"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Desbloquear"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Desbloquear este utilizador"
 
@@ -940,7 +960,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com a sua sessão."
 
@@ -969,12 +989,13 @@ msgstr "Não apagar esta nota"
 msgid "Delete this application"
 msgstr "Apagar esta nota"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Não iniciou sessão."
@@ -1003,7 +1024,7 @@ msgstr "Tem a certeza de que quer apagar esta nota?"
 msgid "Do not delete this notice"
 msgstr "Não apagar esta nota"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Apagar esta nota"
 
@@ -1019,7 +1040,7 @@ msgstr "Só pode apagar utilizadores locais."
 msgid "Delete user"
 msgstr "Apagar utilizador"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1027,12 +1048,12 @@ msgstr ""
 "Tem a certeza de que quer apagar este utilizador? Todos os dados do "
 "utilizador serão eliminados da base de dados, sem haver cópias."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Apagar este utilizador"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Estilo"
 
@@ -1135,6 +1156,17 @@ msgstr "Repor estilos predefinidos"
 msgid "Reset back to default"
 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/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 "Gravar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Gravar o estilo"
@@ -1238,29 +1270,29 @@ msgstr "Editar grupo %s"
 msgid "You must be logged in to create a group."
 msgstr "Tem de iniciar uma sessão para criar o grupo."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Tem de ser administrador para editar o grupo."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Use este formulário para editar o grupo."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "descrição é demasiada extensa (máx. %d caracteres)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Não foi possível actualizar o grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Não foi possível criar sinónimos."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Opções gravadas."
 
@@ -1604,7 +1636,7 @@ msgstr "Acesso do utilizador ao grupo já foi bloqueado."
 msgid "User is not a member of group."
 msgstr "Utilizador não é membro do grupo."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Bloquear acesso do utilizador ao grupo"
 
@@ -1639,11 +1671,11 @@ msgstr "Sem ID."
 msgid "You must be logged in to edit a group."
 msgstr "Precisa de iniciar sessão para editar um grupo."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Estilo do grupo"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1651,20 +1683,20 @@ msgstr ""
 "Personalize o aspecto do seu grupo com uma imagem de fundo e uma paleta de "
 "cores à sua escolha."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Não foi possível actualizar o estilo."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Preferências de estilo foram gravadas."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logotipo do grupo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1672,57 +1704,57 @@ msgstr ""
 "Pode carregar uma imagem para logotipo do seu grupo. O tamanho máximo do "
 "ficheiro é %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Utilizador sem perfil correspondente."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Escolha uma área quadrada da imagem para ser o logotipo."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logotipo actualizado."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Não foi possível actualizar o logotipo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Membros do grupo %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Membros do grupo %1$s, página %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Uma lista dos utilizadores neste grupo."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Gestor"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloquear"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Tornar utilizador o gestor do grupo"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Tornar Gestor"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Tornar este utilizador um gestor"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1987,16 +2019,19 @@ msgstr "Mensagem pessoal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Pode optar por acrescentar uma mensagem pessoal ao convite"
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Enviar"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s convidou-o a juntar-se a ele no %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2056,7 +2091,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Precisa de iniciar uma sessão para se juntar a um grupo."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Nenhuma utilizador."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s juntou-se ao grupo %2$s"
@@ -2065,11 +2105,11 @@ msgstr "%1$s juntou-se ao grupo %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Precisa de iniciar uma sessão para deixar um grupo."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Não é um membro desse grupo."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s deixou o grupo %2$s"
@@ -2086,8 +2126,7 @@ msgstr "Nome de utilizador ou senha incorrectos."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Erro ao preparar o utilizador. Provavelmente não está autorizado."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Entrar"
 
@@ -2347,8 +2386,8 @@ msgstr "tipo de conteúdo "
 msgid "Only "
 msgstr "Apenas "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Formato de dados não suportado."
 
@@ -2494,7 +2533,7 @@ msgstr "Não é possível guardar a nova senha."
 msgid "Password saved."
 msgstr "Senha gravada."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Localizações"
 
@@ -2527,7 +2566,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Servidor SSL inválido. O tamanho máximo é 255 caracteres."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Site"
 
@@ -2701,7 +2739,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 letras minúsculas ou números, sem pontuação ou espaços"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nome completo"
@@ -2729,7 +2767,7 @@ msgid "Bio"
 msgstr "Biografia"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2795,23 +2833,24 @@ msgstr "Idioma é demasiado extenso (máx. 50 caracteres)."
 msgid "Invalid tag: \"%s\""
 msgstr "Categoria inválida: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Não foi possível actualizar o utilizador para subscrição automática."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Não foi possível gravar as preferências de localização."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Não foi possível gravar o perfil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Não foi possível gravar as categorias."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Configurações gravadas."
 
@@ -2824,28 +2863,28 @@ msgstr "Além do limite de página (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Não foi possível importar as notas públicas."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Notas públicas, página %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Notas públicas"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Fonte de Notas Públicas (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Fonte de Notas Públicas (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Fonte de Notas Públicas (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2854,11 +2893,11 @@ msgstr ""
 "Estas são as notas públicas do site %%site.name%% mas ninguém publicou nada "
 "ainda."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Seja a primeira pessoa a publicar!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2866,7 +2905,7 @@ msgstr ""
 "Podia [registar uma conta](%%action.register%%) e ser a primeira pessoa a "
 "publicar!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2879,7 +2918,7 @@ msgstr ""
 "[StatusNet](http://status.net/). [Registe-se agora](%%action.register%%) "
 "para partilhar notas sobre si, família e amigos! ([Saber mais](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3061,8 +3100,7 @@ msgstr "Desculpe, código de convite inválido."
 msgid "Registration successful"
 msgstr "Registo efectuado"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registar"
 
@@ -3210,7 +3248,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Subscrever"
 
@@ -3248,7 +3286,7 @@ msgstr "Não pode repetir a sua própria nota."
 msgid "You already repeated that notice."
 msgstr "Já repetiu essa nota."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repetida"
 
@@ -3256,33 +3294,33 @@ msgstr "Repetida"
 msgid "Repeated!"
 msgstr "Repetida!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Respostas a %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Respostas a %1$s em %2$s!"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Fonte de respostas a %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Fonte de respostas a %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Fonte de respostas a %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3291,7 +3329,7 @@ msgstr ""
 "Estas são as notas de resposta a %1$s, mas %2$s ainda não recebeu nenhuma "
 "resposta."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3300,7 +3338,7 @@ msgstr ""
 "Pode meter conversa com outros utilizadores, subscrever mais pessoas ou "
 "[juntar-se a grupos](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3327,7 +3365,6 @@ msgid "User is already sandboxed."
 msgstr "Utilizador já está impedido de criar notas públicas."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessões"
 
@@ -3353,7 +3390,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Gravar configurações do site"
 
@@ -3386,7 +3423,7 @@ msgstr "Paginação"
 msgid "Description"
 msgstr "Descrição"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Estatísticas"
@@ -3449,22 +3486,22 @@ msgstr "Notas favoritas de %s"
 msgid "Could not retrieve favorite notices."
 msgstr "Não foi possível importar notas favoritas."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Fonte dos favoritos de %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Fonte dos favoritos de %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Fonte dos favoritos de %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3473,7 +3510,7 @@ msgstr ""
 "notas de que goste, para marcá-las para mais tarde ou para lhes dar "
 "relevância."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3482,7 +3519,7 @@ msgstr ""
 "%s ainda não adicionou nenhuma nota às favoritas. Publique algo interessante "
 "que mude este estado de coisas :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3493,7 +3530,7 @@ msgstr ""
 "conta](%%action.register%%) e publicar algo interessante que mude este "
 "estado de coisas :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Esta é uma forma de partilhar aquilo de que gosta."
 
@@ -3507,67 +3544,67 @@ msgstr "Grupo %s"
 msgid "%1$s group, page %2$d"
 msgstr "Membros do grupo %1$s, página %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Perfil do grupo"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Anotação"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Sinónimos"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Acções do grupo"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de notas do grupo %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de notas do grupo %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de notas do grupo %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF do grupo %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nenhum)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Todos os membros"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Criado"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3583,7 +3620,7 @@ msgstr ""
 "[Registe-se agora](%%action.register%%) para se juntar a este grupo e a "
 "muitos mais! ([Saber mais](%%doc.help%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3596,7 +3633,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:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Gestores"
 
@@ -3964,15 +4001,26 @@ msgstr "Nenhum código introduzido"
 msgid "You are not subscribed to that profile."
 msgstr "Não subscreveu esse perfil."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Não foi possível gravar a subscrição."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "O utilizador não é local."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Ficheiro não foi encontrado."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Não subscreveu esse perfil."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subscrito"
 
@@ -4036,7 +4084,7 @@ msgstr "Estas são as pessoas cujas notas está a escutar."
 msgid "These are the people whose notices %s listens to."
 msgstr "Estas são as pessoas cujas notas %s está a escutar."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4052,35 +4100,35 @@ msgstr ""
 "twittersettings%%) pode subscrever automaticamente as pessoas que já segue "
 "lá."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s não está a ouvir ninguém."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Utilizadores auto-categorizados com %1$s - página %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Fonte de notas para a categoria %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Fonte de notas para a categoria %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Fonte de notas para a categoria %s (Atom)"
@@ -4134,7 +4182,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Categoria não existe."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Método da API em desenvolvimento."
 
@@ -4166,70 +4214,72 @@ msgstr ""
 "Licença ‘%1$s’ da listenee stream não é compatível com a licença ‘%2$s’ do "
 "site."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Utilizador"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Configurações do utilizador para este site StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Limite da biografia inválido. Tem de ser numérico."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Texto de boas-vindas inválido. Tamanho máx. é 255 caracteres."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Subscrição predefinida é inválida: '%1$s' não é utilizador."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Perfil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Limite da Biografia"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Tamanho máximo de uma biografia em caracteres."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Utilizadores novos"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Boas-vindas a utilizadores novos"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Texto de boas-vindas a utilizadores novos (máx. 255 caracteres)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Subscrição predefinida"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Novos utilizadores subscrevem automaticamente este utilizador."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Convites"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Convites habilitados"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Permitir, ou não, que utilizadores convidem utilizadores novos."
 
@@ -4424,7 +4474,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugins"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Versão"
 
@@ -4467,6 +4517,11 @@ msgstr "Não foi possível actualizar o grupo."
 msgid "Group leave failed."
 msgstr "Perfil do grupo"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Não foi possível actualizar o grupo."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4484,27 +4539,27 @@ msgstr "Não foi possível inserir a mensagem."
 msgid "Could not update message with new URI."
 msgstr "Não foi possível actualizar a mensagem com a nova URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro na base de dados ao inserir a marca: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problema na gravação da nota. Demasiado longa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema na gravação da nota. Utilizador desconhecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4512,42 +4567,71 @@ msgstr ""
 "Demasiadas mensagens duplicadas, demasiado rápido; descanse e volte a "
 "publicar daqui a alguns minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Está proibido de publicar notas neste site."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problema na gravação da nota."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problema na gravação da nota."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Ocorreu um erro na base de dados ao inserir a resposta: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Foi bloqueado de fazer subscrições"
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Já subscrito!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "O utilizador bloqueou-o."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Não subscrito!"
+
+#: classes/Subscription.php:163
+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
+msgid "Couldn't delete subscription."
+msgstr "Não foi possível apagar a subscrição."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%1$s dá-lhe as boas-vindas, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Não foi possível configurar membros do grupo."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar membros do grupo."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Não foi possível gravar a subscrição."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Modificar as suas definições de perfil"
@@ -4589,120 +4673,190 @@ msgstr "Página sem título"
 msgid "Primary site navigation"
 msgstr "Navegação primária deste site"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Início"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil pessoal e notas dos amigos"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Pessoal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Altere o seu endereço electrónico, avatar, senha, perfil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Ligar"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Conta"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Ligar aos serviços"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Ligar"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Alterar a configuração do site"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Convidar"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Gestor"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Sair"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Convidar"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Terminar esta sessão"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Sair"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Criar uma conta"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registar"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Iniciar uma sessão"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Ajuda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Entrar"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajudem-me!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Pesquisa"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Ajuda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Procurar pessoas ou pesquisar texto"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Pesquisa"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Aviso do site"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Vistas locais"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Aviso da página"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navegação secundária deste site"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Ajuda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Termos"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Código"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contacto"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Emblema"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licença de software do StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4711,12 +4865,12 @@ msgstr ""
 "**%%site.name%%** é um serviço de microblogues disponibilizado por [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é um serviço de microblogues. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4727,96 +4881,161 @@ msgstr ""
 "disponibilizado nos termos da [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licença de conteúdos do site"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Tudo "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Posteriores"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Anteriores"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Não pode fazer alterações a este site."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Não são permitidas alterações a esse painel."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() não implementado."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() não implementado."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Não foi possível apagar a configuração do estilo."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configuração básica do site"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configuração do estilo"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Estilo"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Configuração das localizações"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Utilizador"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Configuração do estilo"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configuração das localizações"
 
-#: lib/adminpanelaction.php:337
+#. 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
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Configuração do estilo"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessões"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4911,11 +5130,11 @@ msgstr "Notas em que este anexo aparece"
 msgid "Tags for this attachment"
 msgstr "Categorias para este anexo"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Não foi possível mudar a palavra-chave"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Não é permitido mudar a palavra-chave"
 
@@ -5066,82 +5285,93 @@ msgstr "Erro ao gravar nota."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Introduza o nome do utilizador para subscrever"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Utilizador não encontrado."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Subscreveu %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Introduza o nome do utilizador para deixar de subscrever"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Deixou de subscrever %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Comando ainda não implementado."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificação desligada."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Não foi possível desligar a notificação."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificação ligada."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Não foi possível ligar a notificação."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Comando para iniciar sessão foi desactivado"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Esta ligação é utilizável uma única vez e só durante os próximos 2 minutos: %"
 "s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Deixou de subscrever %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Não subscreveu ninguém."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Subscreveu esta pessoa:"
 msgstr[1] "Subscreveu estas pessoas:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Ninguém subscreve as suas notas."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Esta pessoa subscreve as suas notas:"
 msgstr[1] "Estas pessoas subscrevem as suas notas:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Não está em nenhum grupo."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Está no grupo:"
 msgstr[1] "Está nos grupos:"
 
-#: lib/command.php:728
+#: lib/command.php:769
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5155,6 +5385,7 @@ msgid ""
 "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"
@@ -5219,19 +5450,19 @@ msgstr ""
 "tracks - ainda não implementado.\n"
 "tracking - ainda não implementado.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Ficheiro de configuração não encontrado. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Procurei ficheiros de configuração nos seguintes sítios: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Talvez queira correr o instalador para resolver esta questão."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Ir para o instalador."
 
@@ -5421,23 +5652,23 @@ msgstr "Ocorreu um erro de sistema ao transferir o ficheiro."
 msgid "Not an image or corrupt file."
 msgstr "Ficheiro não é uma imagem ou está corrompido."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato do ficheiro da imagem não é suportado."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Perdi o nosso ficheiro."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tipo do ficheiro é desconhecido"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5727,7 +5958,7 @@ msgstr ""
 "conversa com outros utilizadores. Outros podem enviar-lhe mensagens, a que "
 "só você terá acesso."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "de"
 
@@ -5820,6 +6051,12 @@ msgstr "Para"
 msgid "Available characters"
 msgstr "Caracteres disponíveis"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Enviar"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Enviar uma nota"
@@ -5852,48 +6089,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "E"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "O"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "coords."
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "no contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Repetida por"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Responder a esta nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Nota repetida"
 
@@ -5925,10 +6162,6 @@ msgstr "Erro ao inserir perfil remoto"
 msgid "Duplicate notice"
 msgstr "Nota duplicada"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Foi bloqueado de fazer subscrições"
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Não foi possível inserir nova subscrição."
@@ -5945,6 +6178,10 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritas"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Utilizador"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Recebidas"
@@ -6034,7 +6271,7 @@ msgstr "Repetir esta nota?"
 msgid "Repeat this notice"
 msgstr "Repetir esta nota"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6054,6 +6291,10 @@ msgstr "Pesquisar site"
 msgid "Keyword(s)"
 msgstr "Categorias"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Pesquisa"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Pesquisar ajuda"
@@ -6105,33 +6346,14 @@ msgstr "Pessoas que subscrevem %s"
 msgid "Groups %s is a member of"
 msgstr "Grupos de que %s é membro"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Já subscrito!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "O utilizador bloqueou-o."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Não foi possível subscrever."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Não foi possível que outro o subscrevesse."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Não subscrito!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Não foi possível apagar a auto-subscrição."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Convidar"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Não foi possível apagar a subscrição."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Convidar amigos e colegas para se juntarem a si em %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6183,67 +6405,67 @@ msgstr "Editar Avatar"
 msgid "User actions"
 msgstr "Acções do utilizador"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Editar configurações do perfil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Editar"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Enviar mensagem directa a este utilizador"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Mensagem"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "há alguns segundos"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "há cerca de um minuto"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "há cerca de %d minutos"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "há cerca de uma hora"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "há cerca de %d horas"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "há cerca de um dia"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "há cerca de %d dias"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "há cerca de um mês"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "há cerca de %d meses"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "há cerca de um ano"
 
index b9ffc361b4831a0dce2731f5b9b841d3a049177f..041a2d4a3f8e53471ebd4fd49f52ad30727ad0c1 100644 (file)
@@ -11,75 +11,82 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:07:20+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:41+0000\n"
 "Language-Team: Brazilian Portuguese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Acesso"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Configurações de acesso ao site"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registro"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Particular"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr "Impedir usuários anônimos (não autenticados) de visualizar o site?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Somente convidados"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Particular"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Cadastro liberado somente para convidados."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Fechado"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Somente convidados"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Desabilita novos registros."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Salvar"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Fechado"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Salvar as configurações de acesso"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Salvar"
+
+#. 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 "Esta página não existe."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,46 +100,53 @@ msgstr "Esta página não existe."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Este usuário não existe."
 
-#: actions/all.php:84
+#. 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 e amigos, pág. %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s e amigos"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Fonte de mensagens dos amigos de %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Fonte de mensagens dos amigos de %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Fonte de mensagens dos amigos de %s (Atom)"
 
-#: actions/all.php:127
+#. 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."
@@ -140,7 +154,7 @@ msgstr ""
 "Esse é o fluxo de mensagens de %s e seus amigos, mas ninguém publicou nada "
 "ainda."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -149,7 +163,8 @@ msgstr ""
 "Tente assinar mais pessoas, [unir-ser a um grupo](%%action.groups%%) ou "
 "publicar algo."
 
-#: actions/all.php:134
+#. 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 "
@@ -159,7 +174,7 @@ msgstr ""
 "[publicar alguma coisa que desperte seu interesse](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -168,7 +183,8 @@ msgstr ""
 "Por que não [registrar uma conta](%%%%action.register%%%%) e então chamar a "
 "atenção de %s ou publicar uma mensagem para sua atenção."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Você e amigos"
 
@@ -186,20 +202,20 @@ msgstr "Atualizações de %1$s e amigos no %2$s!"
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "O método da API não foi encontrado!"
 
@@ -233,8 +249,9 @@ msgstr "Não foi possível atualizar o usuário."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "O usuário não tem perfil."
 
@@ -260,7 +277,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -372,7 +389,7 @@ msgstr "Não foi possível determinar o usuário de origem."
 msgid "Could not find target user."
 msgstr "Não foi possível encontrar usuário de destino."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -380,62 +397,62 @@ msgstr ""
 "A identificação deve conter apenas letras minúsculas e números e não pode "
 "ter e espaços."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Esta identificação já está em uso. Tente outro."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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ão é uma identificação válida."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "A URL informada não é válida."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Nome completo muito extenso (máx. 255 caracteres)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Descrição muito extensa (máximo %d caracteres)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Localização muito extensa (máx. 255 caracteres)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Muitos apelidos! O máximo são %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Apelido inválido: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "O apelido \"%s\" já está em uso. Tente outro."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "O apelido não pode ser igual à identificação."
@@ -446,15 +463,15 @@ msgstr "O apelido não pode ser igual à identificação."
 msgid "Group not found!"
 msgstr "O grupo não foi encontrado!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Você já é membro desse grupo."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "O administrador desse grupo bloqueou sua inscrição."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Não foi possível associar o usuário %1$s ao grupo %2$s."
@@ -463,7 +480,7 @@ msgstr "Não foi possível associar o usuário %1$s ao grupo %2$s."
 msgid "You are not a member of this group."
 msgstr "Você não é membro deste grupo."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Não foi possível remover o usuário %1$s do grupo %2$s."
@@ -494,7 +511,7 @@ msgstr "Token inválido."
 #: 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:309
+#: 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
@@ -503,7 +520,7 @@ msgstr "Token inválido."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -540,7 +557,7 @@ msgstr "O token %s solicitado foi negado e revogado."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -567,13 +584,13 @@ msgstr ""
 "fornecer acesso à sua conta %4$s somente para terceiros nos quais você "
 "confia."
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Conta"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -655,12 +672,12 @@ 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Mensagens de %s"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -696,7 +713,7 @@ msgstr "Repetida para %s"
 msgid "Repeats of %s"
 msgstr "Repetições de %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Mensagens etiquetadas como %s"
@@ -717,8 +734,7 @@ msgstr "Este anexo não existe."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Nenhuma identificação."
 
@@ -730,7 +746,7 @@ msgstr "Sem tamanho definido."
 msgid "Invalid size."
 msgstr "Tamanho inválido."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -748,30 +764,30 @@ msgid "User without matching profile"
 msgstr "Usuário sem um perfil correspondente"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Configurações do avatar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Original"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Visualização"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Excluir"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Enviar"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Cortar"
 
@@ -779,7 +795,7 @@ msgstr "Cortar"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Selecione uma área quadrada da imagem para ser seu avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Os dados do nosso arquivo foram perdidos."
 
@@ -815,22 +831,22 @@ msgstr ""
 "você."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Não"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Não bloquear este usuário"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Sim"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Bloquear este usuário"
 
@@ -838,39 +854,43 @@ msgstr "Bloquear este usuário"
 msgid "Failed to save block information."
 msgstr "Não foi possível salvar a informação de bloqueio."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Esse grupo não existe."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "Perfis bloqueados no %s"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Perfis bloqueados no %1$s, pág. %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Uma lista dos usuários proibidos de se associarem a este grupo."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Desbloquear o usuário do grupo"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Desbloquear"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Desbloquear este usuário"
 
@@ -945,7 +965,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com o seu token de sessão."
 
@@ -971,12 +991,13 @@ msgstr "Não excluir esta aplicação"
 msgid "Delete this application"
 msgstr "Excluir esta aplicação"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Você não está autenticado."
@@ -1005,7 +1026,7 @@ msgstr "Tem certeza que deseja excluir esta mensagem?"
 msgid "Do not delete this notice"
 msgstr "Não excluir esta mensagem."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Excluir esta mensagem"
 
@@ -1021,7 +1042,7 @@ msgstr "Você só pode excluir usuários locais."
 msgid "Delete user"
 msgstr "Excluir usuário"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1029,12 +1050,12 @@ msgstr ""
 "Tem certeza que deseja excluir este usuário? Isso eliminará todos os dados "
 "deste usuário do banco de dados, sem cópia de segurança."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Excluir este usuário"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Aparência"
 
@@ -1137,6 +1158,17 @@ msgstr "Restaura a aparência padrão"
 msgid "Reset back to default"
 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/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 "Salvar"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Salvar a aparência"
@@ -1228,29 +1260,29 @@ msgstr "Editar o grupo %s"
 msgid "You must be logged in to create a group."
 msgstr "Você deve estar autenticado para criar um grupo."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Você deve ser um administrador para editar o grupo."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Use esse formulário para editar o grupo."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "descrição muito extensa (máximo %d caracteres)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Não foi possível atualizar o grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Não foi possível criar os apelidos."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "As configurações foram salvas."
 
@@ -1595,7 +1627,7 @@ msgstr "O usuário já está bloqueado no grupo."
 msgid "User is not a member of group."
 msgstr "O usuário não é um membro do grupo"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Bloquear o usuário no grupo"
 
@@ -1631,11 +1663,11 @@ msgstr "Nenhuma ID."
 msgid "You must be logged in to edit a group."
 msgstr "Você precisa estar autenticado para editar um grupo."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Aparência do grupo"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1643,20 +1675,20 @@ msgstr ""
 "Personalize a aparência do grupo com uma imagem de fundo e uma paleta de "
 "cores à sua escolha."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Não foi possível atualizar a aparência."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "As configurações da aparência foram salvas."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Logo do grupo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1664,57 +1696,57 @@ msgstr ""
 "Você pode enviar uma imagem de logo para o seu grupo. O tamanho máximo do "
 "arquivo é %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Usuário sem um perfil correspondente"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Selecione uma área quadrada da imagem para definir a logo"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "A logo foi atualizada."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Não foi possível atualizar a logo."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Membros do grupo %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Membros do grupo %1$s, pág. %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Uma lista dos usuários deste grupo."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Admin"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Bloquear"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Tornar o usuário um administrador do grupo"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Tornar administrador"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Torna este usuário um administrador"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1980,16 +2012,19 @@ msgstr "Mensagem pessoal"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Você pode, opcionalmente, adicionar uma mensagem pessoal ao convite."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Enviar"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s convidou você para se juntar a %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2050,7 +2085,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Você deve estar autenticado para se associar a um grupo."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Nenhuma identificação."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s associou-se ao grupo %2$s"
@@ -2059,11 +2099,11 @@ msgstr "%1$s associou-se ao grupo %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Você deve estar autenticado para sair de um grupo."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Você não é um membro desse grupo."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s deixou o grupo %2$s"
@@ -2081,8 +2121,7 @@ msgid "Error setting user. You are probably not authorized."
 msgstr ""
 "Erro na configuração do usuário. Você provavelmente não tem autorização."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Entrar"
 
@@ -2342,8 +2381,8 @@ msgstr "tipo de conteúdo "
 msgid "Only "
 msgstr "Apenas "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Não é um formato de dados suportado."
 
@@ -2484,7 +2523,7 @@ msgstr "Não é possível salvar a nova senha."
 msgid "Password saved."
 msgstr "A senha foi salva."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Caminhos"
 
@@ -2518,7 +2557,6 @@ msgstr ""
 "Servidor SSL inválido. O comprimento máximo deve ser de 255 caracteres."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Site"
 
@@ -2691,7 +2729,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 letras minúsculas ou números, sem pontuações ou espaços"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Nome completo"
@@ -2719,7 +2757,7 @@ msgid "Bio"
 msgstr "Descrição"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2786,23 +2824,24 @@ msgstr "O nome do idioma é muito extenso (máx. 50 caracteres)."
 msgid "Invalid tag: \"%s\""
 msgstr "Etiqueta inválida: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Não foi possível atualizar o usuário para assinar automaticamente."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Não foi possível salvar as preferências de localização."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Não foi possível salvar o perfil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Não foi possível salvar as etiquetas."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "As configurações foram salvas."
 
@@ -2815,28 +2854,28 @@ msgstr "Além do limite da página (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Não foi possível recuperar o fluxo público."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Mensagens públicas, pág. %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Mensagens públicas"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Fonte de mensagens públicas (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Fonte de mensagens públicas (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Fonte de mensagens públicas (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2845,11 +2884,11 @@ msgstr ""
 "Esse é o fluxo de mensagens públicas de %%site.name%%, mas ninguém publicou "
 "nada ainda."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Seja o primeiro a publicar!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2857,7 +2896,7 @@ msgstr ""
 "Por que você não [registra uma conta](%%action.register%%) pra ser o "
 "primeiro a publicar?"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2870,7 +2909,7 @@ msgstr ""
 "[Cadastre-se agora](%%action.register%%) para compartilhar notícias sobre "
 "você com seus amigos, família e colegas! ([Saiba mais](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3053,8 +3092,7 @@ msgstr "Desculpe, mas o código do convite é inválido."
 msgid "Registration successful"
 msgstr "Registro realizado com sucesso"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrar-se"
 
@@ -3202,7 +3240,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Assinar"
 
@@ -3239,7 +3277,7 @@ msgstr "Você não pode repetir sua própria mensagem."
 msgid "You already repeated that notice."
 msgstr "Você já repetiu essa mensagem."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Repetida"
 
@@ -3247,33 +3285,33 @@ msgstr "Repetida"
 msgid "Repeated!"
 msgstr "Repetida!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Respostas para %s"
 
-#: actions/replies.php:127
-#, fuzzy, php-format
+#: actions/replies.php:128
+#, php-format
 msgid "Replies to %1$s, page %2$d"
-msgstr "Respostas para %1$s no %2$s"
+msgstr "Respostas para %1$s, pág. %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Fonte de respostas para %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Fonte de respostas para %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Fonte de respostas para %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3282,7 +3320,7 @@ msgstr ""
 "Esse é o fluxo de mensagens de resposta para %1$s, mas %2$s ainda não "
 "recebeu nenhuma mensagem direcionada a ele(a)."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3291,7 +3329,7 @@ msgstr ""
 "Você pode envolver outros usuários na conversa. Pra isso, assine mais "
 "pessoas ou [associe-se a grupos](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3319,14 +3357,12 @@ msgid "User is already sandboxed."
 msgstr "O usuário já está em isolamento."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessões"
 
 #: actions/sessionsadminpanel.php:65
-#, fuzzy
 msgid "Session settings for this StatusNet site."
-msgstr "Configurações da aparência deste site StatusNet."
+msgstr "Configurações da sessão deste site StatusNet."
 
 #: actions/sessionsadminpanel.php:175
 msgid "Handle sessions"
@@ -3345,7 +3381,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Salvar as configurações do site"
 
@@ -3375,15 +3411,15 @@ msgstr "Organização"
 msgid "Description"
 msgstr "Descrição"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Estatísticas"
 
 #: actions/showapplication.php:203
-#, fuzzy, php-format
+#, php-format
 msgid "Created by %1$s - %2$s access by default - %3$d users"
-msgstr "criado por %1$s - %2$s acessa por padrão - %3$d usuários"
+msgstr "Criado por %1$s - acesso %2$s por padrão - %3$d usuários"
 
 #: actions/showapplication.php:213
 msgid "Application actions"
@@ -3426,35 +3462,34 @@ msgstr ""
 "assinatura em texto plano."
 
 #: actions/showapplication.php:309
-#, fuzzy
 msgid "Are you sure you want to reset your consumer key and secret?"
-msgstr "Tem certeza que deseja excluir esta mensagem?"
+msgstr "Tem certeza que deseja restaurar sua chave e segredo de consumidor?"
 
 #: actions/showfavorites.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s's favorite notices, page %2$d"
-msgstr "Mensagens favoritas de %s"
+msgstr "Mensagens favoritas de %1$s, pág. %2$d"
 
 #: actions/showfavorites.php:132
 msgid "Could not retrieve favorite notices."
 msgstr "Não foi possível recuperar as mensagens favoritas."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Fonte para favoritas de %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Fonte para favoritas de %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Fonte para favoritas de %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3463,7 +3498,7 @@ msgstr ""
 "\"Favorita\" nas mensagens que você quer guardar para referência futura ou "
 "para destacar."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3472,7 +3507,7 @@ msgstr ""
 "%s não adicionou nenhuma mensagem às suas favoritas. Publique alguma coisa "
 "interessante para para as pessoas marcarem como favorita. :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3483,7 +3518,7 @@ msgstr ""
 "[registra uma conta](%%%%action.register%%%%) e publica alguma coisa "
 "interessante para as pessoas marcarem como favorita?  :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Esta é uma forma de compartilhar o que você gosta."
 
@@ -3493,71 +3528,71 @@ msgid "%s group"
 msgstr "Grupo %s"
 
 #: actions/showgroup.php:84
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s group, page %2$d"
-msgstr "Membros do grupo %1$s, pág. %2$d"
+msgstr "Grupo %1$s, pág. %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Perfil do grupo"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "Site"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Mensagem"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Apelidos"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Ações do grupo"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Fonte de mensagens do grupo %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Fonte de mensagens do grupo %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Fonte de mensagens do grupo %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF para o grupo %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Membros"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Nenhum)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Todos os membros"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Criado"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3573,7 +3608,7 @@ msgstr ""
 "para se tornar parte deste grupo e muito mais! ([Saiba mais](%%%%doc.help%%%"
 "%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3586,7 +3621,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Seus membros compartilham mensagens curtas "
 "sobre suas vidas e interesses. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administradores"
 
@@ -3618,9 +3653,9 @@ msgid " tagged %s"
 msgstr " etiquetada %s"
 
 #: actions/showstream.php:79
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s, page %2$d"
-msgstr "%1$s e amigos, pág. %2$d"
+msgstr "%1$s, pág. %2$d"
 
 #: actions/showstream.php:122
 #, php-format
@@ -3954,15 +3989,26 @@ msgstr "Não foi digitado nenhum código"
 msgid "You are not subscribed to that profile."
 msgstr "Você não está assinando esse perfil."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Não foi possível salvar a assinatura."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Não é um usuário local."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Esse arquivo não existe."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Você não está assinando esse perfil."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Assinado"
 
@@ -4026,7 +4072,7 @@ msgstr "Estas são as pessoas cujas mensagens você acompanha."
 msgid "These are the people whose notices %s listens to."
 msgstr "Estas são as pessoas cujas mensagens %s acompanha."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4042,35 +4088,35 @@ msgstr ""
 "[usuário do Twitter](%%action.twittersettings%%), você pode assinar "
 "automaticamente as pessoas que já segue lá."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s não está acompanhando ninguém."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
-#, fuzzy, php-format
+#: actions/tag.php:69
+#, php-format
 msgid "Notices tagged with %1$s, page %2$d"
-msgstr "Usuários auto-etiquetados com %1$s - pág. %2$d"
+msgstr "Mensagens etiquetadas com %1$s, pág. %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Fonte de mensagens de %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Fonte de mensagens de %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Fonte de mensagens de %s (Atom)"
@@ -4124,7 +4170,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Esta etiqueta não existe."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "O método da API está em construção."
 
@@ -4156,71 +4202,73 @@ msgstr ""
 "A licença '%1$s' do fluxo do usuário não é compatível com a licença '%2$s' "
 "do site."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Usuário"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Configurações de usuário para este site StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Limite da descrição inválido. Seu valor deve ser numérico."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 "Mensagem de boas vindas inválida. O comprimento máximo é de 255 caracteres."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Assinatura padrão inválida: '%1$s' não é um usuário."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Perfil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Limite da descrição"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Comprimento máximo da descrição do perfil, em caracteres."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Novos usuários"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Boas vindas aos novos usuários"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Texto de boas vindas para os novos usuários (máx. 255 caracteres)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Assinatura padrão"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Os novos usuários assinam esse usuário automaticamente."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Convites"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Convites habilitados"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Define se os usuários podem ou não convidar novos usuários."
 
@@ -4343,9 +4391,9 @@ msgid "Enjoy your hotdog!"
 msgstr "Aproveite o seu cachorro-quente!"
 
 #: actions/usergroups.php:64
-#, fuzzy, php-format
+#, php-format
 msgid "%1$s groups, page %2$d"
-msgstr "Membros do grupo %1$s, pág. %2$d"
+msgstr "Grupos de %1$s, pág. %2$d"
 
 #: actions/usergroups.php:130
 msgid "Search for more groups"
@@ -4418,7 +4466,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Plugins"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Versão"
 
@@ -4457,6 +4505,11 @@ msgstr "Não é parte de um grupo."
 msgid "Group leave failed."
 msgstr "Não foi possível deixar o grupo."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Não foi possível atualizar o grupo."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4474,27 +4527,27 @@ msgstr "Não foi possível inserir a mensagem."
 msgid "Could not update message with new URI."
 msgstr "Não foi possível atualizar a mensagem com a nova URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro no banco de dados durante a inserção da hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problema no salvamento da mensagem. Ela é muito extensa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema no salvamento da mensagem. Usuário desconhecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4502,42 +4555,70 @@ msgstr ""
 "Muitas mensagens duplicadas em um período curto de tempo; dê uma respirada e "
 "publique novamente daqui a alguns minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Você está proibido de publicar mensagens neste site."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problema no salvamento da mensagem."
 
-#: classes/Notice.php:788
-#, fuzzy
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
-msgstr "Problema no salvamento da mensagem."
+msgstr "Problema no salvamento das mensagens recebidas do grupo."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Erro no banco de dados na inserção da reposta: %s"
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Você está proibido de assinar."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Já assinado!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "O usuário bloqueou você."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Não assinado!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Não foi possível excluir a auto-assinatura."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Não foi possível excluir a assinatura."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bem vindo(a) a %1$s, @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Não foi possível configurar a associação ao grupo."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar a associação ao grupo."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Não foi possível salvar a assinatura."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Alterar as suas configurações de perfil"
@@ -4579,120 +4660,190 @@ msgstr "Página sem título"
 msgid "Primary site navigation"
 msgstr "Navegação primária no site"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Início"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Perfil pessoal e fluxo de mensagens dos amigos"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Pessoal"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Mude seu e-mail, avatar, senha, perfil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Conectar"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Conta"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Conecte-se a outros serviços"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Conectar"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Mude as configurações do site"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Convidar"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Admin"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, 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:458
-msgid "Logout"
-msgstr "Sair"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Convidar"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Sai do site"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Sair"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Cria uma conta"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrar-se"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Autentique-se no site"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Ajuda"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Entrar"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Ajudem-me!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Procurar"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Ajuda"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Procura por pessoas ou textos"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Procurar"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Mensagem do site"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Visualizações locais"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Notícia da página"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Navegação secundária no site"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Ajuda"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Sobre"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Termos de uso"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Privacidade"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Fonte"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Contato"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Mini-aplicativo"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Licença do software StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4701,12 +4852,12 @@ msgstr ""
 "**%%site.name%%** é um serviço de microblog disponibilizado por [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** é um serviço de microblog. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4717,101 +4868,167 @@ 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:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licença do conteúdo do site"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Todas "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Próximo"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Anterior"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Você não pode fazer alterações neste site."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Não são permitidas alterações a esse painel."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() não implementado."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() não implementado."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Não foi possível excluir as configurações da aparência."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Configuração básica do site"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Site"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Configuração da aparência"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
 #, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Aparência"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
-msgstr "Configuração dos caminhos"
+msgstr "Configuração do usuário"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
 #, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Usuário"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
-msgstr "Configuração da aparência"
+msgstr "Configuração do acesso"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Configuração dos caminhos"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
-msgstr "Configuração da aparência"
+msgstr "Configuração das sessões"
+
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessões"
 
-#: lib/apiauth.php:95
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
+"Os recursos de API exigem acesso de leitura e escrita, mas você possui "
+"somente acesso de leitura."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
+"A tentativa de autenticação na API falhou, identificação = %1$s, proxy = %2"
+"$s, ip = %3$s"
 
 #: lib/applicationeditform.php:136
 msgid "Edit application"
@@ -4899,11 +5116,11 @@ msgstr "Mensagens onde este anexo aparece"
 msgid "Tags for this attachment"
 msgstr "Etiquetas para este anexo"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Não foi possível alterar a senha"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Não é permitido alterar a senha"
 
@@ -5056,82 +5273,92 @@ msgstr "Erro no salvamento da mensagem."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Especifique o nome do usuário que será assinado"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Este usuário não existe."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Efetuada a assinatura de %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Especifique o nome do usuário cuja assinatura será cancelada"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Cancelada a assinatura de %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "O comando não foi implementado ainda."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notificação desligada."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Não é possível desligar a notificação."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notificação ligada."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Não é possível ligar a notificação."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "O comando para autenticação está desabilitado"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Este link é utilizável somente uma vez e é válido somente por dois minutos: %"
 "s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Cancelada a assinatura de %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Você não está assinando ninguém."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Você já está assinando esta pessoa:"
 msgstr[1] "Você já está assinando estas pessoas:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Ninguém o assinou ainda."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Esta pessoa está assinando você:"
 msgstr[1] "Estas pessoas estão assinando você:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Você não é membro de nenhum grupo."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Você é membro deste grupo:"
 msgstr[1] "Você é membro destes grupos:"
 
-#: lib/command.php:728
+#: lib/command.php:769
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5145,6 +5372,7 @@ msgid ""
 "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"
@@ -5210,19 +5438,19 @@ msgstr ""
 "tracks -  não implementado ainda\n"
 "tracking -  não implementado ainda\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Não foi encontrado nenhum arquivo de configuração. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Eu procurei pelos arquivos de configuração nos seguintes lugares: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Você pode querer executar o instalador para corrigir isto."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Ir para o instalador."
 
@@ -5412,23 +5640,23 @@ msgstr "Erro no sistema durante o envio do arquivo."
 msgid "Not an image or corrupt file."
 msgstr "Imagem inválida ou arquivo corrompido."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Formato de imagem não suportado."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Nosso arquivo foi perdido."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Tipo de arquivo desconhecido"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "Mb"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "Kb"
 
@@ -5717,7 +5945,7 @@ msgstr ""
 "privadas para envolver outras pessoas em uma conversa. Você também pode "
 "receber mensagens privadas."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "de"
 
@@ -5812,6 +6040,12 @@ msgstr "Para"
 msgid "Available characters"
 msgstr "Caracteres disponíveis"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Enviar"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Enviar uma mensagem"
@@ -5845,48 +6079,48 @@ msgstr ""
 "Desculpe, mas recuperar a sua geolocalização está demorando mais que o "
 "esperado. Por favor, tente novamente mais tarde."
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "L"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "O"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "em"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "no contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Repetida por"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Responder a esta mensagem"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Mensagem repetida"
 
@@ -5918,10 +6152,6 @@ msgstr "Erro na inserção do perfil remoto"
 msgid "Duplicate notice"
 msgstr "Duplicar a mensagem"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Você está proibido de assinar."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Não foi possível inserir a nova assinatura."
@@ -5938,6 +6168,10 @@ msgstr "Respostas"
 msgid "Favorites"
 msgstr "Favoritas"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Usuário"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Recebidas"
@@ -6027,9 +6261,9 @@ msgstr "Repetir esta mensagem?"
 msgid "Repeat this notice"
 msgstr "Repetir esta mensagem"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
-msgstr ""
+msgstr "Nenhum usuário definido para o modo de usuário único."
 
 #: lib/sandboxform.php:67
 msgid "Sandbox"
@@ -6047,6 +6281,10 @@ msgstr "Procurar no site"
 msgid "Keyword(s)"
 msgstr "Palavra(s)-chave"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Procurar"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Ajuda da procura"
@@ -6098,33 +6336,14 @@ msgstr "Assinantes de %s"
 msgid "Groups %s is a member of"
 msgstr "Grupos dos quais %s é membro"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Já assinado!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "O usuário bloqueou você."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Não foi possível assinar."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Não foi possível fazer com que outros o assinem."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Não assinado!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Não foi possível excluir a auto-assinatura."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Convidar"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Não foi possível excluir a assinatura."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Convide seus amigos e colegas para unir-se a você no %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6176,67 +6395,67 @@ msgstr "Editar o avatar"
 msgid "User actions"
 msgstr "Ações do usuário"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Editar as configurações do perfil"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Editar"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Enviar uma mensagem para este usuário."
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Mensagem"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderar"
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "alguns segundos atrás"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "cerca de 1 minuto atrás"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "cerca de %d minutos atrás"
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "cerca de 1 hora atrás"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "cerca de %d horas atrás"
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "cerca de 1 dia atrás"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "cerca de %d dias atrás"
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "cerca de 1 mês atrás"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "cerca de %d meses atrás"
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "cerca de 1 ano atrás"
 
index da1345a0d6359f419a7d374f618bd33a61ef97f8..4db3b068466addeae2ee1f8f8e3d8d87cb6bcb6b 100644 (file)
@@ -12,77 +12,84 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
-"PO-Revision-Date: 2010-02-14 20:07:23+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:44+0000\n"
 "Language-Team: Russian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10< =4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Принять"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Настройки доступа к сайту"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Регистрация"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Личное"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "Только по приглашениям"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Личное"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Разрешить регистрацию только по приглашениям."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Закрыта"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Только по приглашениям"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Отключить новые регистрации."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Сохранить"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Закрыта"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Сохранить настройки доступа"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Сохранить"
+
+#. 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 "Нет такой страницы"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -96,52 +103,59 @@ msgstr "Нет такой страницы"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Нет такого пользователя."
 
-#: actions/all.php:84
+#. 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 и друзья, страница %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s и друзья"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Лента друзей %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Лента друзей %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Лента друзей %s (Atom)"
 
-#: actions/all.php:127
+#. 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 "Это лента %s и друзей, однако пока никто ничего не отправил."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -150,7 +164,8 @@ msgstr ""
 "Попробуйте подписаться на большее число людей, [присоединитесь к группе](%%"
 "action.groups%%) или отправьте что-нибудь сами."
 
-#: actions/all.php:134
+#. 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 "
@@ -160,7 +175,7 @@ msgstr ""
 "что-нибудь для привлечения его или её внимания](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -169,7 +184,8 @@ msgstr ""
 "Почему бы не [зарегистрироваться](%%action.register%%), чтобы «подтолкнуть» %"
 "s или отправить запись для привлечения его или её внимания?"
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Вы и друзья"
 
@@ -187,20 +203,20 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!"
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Метод API не найден."
 
@@ -232,8 +248,9 @@ msgstr "Не удаётся обновить пользователя."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "У пользователя нет профиля."
 
@@ -259,7 +276,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -375,69 +392,69 @@ msgstr "Не удаётся определить исходного пользо
 msgid "Could not find target user."
 msgstr "Не удаётся найти целевого пользователя."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "Такое имя уже используется. Попробуйте какое-нибудь другое."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Неверное имя."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "URL Главной страницы неверен."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Полное имя слишком длинное (не больше 255 знаков)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Слишком длинное описание (максимум %d символов)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Слишком длинное месторасположение (максимум 255 знаков)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Слишком много алиасов! Максимальное число — %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Неверный алиас: «%s»"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Алиас «%s» уже используется. Попробуйте какой-нибудь другой."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Алиас не может совпадать с именем."
@@ -448,15 +465,15 @@ msgstr "Алиас не может совпадать с именем."
 msgid "Group not found!"
 msgstr "Группа не найдена!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Вы уже являетесь членом этой группы."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Вы заблокированы из этой группы администратором."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Не удаётся присоединить пользователя %1$s к группе %2$s."
@@ -465,7 +482,7 @@ msgstr "Не удаётся присоединить пользователя %1
 msgid "You are not a member of this group."
 msgstr "Вы не являетесь членом этой группы."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Не удаётся удалить пользователя %1$s из группы %2$s."
@@ -496,7 +513,7 @@ msgstr "Неправильный токен"
 #: 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:309
+#: 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
@@ -505,7 +522,7 @@ msgstr "Неправильный токен"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -538,7 +555,7 @@ msgstr "Запрос токена %s был запрещен и аннулиро
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -565,13 +582,13 @@ msgstr ""
 "предоставлять разрешение на доступ к вашей учётной записи %4$s только тем "
 "сторонним приложениям, которым вы доверяете."
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Настройки"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -653,12 +670,12 @@ 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "Лента %s"
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -694,7 +711,7 @@ msgstr "Повторено для %s"
 msgid "Repeats of %s"
 msgstr "Повторы за %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Записи с тегом %s"
@@ -715,8 +732,7 @@ msgstr "Нет такого вложения."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Нет имени."
 
@@ -728,7 +744,7 @@ msgstr "Нет размера."
 msgid "Invalid size."
 msgstr "Неверный размер."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Аватара"
@@ -746,30 +762,30 @@ msgid "User without matching profile"
 msgstr "Пользователь без соответствующего профиля"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Настройки аватары"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Оригинал"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Просмотр"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Удалить"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Загрузить"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Обрезать"
 
@@ -777,7 +793,7 @@ msgstr "Обрезать"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Подберите нужный квадратный участок для вашей аватары"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Потеряна информация о файле."
 
@@ -812,22 +828,22 @@ msgstr ""
 "приходить уведомления об @-ответах от него."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Нет"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Не блокировать этого пользователя"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Да"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Заблокировать пользователя."
 
@@ -835,39 +851,43 @@ msgstr "Заблокировать пользователя."
 msgid "Failed to save block information."
 msgstr "Не удаётся сохранить информацию о блокировании."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Нет такой группы."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "Заблокированные профили %s"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Заблокированные профили %1$s, страница %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Список пользователей, заблокированных от присоединения к этой группе."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Разблокировать пользователя в группе."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Разблокировать"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Разблокировать пользователя."
 
@@ -942,7 +962,7 @@ msgstr "Вы не являетесь владельцем этого прило
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста."
 
@@ -968,12 +988,13 @@ msgstr "Не удаляйте это приложение"
 msgid "Delete this application"
 msgstr "Удалить это приложение"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Не авторизован."
@@ -1002,7 +1023,7 @@ msgstr "Вы уверены, что хотите удалить эту запи
 msgid "Do not delete this notice"
 msgstr "Не удалять эту запись"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Удалить эту запись"
 
@@ -1018,7 +1039,7 @@ msgstr "Вы можете удалять только внутренних по
 msgid "Delete user"
 msgstr "Удалить пользователя"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1026,12 +1047,12 @@ msgstr ""
 "Вы действительно хотите удалить этого пользователя? Это повлечёт удаление "
 "всех данных о пользователе из базы данных без возможности восстановления."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Удалить этого пользователя"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Оформление"
 
@@ -1134,6 +1155,17 @@ msgstr "Восстановить оформление по умолчанию"
 msgid "Reset back to default"
 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/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 "Сохранить"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Сохранить оформление"
@@ -1225,29 +1257,29 @@ msgstr "Изменить информацию о группе %s"
 msgid "You must be logged in to create a group."
 msgstr "Вы должны авторизоваться, чтобы создать новую группу."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Вы должны быть администратором, чтобы изменять информацию о группе."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Заполните информацию о группе в следующие поля"
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Слишком длинное описание (максимум %d символов)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Не удаётся обновить информацию о группе."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Не удаётся создать алиасы."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Настройки сохранены."
 
@@ -1597,7 +1629,7 @@ msgstr "Пользователь уже заблокирован из групп
 msgid "User is not a member of group."
 msgstr "Пользователь не является членом этой группы."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Заблокировать пользователя из группы."
 
@@ -1632,11 +1664,11 @@ msgstr "Нет ID."
 msgid "You must be logged in to edit a group."
 msgstr "Вы должны авторизоваться, чтобы изменить группу."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Оформление группы"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1644,20 +1676,20 @@ msgstr ""
 "Настройте внешний вид группы, установив фоновое изображение и цветовую гамму "
 "на ваш выбор."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Не удаётся обновить ваше оформление."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Настройки оформления сохранены."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Логотип группы"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1665,57 +1697,57 @@ msgstr ""
 "Здесь вы можете загрузить логотип для группы. Максимальный размер файла "
 "составляет %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Пользователь без соответствующего профиля."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Подберите нужный квадратный участок для вашего логотипа."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Логотип обновлён."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Неудача при обновлении логотипа."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Участники группы %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Участники группы %1$s, страница %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Список пользователей, являющихся членами этой группы."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Настройки"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Блокировать"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Сделать пользователя администратором группы"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Сделать администратором"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Сделать этого пользователя администратором"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Обновления участников %1$s на %2$s!"
@@ -1981,16 +2013,19 @@ msgstr "Личное сообщение"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Можно добавить к приглашению личное сообщение."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
-msgstr "ОК"
+msgstr "Отправить"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s пригласил вас присоединиться к нему на %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2051,7 +2086,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Вы должны авторизоваться для вступления в группу."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Нет имени или ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s вступил в группу %2$s"
@@ -2060,11 +2099,11 @@ msgstr "%1$s вступил в группу %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Вы должны авторизоваться, чтобы покинуть группу."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Вы не являетесь членом этой группы."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s покинул группу %2$s"
@@ -2081,8 +2120,7 @@ msgstr "Некорректное имя или пароль."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Ошибка установки пользователя. Вы, вероятно, не авторизованы."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Вход"
 
@@ -2334,8 +2372,8 @@ msgstr "тип содержимого "
 msgid "Only "
 msgstr "Только "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Неподдерживаемый формат данных."
 
@@ -2476,7 +2514,7 @@ msgstr "Не удаётся сохранить новый пароль."
 msgid "Password saved."
 msgstr "Пароль сохранён."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Пути"
 
@@ -2509,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Неверный SSL-сервер. Максимальная длина составляет 255 символов."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Сайт"
 
@@ -2681,7 +2718,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 латинских строчных буквы или цифры, без пробелов"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Полное имя"
@@ -2709,7 +2746,7 @@ msgid "Bio"
 msgstr "Биография"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2775,23 +2812,24 @@ msgstr "Слишком длинный язык (более 50 символов).
 msgid "Invalid tag: \"%s\""
 msgstr "Неверный тег: «%s»"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Не удаётся обновить пользователя для автоподписки."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Не удаётся сохранить настройки местоположения."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Не удаётся сохранить профиль."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Не удаётся сохранить теги."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Настройки сохранены."
 
@@ -2804,39 +2842,39 @@ msgstr "Превышен предел страницы (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Не удаётся вернуть публичный поток."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Общая лента, страница %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Общая лента"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Лента публичного потока (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Лента публичного потока (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Лента публичного потока (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
 "yet."
 msgstr "Это общая лента %%site.name%%, однако пока никто ничего не отправил."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Создайте первую запись!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2844,7 +2882,7 @@ msgstr ""
 "Почему бы не [зарегистрироваться](%%action.register%%), чтобы стать первым "
 "отправителем?"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2858,7 +2896,7 @@ msgstr ""
 "register%%), чтобы держать в курсе своих  событий  поклонников, друзей, "
 "родственников и коллег! ([Читать далее](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3036,8 +3074,7 @@ msgstr "Извините, неверный пригласительный код
 msgid "Registration successful"
 msgstr "Регистрация успешна!"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Регистрация"
 
@@ -3188,7 +3225,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "Адрес URL твоего профиля на другом подходящем сервисе микроблогинга"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Подписаться"
 
@@ -3224,7 +3261,7 @@ msgstr "Вы не можете повторить собственную зап
 msgid "You already repeated that notice."
 msgstr "Вы уже повторили эту запись."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3232,33 +3269,33 @@ msgstr "Повторено"
 msgid "Repeated!"
 msgstr "Повторено!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Ответы для %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Ответы для %1$s, страница %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Лента записей для %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Лента записей для %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Лента записей для %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3266,7 +3303,7 @@ msgid ""
 msgstr ""
 "Эта лента содержит ответы  на записи %1$s, однако %2$s пока не получал их."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3275,7 +3312,7 @@ msgstr ""
 "Вы можете вовлечь других пользователей в разговор, подписавшись на большее "
 "число людей или [присоединившись к группам](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3304,7 +3341,6 @@ msgid "User is already sandboxed."
 msgstr "Пользователь уже в режиме песочницы."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Сессии"
 
@@ -3329,7 +3365,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Включить отладочный вывод для сессий."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Сохранить настройки сайта"
 
@@ -3359,7 +3395,7 @@ msgstr "Организация"
 msgid "Description"
 msgstr "Описание"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Статистика"
@@ -3423,22 +3459,22 @@ msgstr "Любимые записи %1$s, страница %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Не удаётся восстановить любимые записи."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Лента друзей %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Лента друзей %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Лента друзей %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3446,7 +3482,7 @@ msgstr ""
 "Вы пока не выбрали ни одной любимой записи. Нажмите на кнопку добавления в "
 "любимые рядом с понравившейся записью, чтобы позже уделить ей внимание."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3455,7 +3491,7 @@ msgstr ""
 "%s пока не выбрал ни одной любимой записи. Напишите такую интересную запись, "
 "которую он добавит её в число любимых :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3466,7 +3502,7 @@ msgstr ""
 "[зарегистрироваться](%%%%action.register%%%%) и не написать что-нибудь "
 "интересное, что понравилось бы этому пользователю? :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Это способ разделить то, что вам нравится."
 
@@ -3480,67 +3516,67 @@ msgstr "Группа %s"
 msgid "%1$s group, page %2$d"
 msgstr "Группа %1$s, страница %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Профиль группы"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Запись"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Алиасы"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Действия группы"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Лента записей группы %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Лента записей группы %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Лента записей группы %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF для группы %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Участники"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(пока ничего нет)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Все участники"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Создано"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3556,7 +3592,7 @@ msgstr ""
 "action.register%%%%), чтобы стать участником группы и получить множество "
 "других возможностей! ([Читать далее](%%%%doc.help%%%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3569,7 +3605,7 @@ msgstr ""
 "обеспечении [StatusNet](http://status.net/). Участники обмениваются "
 "короткими сообщениями о своей жизни и интересах. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Администраторы"
 
@@ -3942,15 +3978,26 @@ msgstr "Код не введён"
 msgid "You are not subscribed to that profile."
 msgstr "Вы не подписаны на этот профиль."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Не удаётся сохранить подписку."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Не локальный пользователь."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Это действие принимает только POST-запросы."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Нет такого профиля."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr ""
+"Вы не можете подписаться на удалённый профиль OMB 0.1 с помощью этого "
+"действия."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Подписано"
 
@@ -4014,7 +4061,7 @@ msgstr "Это пользователи, записи которых вы чит
 msgid "These are the people whose notices %s listens to."
 msgstr "Это пользователи, записи которых читает %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4030,35 +4077,35 @@ msgstr ""
 "пользуетесь [Твиттером](%%action.twittersettings%%), то можете автоматически "
 "подписаться на тех людей, за которыми уже следите там."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s не просматривает ничьи записи."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "СМС"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Записи с тегом %1$s, страница %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Лента записей для тега %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Лента записей для тега %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Лента записей для тега %s (Atom)"
@@ -4113,7 +4160,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Нет такого тега."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Метод API реконструируется."
 
@@ -4144,71 +4191,73 @@ msgid ""
 msgstr ""
 "Лицензия просматриваемого потока «%1$s» несовместима с лицензией сайта «%2$s»."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Пользователь"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Пользовательские настройки для этого сайта StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Неверное ограничение биографии. Должно быть числом."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 "Неверный текст приветствия. Максимальная длина составляет 255 символов."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Неверная подписка по умолчанию: «%1$s» не является пользователем."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Профиль"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Ограничение биографии"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Максимальная длина биографии профиля в символах."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Новые пользователи"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Приветствие новым пользователям"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Текст приветствия для новых пользователей (максимум 255 символов)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Подписка по умолчанию"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Автоматически подписывать новых пользователей на этого пользователя."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Приглашения"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Приглашения включены"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Разрешать ли пользователям приглашать новых пользователей."
 
@@ -4403,7 +4452,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Плагины"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Версия"
 
@@ -4442,6 +4491,10 @@ msgstr "Не является частью группы."
 msgid "Group leave failed."
 msgstr "Не удаётся покинуть группу."
 
+#: 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"
@@ -4459,27 +4512,27 @@ msgstr "Не удаётся вставить сообщение."
 msgid "Could not update message with new URI."
 msgstr "Не удаётся обновить сообщение с новым URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Ошибка баз данных при вставке хеш-тегов для %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Проблемы с сохранением записи. Слишком длинно."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при сохранении записи. Неизвестный пользователь."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Слишком много записей за столь короткий срок; передохните немного и "
 "попробуйте вновь через пару минут."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4487,41 +4540,68 @@ msgstr ""
 "Слишком много одинаковых записей за столь короткий срок; передохните немного "
 "и попробуйте вновь через пару минут."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Вам запрещено поститься на этом сайте (бан)"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Проблемы с сохранением записи."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Проблемы с сохранением входящих сообщений группы."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Ошибка баз данных при вставке ответа для %s"
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Не удаётся удалить подписку."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добро пожаловать на %1$s, @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Не удаётся создать группу."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Не удаётся назначить URI группы."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Не удаётся назначить членство в группе."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Не удаётся сохранить информацию о локальной группе."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Изменить ваши настройки профиля"
@@ -4563,120 +4643,190 @@ msgstr "Страница без названия"
 msgid "Primary site navigation"
 msgstr "Главная навигация"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Моё"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Личный профиль и лента друзей"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Личное"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Изменить ваш email, аватару, пароль, профиль"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Соединить"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Настройки"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Соединить с сервисами"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Соединить"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Изменить конфигурацию сайта"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Пригласить"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Настройки"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Пригласите друзей и коллег стать такими же как вы участниками %s"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Выход"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Пригласить"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Выйти"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Выход"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Создать новый аккаунт"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Регистрация"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Войти"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Помощь"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Вход"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Помощь"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Поиск"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Помощь"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Искать людей или текст"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Поиск"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Новая запись"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Локальные виды"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Новая запись"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Навигация по подпискам"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Помощь"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "О проекте"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "ЧаВо"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "TOS"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Пользовательское соглашение"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Исходный код"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Контактная информация"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Бедж"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet лицензия"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4685,12 +4835,12 @@ msgstr ""
 "**%%site.name%%** — это сервис микроблогинга, созданный для вас при помощи [%"
 "%site.broughtby%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** — сервис микроблогинга. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4702,98 +4852,163 @@ msgstr ""
 "лицензией [GNU Affero General Public License](http://www.fsf.org/licensing/"
 "licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Лицензия содержимого сайта"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Содержание и данные %1$s являются личными и конфиденциальными."
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 "Авторские права на содержание и данные принадлежат %1$s. Все права защищены."
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторские права на содержание и данные принадлежат разработчикам. Все права "
 "защищены."
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "license."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Разбиение на страницы"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Сюда"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Туда"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Пока ещё нельзя обрабатывать удалённое содержимое."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Пока ещё нельзя обрабатывать встроенный XML."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Пока ещё нельзя обрабатывать встроенное содержание Base64."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Вы не можете изменять этот сайт."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Изменения для этой панели недопустимы."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() не реализована."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не реализована."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Не удаётся удалить настройки оформления."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Основная конфигурация сайта"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Сайт"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Конфигурация оформления"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Оформление"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Конфигурация пользователя"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Пользователь"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Конфигурация доступа"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Конфигурация путей"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Конфигурация сессий"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Сессии"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "API ресурса требует доступ для чтения и записи, но у вас есть только доступ "
 "для чтения."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4886,11 +5101,11 @@ msgstr "Сообщает, где появляется это вложение"
 msgid "Tags for this attachment"
 msgstr "Теги для этого вложения"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Изменение пароля не удалось"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Смена пароля не разрешена"
 
@@ -5041,83 +5256,92 @@ msgstr "Проблемы с сохранением записи."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Укажите имя пользователя для подписки."
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Нет такого пользователя."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Подписано на %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Укажите имя пользователя для отмены подписки."
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Отписано от %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Команда ещё не выполнена."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Оповещение отсутствует."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Нет оповещения."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Есть оповещение."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Есть оповещение."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Команда входа отключена"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr "Эта ссылка действительна только один раз в течение 2 минут: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Отписано %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Вы ни на кого не подписаны."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Вы подписаны на этих людей:"
 msgstr[1] "Вы подписаны на этих людей:"
 msgstr[2] "Вы подписаны на этих людей:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Никто не подписан на вас."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Эти люди подписались на вас:"
 msgstr[1] "Эти люди подписались на вас:"
 msgstr[2] "Эти люди подписались на вас:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Вы не состоите ни в одной группе."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Вы являетесь участником следующих групп:"
 msgstr[1] "Вы являетесь участником следующих групп:"
 msgstr[2] "Вы являетесь участником следующих групп:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5131,6 +5355,7 @@ msgid ""
 "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"
@@ -5169,6 +5394,7 @@ msgstr ""
 "d <nickname> <text> — прямое сообщение пользователю\n"
 "get <nickname> — получить последнюю запись от пользователя\n"
 "whois <nickname> — получить информацию из профиля пользователя\n"
+"lose <nickname> — отменить подписку пользователя на вас\n"
 "fav <nickname> — добавить последнюю запись пользователя в число любимых\n"
 "fav #<notice_id> — добавить запись с заданным id в число любимых\n"
 "repeat #<notice_id> — повторить уведомление с заданным id\n"
@@ -5195,19 +5421,19 @@ msgstr ""
 "tracks — пока не реализовано.\n"
 "tracking — пока не реализовано.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Конфигурационный файл не найден. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Конфигурационные файлы искались в следующих местах: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Возможно, вы решите запустить установщик для исправления этого."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Перейти к установщику"
 
@@ -5397,23 +5623,23 @@ msgstr "Системная ошибка при загрузке файла."
 msgid "Not an image or corrupt file."
 msgstr "Не является изображением или повреждённый файл."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Неподдерживаемый формат файла изображения."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Потерян файл."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Неподдерживаемый тип файла"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "МБ"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "КБ"
 
@@ -5703,7 +5929,7 @@ msgstr ""
 "вовлечения других пользователей в разговор. Сообщения, получаемые от других "
 "людей, видите только вы."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "от "
 
@@ -5795,6 +6021,11 @@ msgstr "Для"
 msgid "Available characters"
 msgstr "6 или больше знаков"
 
+#: 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 "Послать запись"
@@ -5828,48 +6059,48 @@ msgstr ""
 "К сожалению, получение информации о вашем местонахождении заняло больше "
 "времени, чем ожидалось; повторите попытку позже"
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\" %4$s %5$u°%6$u'%7$u\" %8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "с. ш."
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "ю. ш."
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "в. д."
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "з. д."
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "на"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "в контексте"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Повторено"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Ответить на эту запись"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Ответить"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Запись повторена"
 
@@ -5901,10 +6132,6 @@ msgstr "Ошибка вставки удалённого профиля"
 msgid "Duplicate notice"
 msgstr "Дублировать запись"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Вы заблокированы от подписки."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Не удаётся вставить новую подписку."
@@ -5921,6 +6148,10 @@ msgstr "Ответы"
 msgid "Favorites"
 msgstr "Любимое"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Пользователь"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Входящие"
@@ -6010,7 +6241,7 @@ msgstr "Повторить эту запись?"
 msgid "Repeat this notice"
 msgstr "Повторить эту запись"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Ни задан пользователь для однопользовательского режима."
 
@@ -6030,6 +6261,10 @@ msgstr "Поиск по сайту"
 msgid "Keyword(s)"
 msgstr "Ключевые слова"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Поиск"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Справка по поиску"
@@ -6081,33 +6316,14 @@ msgstr "Люди подписанные на %s"
 msgid "Groups %s is a member of"
 msgstr "Группы, в которых состоит %s"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Уже подписаны!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Пользователь заблокировал Вас."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Подписка неудачна."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Не удаётся подписать других на вашу ленту."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Не подписаны!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Невозможно удалить самоподписку."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Пригласить"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Не удаётся удалить подписку."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Пригласите друзей и коллег стать такими же как вы участниками %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6159,67 +6375,67 @@ msgstr "Изменить аватару"
 msgid "User actions"
 msgstr "Действия пользователя"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Изменение настроек профиля"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Редактировать"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Послать приватное сообщение этому пользователю."
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Сообщение"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Модерировать"
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "пару секунд назад"
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "около минуты назад"
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "около %d минут(ы) назад"
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "около часа назад"
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "около %d часа(ов) назад"
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "около дня назад"
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "около %d дня(ей) назад"
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "около месяца назад"
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "около %d месяца(ев) назад"
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "около года назад"
 
index d1ee56f2ca67e0c360e4bd55b8e83e373c7494d0..3f4ad499f72a7e4dfb1cb8c0ed8cc05e21bce426 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-14 20:05+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+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"
@@ -17,64 +17,69 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr ""
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr ""
 
-#: actions/accessadminpanel.php:158
-msgid "Registration"
-msgstr ""
-
+#. TRANS: Form legend for registration form.
 #: actions/accessadminpanel.php:161
-msgid "Private"
+msgid "Registration"
 msgstr ""
 
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
+msgctxt "LABEL"
+msgid "Private"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
 msgstr ""
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
 msgstr ""
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr ""
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+#. 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 ""
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -88,73 +93,82 @@ msgstr ""
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 ""
 
-#: actions/all.php:84
+#. 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 ""
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr ""
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr ""
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr ""
 
@@ -172,20 +186,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: 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:182 actions/apitimelinehome.php:184
+#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184
 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152
 #: actions/apitimelineretweetedtome.php:121
 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
-#: actions/apitimelineuser.php:194 actions/apiusershow.php:101
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr ""
 
@@ -217,8 +231,9 @@ msgstr ""
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 ""
 
@@ -242,7 +257,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -352,68 +367,68 @@ msgstr ""
 msgid "Could not find target user."
 msgstr ""
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 ""
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 ""
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 ""
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 ""
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr ""
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 ""
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr ""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr ""
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -424,15 +439,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr ""
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr ""
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr ""
@@ -441,7 +456,7 @@ msgstr ""
 msgid "You are not a member of this group."
 msgstr ""
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr ""
@@ -472,7 +487,7 @@ msgstr ""
 #: 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:309
+#: 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
@@ -481,7 +496,7 @@ msgstr ""
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -513,7 +528,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -536,13 +551,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr ""
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -624,12 +639,12 @@ msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr ""
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,7 +680,7 @@ msgstr ""
 msgid "Repeats of %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
@@ -686,8 +701,7 @@ msgstr ""
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr ""
 
@@ -699,7 +713,7 @@ msgstr ""
 msgid "Invalid size."
 msgstr ""
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr ""
@@ -716,30 +730,30 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr ""
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr ""
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr ""
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -747,7 +761,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -779,22 +793,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr ""
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr ""
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr ""
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr ""
 
@@ -802,39 +816,43 @@ msgstr ""
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 ""
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr ""
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr ""
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr ""
 
@@ -909,7 +927,7 @@ msgstr ""
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -932,12 +950,13 @@ msgstr ""
 msgid "Delete this application"
 msgstr ""
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr ""
@@ -964,7 +983,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr ""
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr ""
 
@@ -980,18 +999,18 @@ msgstr ""
 msgid "Delete user"
 msgstr ""
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr ""
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1092,6 +1111,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 ""
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1183,29 +1213,29 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr ""
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr ""
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr ""
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr ""
 
@@ -1534,7 +1564,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr ""
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr ""
 
@@ -1566,86 +1596,86 @@ msgstr ""
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr ""
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr ""
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr ""
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr ""
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr ""
@@ -1881,16 +1911,18 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+msgctxt "BUTTON"
 msgid "Send"
 msgstr ""
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1925,7 +1957,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr ""
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -1934,11 +1970,11 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr ""
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr ""
@@ -1955,8 +1991,7 @@ msgstr ""
 msgid "Error setting user. You are probably not authorized."
 msgstr ""
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr ""
 
@@ -2195,8 +2230,8 @@ msgstr ""
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2335,7 +2370,7 @@ msgstr ""
 msgid "Password saved."
 msgstr ""
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2368,7 +2403,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2536,7 +2570,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr ""
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr ""
@@ -2564,7 +2598,7 @@ msgid "Bio"
 msgstr ""
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2628,23 +2662,24 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr ""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr ""
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr ""
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr ""
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr ""
 
@@ -2657,45 +2692,45 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr ""
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr ""
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr ""
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2704,7 +2739,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2873,8 +2908,7 @@ msgstr ""
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr ""
 
@@ -2997,7 +3031,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr ""
 
@@ -3033,7 +3067,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr ""
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr ""
 
@@ -3041,47 +3075,47 @@ msgstr ""
 msgid "Repeated!"
 msgstr ""
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr ""
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr ""
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr ""
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr ""
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr ""
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3106,7 +3140,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3131,7 +3164,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr ""
 
@@ -3161,7 +3194,7 @@ msgstr ""
 msgid "Description"
 msgstr ""
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr ""
@@ -3222,35 +3255,35 @@ msgstr ""
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr ""
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr ""
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr ""
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3258,7 +3291,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3272,67 +3305,67 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr ""
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr ""
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr ""
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr ""
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr ""
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3342,7 +3375,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3351,7 +3384,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3697,15 +3730,24 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr ""
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
+msgid "No such profile."
 msgstr ""
 
-#: actions/subscribe.php:69
+#: 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 ""
 
@@ -3765,7 +3807,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3775,35 +3817,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr ""
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr ""
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr ""
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -3853,7 +3895,7 @@ msgstr ""
 msgid "No such tag."
 msgstr ""
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -3883,70 +3925,71 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr ""
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr ""
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr ""
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr ""
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4119,7 +4162,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr ""
 
@@ -4156,6 +4199,10 @@ msgstr ""
 msgid "Group leave failed."
 msgstr ""
 
+#: 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"
@@ -4173,65 +4220,92 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1442
 #, php-format
-msgid "DB error inserting reply: %s"
+msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/Notice.php:1271
-#, php-format
-msgid "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/User.php:385
+#: 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:179 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:413
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:442
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr ""
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr ""
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr ""
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4273,132 +4347,183 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
+msgctxt "TOOLTIP"
+msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:439
-msgid "Personal profile and friends timeline"
+#: lib/action.php:442
+msgctxt "MENU"
+msgid "Personal"
 msgstr ""
 
-#: lib/action.php:441
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr ""
 
-#: lib/action.php:444
-msgid "Connect"
+#: lib/action.php:447
+msgctxt "MENU"
+msgid "Account"
 msgstr ""
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr ""
 
-#: lib/action.php:448
+#: lib/action.php:453
+msgctxt "MENU"
+msgid "Connect"
+msgstr ""
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr ""
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
 msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
+#: lib/action.php:467
+msgctxt "MENU"
+msgid "Invite"
 msgstr ""
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
+msgctxt "MENU"
+msgid "Logout"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr ""
 
-#: lib/action.php:466
+#: lib/action.php:484
+msgctxt "MENU"
+msgid "Register"
+msgstr ""
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
+#: lib/action.php:490
+msgctxt "MENU"
+msgid "Login"
 msgstr ""
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr ""
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
+#: lib/action.php:496
+msgctxt "MENU"
+msgid "Help"
 msgstr ""
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+msgctxt "MENU"
+msgid "Search"
+msgstr ""
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr ""
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr ""
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr ""
+
+#: lib/action.php:765
 msgid "About"
 msgstr ""
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr ""
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr ""
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
 "broughtby%%](%%site.broughtbyurl%%). "
 msgstr ""
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr ""
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4406,93 +4531,152 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr ""
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr ""
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+msgctxt "MENU"
+msgid "Site"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+msgctxt "MENU"
+msgid "Design"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:332
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:356
+msgctxt "MENU"
+msgid "Access"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:362
 msgid "Paths configuration"
 msgstr ""
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 msgid "Sessions configuration"
 msgstr ""
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+msgctxt "MENU"
+msgid "Sessions"
+msgstr ""
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4582,11 +4766,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr ""
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr ""
 
@@ -4734,80 +4918,89 @@ msgstr ""
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: 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:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: 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:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr ""
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr ""
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4821,6 +5014,7 @@ msgid ""
 "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"
@@ -4848,19 +5042,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5046,23 +5240,23 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr ""
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5266,7 +5460,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr ""
 
@@ -5355,6 +5549,11 @@ msgstr ""
 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 ""
@@ -5386,48 +5585,48 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr ""
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr ""
 
@@ -5459,10 +5658,6 @@ msgstr ""
 msgid "Duplicate notice"
 msgstr ""
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr ""
@@ -5479,6 +5674,10 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5568,7 +5767,7 @@ msgstr ""
 msgid "Repeat this notice"
 msgstr ""
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5588,6 +5787,10 @@ msgstr ""
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr ""
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr ""
@@ -5639,32 +5842,13 @@ msgstr ""
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr ""
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr ""
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr ""
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr ""
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
@@ -5717,67 +5901,67 @@ msgstr ""
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr ""
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr ""
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:871
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:873
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:875
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:879
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:883
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:887
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr ""
 
index a0d407c5c86645bc5e45b09f98c1106d771eed65..b1ac66f6513153fb0057da894b4d3466c5983db6 100644 (file)
@@ -9,76 +9,83 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:15:57+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:47+0000\n"
 "Language-Team: Swedish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Åtkomst"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Inställningar för webbplatsåtkomst"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Registrering"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Privat"
-
-#: actions/accessadminpanel.php:163
+#. TRANS: Checkbox instructions for admin setting "Private"
+#: actions/accessadminpanel.php:165
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr ""
 "Skall anonyma användare (inte inloggade) förhindras från att se webbplatsen?"
 
+#. TRANS: Checkbox label for prohibiting anonymous users from viewing site.
 #: actions/accessadminpanel.php:167
-msgid "Invite only"
-msgstr "Endast inbjudan"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Privat"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Gör så att registrering endast sker genom inbjudan."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Stängd"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Endast inbjudan"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Inaktivera nya registreringar."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Spara"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Stängd"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Spara inställningar för åtkomst"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Spara"
+
+#. 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 "Ingen sådan sida"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -92,52 +99,59 @@ msgstr "Ingen sådan sida"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Ingen sådan användare."
 
-#: actions/all.php:84
+#. 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 och vänner, sida %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s och vänner"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Flöden för %ss vänner (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Flöden för %ss vänner (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Flöden för %ss vänner (Atom)"
 
-#: actions/all.php:127
+#. 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 "Detta är tidslinjen för %s och vänner, men ingen har skrivit något än."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -146,7 +160,8 @@ msgstr ""
 "Prova att prenumerera på fler personer, [gå med i en grupp](%%action.groups%"
 "%) eller skriv något själv."
 
-#: actions/all.php:134
+#. 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 "
@@ -156,7 +171,7 @@ msgstr ""
 "någonting för hans eller hennes uppmärksamhet](%%%%action.newnotice%%%%?"
 "status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -165,12 +180,13 @@ msgstr ""
 "Varför inte [registrera ett konto](%%%%action.register%%%%) och sedan knuffa "
 "%s eller skriva en notis för hans eller hennes uppmärksamhet."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Du och vänner"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Uppdateringar från %1$s och vänner på %2$s!"
@@ -183,20 +199,20 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metod hittades inte."
 
@@ -228,8 +244,9 @@ msgstr "Kunde inte uppdatera användare."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Användaren har ingen profil."
 
@@ -255,7 +272,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -365,69 +382,69 @@ msgstr "Kunde inte fastställa användare hos källan."
 msgid "Could not find target user."
 msgstr "Kunde inte hitta målanvändare."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 ""
 "Smeknamnet får endast innehålla små bokstäver eller siffror, inga mellanslag."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Smeknamnet används redan. Försök med ett annat."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Inte ett giltigt smeknamn."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Hemsida är inte en giltig URL."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Fullständigt namn är för långt (max 255 tecken)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Beskrivning är för lång (max 140 tecken)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Beskrivning av plats är för lång (max 255 tecken)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "För många alias! Maximum %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Ogiltigt alias: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Alias \"%s\" används redan. Försök med ett annat."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Alias kan inte vara samma som smeknamn."
@@ -438,15 +455,15 @@ msgstr "Alias kan inte vara samma som smeknamn."
 msgid "Group not found!"
 msgstr "Grupp hittades inte!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Du är redan en medlem i denna grupp."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Du har blivit blockerad från denna grupp av administratören."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Kunde inte ansluta användare %1$s till grupp %2$s."
@@ -455,7 +472,7 @@ msgstr "Kunde inte ansluta användare %1$s till grupp %2$s."
 msgid "You are not a member of this group."
 msgstr "Du är inte en medlem i denna grupp."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Kunde inte ta bort användare %1$s från grupp %2$s."
@@ -486,7 +503,7 @@ msgstr "Ogiltig token."
 #: 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:309
+#: 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
@@ -495,7 +512,7 @@ msgstr "Ogiltig token."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -527,7 +544,7 @@ msgstr "Begäran-token %s har nekats och återkallats."
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -553,13 +570,13 @@ 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 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Konto"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -635,18 +652,18 @@ msgstr "Format som inte stödjs."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Favoriter från %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s tidslinje"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -662,12 +679,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s publika tidslinje"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s uppdateringar från alla!"
@@ -677,17 +694,17 @@ msgstr "%s uppdateringar från alla!"
 msgid "Repeated to %s"
 msgstr "Upprepat till %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Upprepningar av %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Notiser taggade med %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Uppdateringar taggade med %1$s på %2$s!"
@@ -703,8 +720,7 @@ msgstr "Ingen sådan bilaga."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Inget smeknamn."
 
@@ -716,7 +732,7 @@ msgstr "Ingen storlek."
 msgid "Invalid size."
 msgstr "Ogiltig storlek."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -734,30 +750,30 @@ msgid "User without matching profile"
 msgstr "Användare utan matchande profil"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Avatarinställningar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Orginal"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Förhandsgranska"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Ta bort"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Ladda upp"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Beskär"
 
@@ -765,7 +781,7 @@ msgstr "Beskär"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Välj ett kvadratiskt område i bilden som din avatar"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Förlorade vår fildata."
 
@@ -800,22 +816,22 @@ msgstr ""
 "framtiden och du kommer inte bli underrättad om några @-svar från dem."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Nej"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Blockera inte denna användare"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Ja"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Blockera denna användare"
 
@@ -823,40 +839,44 @@ msgstr "Blockera denna användare"
 msgid "Failed to save block information."
 msgstr "Misslyckades att spara blockeringsinformation."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Ingen sådan grupp."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "%s blockerade profiler"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%1$s blockerade profiler, sida %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 "En lista med de användare som blockerats från att gå med i denna grupp."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Häv blockering av användare från grupp"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Häv blockering"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Häv blockering av denna användare"
 
@@ -931,7 +951,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Det var ett problem med din sessions-token."
 
@@ -957,12 +977,13 @@ msgstr "Ta inte bort denna applikation"
 msgid "Delete this application"
 msgstr "Ta bort denna applikation"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Inte inloggad."
@@ -991,7 +1012,7 @@ msgstr "Är du säker på att du vill ta bort denna notis?"
 msgid "Do not delete this notice"
 msgstr "Ta inte bort denna notis"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Ta bort denna notis"
 
@@ -1007,7 +1028,7 @@ msgstr "Du kan bara ta bort lokala användare."
 msgid "Delete user"
 msgstr "Ta bort användare"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1015,12 +1036,12 @@ msgstr ""
 "Är du säker på att du vill ta bort denna användare? Det kommer rensa all "
 "data om användaren från databasen, utan en säkerhetskopia."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Ta bort denna användare"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Utseende"
 
@@ -1123,6 +1144,17 @@ msgstr "Återställ standardutseende"
 msgid "Reset back to default"
 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/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 "Spara"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Spara utseende"
@@ -1214,29 +1246,29 @@ msgstr "Redigera %s grupp"
 msgid "You must be logged in to create a group."
 msgstr "Du måste vara inloggad för att skapa en grupp."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Du måste vara en administratör för att redigera gruppen."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Använd detta formulär för att redigera gruppen."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "beskrivning är för lång (max %d tecken)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Kunde inte uppdatera grupp."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Kunde inte skapa alias."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Alternativ sparade."
 
@@ -1577,7 +1609,7 @@ msgstr "Användaren är redan blockerad från grupp."
 msgid "User is not a member of group."
 msgstr "Användare är inte en gruppmedlem."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Blockera användare från grupp"
 
@@ -1612,31 +1644,31 @@ msgstr "Ingen ID."
 msgid "You must be logged in to edit a group."
 msgstr "Du måste vara inloggad för att redigera en grupp."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Gruppens utseende"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
 msgstr ""
 "Anpassa hur din grupp ser ut genom att välja bakgrundbild och färgpalett."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Kunde inte uppdatera dina utseendeinställningar."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Utseendeinställningar sparade."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Gruppens logotyp"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1644,57 +1676,57 @@ msgstr ""
 "Du kan ladda upp en logotypbild för din grupp. Den maximala filstorleken är %"
 "s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Användare utan matchande profil."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Välj ett kvadratiskt område i bilden som logotyp"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Logtyp uppdaterad."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Misslyckades uppdatera logtyp."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s gruppmedlemmar"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s gruppmedlemmar, sida %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "En lista av användarna i denna grupp."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Administratör"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Blockera"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Gör användare till en administratör för gruppen"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Gör till administratör"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Gör denna användare till administratör"
 
-#: actions/grouprss.php:133
+#: 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!"
@@ -1959,16 +1991,19 @@ msgstr "Personligt meddelande"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Om du vill, skriv ett personligt meddelande till inbjudan."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Skicka"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s har bjudit in dig att gå med dem på %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2029,7 +2064,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Du måste vara inloggad för att kunna gå med i en grupp."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Inget smeknamn eller ID."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s gick med i grupp %2$s"
@@ -2038,11 +2077,11 @@ msgstr "%1$s gick med i grupp %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Du måste vara inloggad för att lämna en grupp."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Du är inte en medlem i den gruppen."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s lämnade grupp %2$s"
@@ -2059,8 +2098,7 @@ msgstr "Felaktigt användarnamn eller lösenord."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Fel vid inställning av användare. Du har sannolikt inte tillstånd."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Logga in"
 
@@ -2314,8 +2352,8 @@ msgstr "innehållstyp "
 msgid "Only "
 msgstr "Bara "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Ett dataformat som inte stödjs"
 
@@ -2454,7 +2492,7 @@ msgstr "Kan inte spara nytt lösenord."
 msgid "Password saved."
 msgstr "Lösenord sparat."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Sökvägar"
 
@@ -2487,7 +2525,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Ogiltigt SSL-servernamn. Den maximala längden är 255 tecken."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Webbplats"
 
@@ -2660,7 +2697,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 små bokstäver eller nummer, inga punkter eller mellanslag"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Fullständigt namn"
@@ -2688,7 +2725,7 @@ msgid "Bio"
 msgstr "Biografi"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2756,23 +2793,24 @@ msgstr "Språknamn är för långt (max 50 tecken)."
 msgid "Invalid tag: \"%s\""
 msgstr "Ogiltig tagg: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Kunde inte uppdatera användaren för automatisk prenumeration."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Kunde inte spara platsinställningar."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Kunde inte spara profil."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Kunde inte spara taggar."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Inställningar sparade."
 
@@ -2785,28 +2823,28 @@ msgstr "Bortom sidbegränsningen (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Kunde inte hämta publik ström."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Publik tidslinje, sida %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Publik tidslinje"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Publikt flöde av ström (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Publikt flöde av ström (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Publikt flöde av ström (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2815,11 +2853,11 @@ msgstr ""
 "Detta är den publika tidslinjen för %%site.name%% men ingen har postat något "
 "än."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Bli först att posta!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2827,7 +2865,7 @@ msgstr ""
 "Varför inte [registrera ett konto](%%action.register%%) och bli först att "
 "posta!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2840,7 +2878,7 @@ msgstr ""
 "net/). [Gå med nu](%%action.register%%) för att dela notiser om dig själv "
 "med vänner, familj och kollegor! ([Läs mer](%%doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3019,8 +3057,7 @@ msgstr "Tyvärr, ogiltig inbjudningskod."
 msgid "Registration successful"
 msgstr "Registreringen genomförd"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Registrera"
 
@@ -3171,7 +3208,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Prenumerera"
 
@@ -3209,7 +3246,7 @@ msgstr "Du kan inte upprepa din egna notis."
 msgid "You already repeated that notice."
 msgstr "Du har redan upprepat denna notis."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Upprepad"
 
@@ -3217,33 +3254,33 @@ msgstr "Upprepad"
 msgid "Repeated!"
 msgstr "Upprepad!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Svarat till %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Svar till %1$s, sida %2$s"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Flöde med svar för %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Flöde med svar för %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Flöde med svar för %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3252,7 +3289,7 @@ msgstr ""
 "Detta är tidslinjen som visar svar till %s1$ men %2$s har inte tagit emot en "
 "notis för dennes uppmärksamhet än."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3261,7 +3298,7 @@ msgstr ""
 "Du kan engagera andra användare i en konversation, prenumerera på fler "
 "personer eller [gå med i grupper](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3288,7 +3325,6 @@ msgid "User is already sandboxed."
 msgstr "Användare är redan flyttad till sandlådan."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Sessioner"
 
@@ -3313,7 +3349,7 @@ 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/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Spara webbplatsinställningar"
 
@@ -3343,7 +3379,7 @@ msgstr "Organisation"
 msgid "Description"
 msgstr "Beskrivning"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Statistik"
@@ -3407,22 +3443,22 @@ msgstr "%1$ss favoritnotiser, sida %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Kunde inte hämta favoritnotiser."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Flöde för %ss favoriter (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Flöde för %ss favoriter (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Flöde för %ss favoriter (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3431,7 +3467,7 @@ msgstr ""
 "bredvid någon notis du skulle vilja bokmärka för senare tillfälle eller för "
 "att sätta strålkastarljuset på."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3440,7 +3476,7 @@ msgstr ""
 "%s har inte lagt till några notiser till sina favoriter ännu. Posta något "
 "intressant de skulle lägga till sina favoriter :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3451,7 +3487,7 @@ msgstr ""
 "[registrera ett konto](%%%%action.register%%%%) och posta något intressant "
 "de skulle lägga till sina favoriter :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Detta är ett sätt att dela med av det du gillar."
 
@@ -3465,67 +3501,67 @@ msgstr "%s grupp"
 msgid "%1$s group, page %2$d"
 msgstr "%1$s grupp, sida %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Grupprofil"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Notis"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Alias"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Åtgärder för grupp"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, 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:334
+#: actions/showgroup.php:342
 #, 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:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Flöde av notiser för %s grupp (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF för %s grupp"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Medlemmar"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Ingen)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Alla medlemmar"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Skapad"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3540,7 +3576,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:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3553,7 +3589,7 @@ msgstr ""
 "[StatusNet](http://status.net/). Dess medlemmar delar korta meddelande om "
 "sina liv och intressen. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Administratörer"
 
@@ -3918,15 +3954,24 @@ msgstr "Ingen kod ifylld"
 msgid "You are not subscribed to that profile."
 msgstr "Du är inte prenumerat hos den profilen."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Kunde inte spara prenumeration."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Inte en lokal användare."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "Denna åtgärd accepterar endast POST-begäran."
+
+#: actions/subscribe.php:107
+msgid "No such profile."
+msgstr "Ingen sådan profil."
+
+#: actions/subscribe.php:117
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Du kan inte prenumerera på en 0MB 0.1-fjärrprofil med denna åtgärd."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Prenumerant"
 
@@ -3990,7 +4035,7 @@ msgstr "Det är dessa personer vars meddelanden du lyssnar på."
 msgid "These are the people whose notices %s listens to."
 msgstr "Det är dessa personer vars notiser %s lyssnar på."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4006,35 +4051,35 @@ msgstr ""
 "twittersettings%%) kan du prenumerera automatiskt på personer som du redan "
 "följer där."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s lyssnar inte på någon."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Notiser taggade med %1$s, sida %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Flöde av notiser för tagg %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Flöde av notiser för tagg %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Flöde av notiser för tagg %s (Atom)"
@@ -4089,7 +4134,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Ingen sådan tagg."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API-metoden är under uppbyggnad."
 
@@ -4121,72 +4166,74 @@ msgstr ""
 "Licensen för lyssnarströmmen '%1$s' är inte förenlig med webbplatslicensen '%"
 "2$s'."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Användare"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Användarinställningar för denna StatusNet-webbplats"
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Ogiltig begränsning av biografi. Måste vara numerisk."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Ogiltig välkomsttext. Maximal längd är 255 tecken."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Ogiltig standardprenumeration: '%1$s' är inte användare."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Begränsning av biografi"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Maximal teckenlängd av profilbiografi."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Nya användare"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Välkomnande av ny användare"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Välkomsttext för nya användare (max 255 tecken)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Standardprenumerationer"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 "Lägg automatiskt till en prenumeration på denna användare för alla nya "
 "användare."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Inbjudningar"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Inbjudningar aktiverade"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "Hurvida användare skall tillåtas bjuda in nya användare."
 
@@ -4382,7 +4429,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Insticksmoduler"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Version"
 
@@ -4421,6 +4468,10 @@ msgstr "Inte med i grupp."
 msgid "Group leave failed."
 msgstr "Grupputträde misslyckades."
 
+#: classes/Local_group.php:41
+msgid "Could not update local group."
+msgstr "Kunde inte uppdatera lokal grupp."
+
 #: classes/Login_token.php:76
 #, php-format
 msgid "Could not create login token for %s"
@@ -4438,27 +4489,27 @@ msgstr "Kunde inte infoga meddelande."
 msgid "Could not update message with new URI."
 msgstr "Kunde inte uppdatera meddelande med ny URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Databasfel vid infogning av hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Problem vid sparande av notis. För långt."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem vid sparande av notis. Okänd användare."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 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:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4466,41 +4517,68 @@ msgstr ""
 "För många duplicerade meddelanden för snabbt; ta en vilopaus och posta igen "
 "om ett par minuter."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 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:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Problem med att spara notis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Problem med att spara gruppinkorg."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Databasfel vid infogning av svar: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+msgid "You have been banned from subscribing."
+msgstr "Du har blivit utestängd från att prenumerera."
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr "Redan prenumerant!"
+
+#: classes/Subscription.php:74
+msgid "User has blocked you."
+msgstr "Användaren har blockerat dig."
+
+#: classes/Subscription.php:157
+msgid "Not subscribed!"
+msgstr "Inte prenumerant!"
+
+#: classes/Subscription.php:163
+msgid "Couldn't delete self-subscription."
+msgstr "Kunde inte ta bort själv-prenumeration."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Kunde inte ta bort prenumeration."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Välkommen till %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Kunde inte skapa grupp."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Kunde inte ställa in grupp-URI."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Kunde inte ställa in gruppmedlemskap."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Kunde inte spara lokal gruppinformation."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Ändra dina profilinställningar"
@@ -4542,120 +4620,190 @@ msgstr "Namnlös sida"
 msgid "Primary site navigation"
 msgstr "Primär webbplatsnavigation"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Hem"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Personlig profil och vänners tidslinje"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Personligt"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Ändra din e-post, avatar, lösenord, profil"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Anslut"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Konto"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Anslut till tjänster"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Anslut"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Ändra webbplatskonfiguration"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Bjud in"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Administratör"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, 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:458
-msgid "Logout"
-msgstr "Logga ut"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Bjud in"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Logga ut från webbplatsen"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Logga ut"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Skapa ett konto"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Registrera"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Logga in på webbplatsen"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hjälp"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Logga in"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hjälp mig!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Sök"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hjälp"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Sök efter personer eller text"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Sök"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Webbplatsnotis"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Lokala vyer"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Sidnotis"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Sekundär webbplatsnavigation"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hjälp"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Om"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "Frågor & svar"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Användarvillkor"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Sekretess"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Källa"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Kontakt"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Emblem"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Programvarulicens för StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4664,12 +4812,12 @@ msgstr ""
 "**%%site.name%%** är en mikrobloggtjänst tillhandahållen av [%%site.broughtby"
 "%%](%%site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** är en mikrobloggtjänst. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4680,95 +4828,160 @@ msgstr ""
 "version %s, tillgänglig under [GNU Affero General Public License](http://www."
 "fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Licens för webbplatsinnehåll"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, 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:811
+#: lib/action.php:842
 #, 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:814
+#: lib/action.php:845
 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:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Alla "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "licens."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Numrering av sidor"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Senare"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Tidigare"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Kan inte hantera fjärrinnehåll ännu."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Kan inte hantera inbäddat XML-innehåll ännu."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Kan inte hantera inbäddat Base64-innehåll ännu."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Du kan inte göra förändringar av denna webbplats."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Ändringar av den panelen tillåts inte."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() är inte implementerat."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSetting() är inte implementerat."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Kunde inte ta bort utseendeinställning."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Grundläggande webbplatskonfiguration"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Webbplats"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Konfiguration av utseende"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Utseende"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Konfiguration av användare"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Användare"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Konfiguration av åtkomst"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Konfiguration av sökvägar"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Konfiguration av sessioner"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Sessioner"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "API-resursen kräver läs- och skrivrättigheter, men du har bara läsrättighet."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4861,11 +5074,11 @@ msgstr "Notiser där denna bilaga förekommer"
 msgid "Tags for this attachment"
 msgstr "Taggar för denna billaga"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Byte av lösenord misslyckades"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Byte av lösenord är inte tillåtet"
 
@@ -5016,81 +5229,90 @@ msgstr "Fel vid sparande av notis."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Ange namnet på användaren att prenumerara på"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Ingen sådan användare."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Prenumerar på %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Ange namnet på användaren att avsluta prenumeration på"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Prenumeration hos %s avslutad"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Kommando inte implementerat än."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Notifikation av."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Kan inte sätta på notifikation."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Notifikation på."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Kan inte stänga av notifikation."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Inloggningskommando är inaktiverat"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Denna länk är endast användbar en gång, och gäller bara i 2 minuter: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Prenumeration avslutad %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Du prenumererar inte på någon."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Du prenumererar på denna person:"
 msgstr[1] "Du prenumererar på dessa personer:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "Ingen prenumerar på dig."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Denna person prenumererar på dig:"
 msgstr[1] "Dessa personer prenumererar på dig:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Du är inte medlem i några grupper."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Du är en medlem i denna grupp:"
 msgstr[1] "Du är en medlem i dessa grupper:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5104,6 +5326,7 @@ msgid ""
 "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"
@@ -5142,6 +5365,7 @@ msgstr ""
 "d <smeknamn> <text> - direktmeddelande till användare\n"
 "get <smeknamn> - hämta senaste notis från användare\n"
 "whois <smeknamn> - hämta profilinformation om användare\n"
+"lose <smeknamn> - tvinga användare att sluta följa dig\n"
 "fav <smeknamn> - lägg till användarens senaste notis som favorit\n"
 "fav #<notisid> - lägg till notis med given id som favorit\n"
 "repeat #<notisid> - upprepa en notis med en given id\n"
@@ -5168,19 +5392,19 @@ msgstr ""
 "tracks - inte implementerat än.\n"
 "tracking - inte implementerat än.\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Ingen konfigurationsfil hittades. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Jag letade efter konfigurationsfiler på följande platser: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Du kanske vill köra installeraren för att åtgärda detta."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Gå till installeraren."
 
@@ -5368,23 +5592,23 @@ msgstr "Systemfel vid uppladdning av fil."
 msgid "Not an image or corrupt file."
 msgstr "Inte en bildfil eller så är filen korrupt."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Bildfilens format stödjs inte."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Förlorade vår fil."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Okänd filtyp"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "MB"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "kB"
 
@@ -5673,7 +5897,7 @@ msgstr ""
 "engagera andra användare i konversationen. Folk kan skicka meddelanden till "
 "dig som bara du ser."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "från"
 
@@ -5766,6 +5990,11 @@ msgstr "Till"
 msgid "Available characters"
 msgstr "Tillgängliga tecken"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Skicka"
+
 #: lib/noticeform.php:160
 msgid "Send a notice"
 msgstr "Skicka en notis"
@@ -5799,48 +6028,48 @@ msgstr ""
 "Tyvärr, hämtning av din geografiska plats tar längre tid än förväntat, var "
 "god försök igen senare"
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "N"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "S"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "Ö"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "V"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "på"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "i sammanhang"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Upprepad av"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Svara på denna notis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Svara"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Notis upprepad"
 
@@ -5872,10 +6101,6 @@ msgstr "Fel vid infogning av fjärrprofilen"
 msgid "Duplicate notice"
 msgstr "Duplicerad notis"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Du har blivit utestängd från att prenumerera."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Kunde inte infoga ny prenumeration."
@@ -5892,6 +6117,10 @@ msgstr "Svar"
 msgid "Favorites"
 msgstr "Favoriter"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Användare"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Inkorg"
@@ -5981,7 +6210,7 @@ msgstr "Upprepa denna notis?"
 msgid "Repeat this notice"
 msgstr "Upprepa denna notis"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Ingen enskild användare definierad för enanvändarläge."
 
@@ -6001,6 +6230,10 @@ msgstr "Sök webbplats"
 msgid "Keyword(s)"
 msgstr "Nyckelord"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Sök"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Sök hjälp"
@@ -6052,33 +6285,14 @@ msgstr "Personer som prenumererar på %s"
 msgid "Groups %s is a member of"
 msgstr "Grupper %s är en medlem i"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Redan prenumerant!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Användaren har blockerat dig."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Kunde inte prenumerera."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Kunde inte göra andra till prenumeranter hos dig."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Inte prenumerant!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Kunde inte ta bort själv-prenumeration."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Bjud in"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kunde inte ta bort prenumeration."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Bjud in vänner och kollegor att gå med dig på %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6130,67 +6344,67 @@ msgstr "Redigera avatar"
 msgid "User actions"
 msgstr "Åtgärder för användare"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Redigera profilinställningar"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Redigera"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Skicka ett direktmeddelande till denna användare"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Meddelande"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Moderera"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "ett par sekunder sedan"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "för nån minut sedan"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "för %d minuter sedan"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "för en timma sedan"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "för %d timmar sedan"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "för en dag sedan"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "för %d dagar sedan"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "för en månad sedan"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "för %d månader sedan"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "för ett år sedan"
 
index 85719532b8eaf0bf97642aae9711f3f53ccebdbb..f0527f3fa983c6229a8b0f61c9995d17ae257960 100644 (file)
@@ -1,5 +1,6 @@
 # Translation of StatusNet to Telugu
 #
+# Author@translatewiki.net: Brion
 # Author@translatewiki.net: Veeven
 # --
 # This file is distributed under the same license as the StatusNet package.
@@ -8,78 +9,85 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:03+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:50+0000\n"
 "Language-Team: Telugu\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "అంగీకరించు"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "సైటు అందుబాటు అమరికలు"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "నమోదు"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "అంతరంగికం"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "ఆహ్వానితులకు మాత్రమే"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "అంతరంగికం"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "ఆహ్వానితులు మాత్రమే నమోదు అవ్వగలిగేలా చెయ్యి."
 
-#: actions/accessadminpanel.php:173
-#, fuzzy
-msgid "Closed"
-msgstr "à°\85à°\9fà±\81à°µà°\82à°\9fà°¿ à°µà°¾à°¡à±\81à°\95à°°à°¿ à°²à±\87à°°à±\81."
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "à°\86à°¹à±\8dవానితà±\81à°²à°\95à±\81 à°®à°¾à°¤à±\8dà°°à°®à±\87"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "కొత్త నమోదులను అచేతనంచేయి."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "భద్రపరచు"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+#, fuzzy
+msgid "Closed"
+msgstr "అటువంటి వాడుకరి లేరు."
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "సైటు అమరికలను భద్రపరచు"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "భద్రపరచు"
+
+#. 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 "అటువంటి పేజీ లేదు"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -93,78 +101,87 @@ msgstr "అటువంటి పేజీ లేదు"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "అటువంటి వాడుకరి లేరు."
 
-#: actions/all.php:84
+#. 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 మరియు మిత్రులు, పేజీ %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s మరియు మిత్రులు"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "%s యొక్క మిత్రుల ఫీడు (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "%s యొక్క మిత్రుల ఫీడు (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "%s యొక్క మిత్రుల ఫీడు (ఆటమ్)"
 
-#: actions/all.php:127
+#. 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 "ఇది %s మరియు మిత్రుల కాలరేఖ కానీ ఇంకా ఎవరూ ఏమీ రాయలేదు."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr "ఇతరులకి చందా చేరండి, [ఏదైనా గుంపులో చేరండి](%%action.groups%%) లేదా మీరే ఏదైనా వ్రాయండి."
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "మీరు మరియు మీ స్నేహితులు"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -177,20 +194,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "నిర్ధారణ సంకేతం కనబడలేదు."
@@ -224,8 +241,9 @@ msgstr "వాడుకరిని తాజాకరించలేకున
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "వాడుకరికి ప్రొఫైలు లేదు."
 
@@ -250,7 +268,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -364,68 +382,68 @@ msgstr "వాడుకరిని తాజాకరించలేకున
 msgid "Could not find target user."
 msgstr "లక్ష్యిత వాడుకరిని కనుగొనలేకపోయాం."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "ఆ పేరుని ఇప్పటికే వాడుతున్నారు. మరోటి ప్రయత్నించండి."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "సరైన పేరు కాదు."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "హోమ్ పేజీ URL సరైనది కాదు."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "పూర్తి పేరు చాలా పెద్దగా ఉంది (గరిష్ఠంగా 255 అక్షరాలు)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "వివరణ చాలా పెద్దగా ఉంది (%d అక్షరాలు గరిష్ఠం)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "ప్రాంతం పేరు మరీ పెద్దగా ఉంది (255 అక్షరాలు గరిష్ఠం)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "చాలా మారుపేర్లు! %d గరిష్ఠం."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "తప్పుడు మారుపేరు: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "\"%s\" అన్న మారుపేరుని ఇప్పటికే వాడుతున్నారు. మరొకటి ప్రయత్నించండి."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "మారుపేరు పేరుతో సమానంగా ఉండకూడదు."
@@ -436,15 +454,15 @@ msgstr "మారుపేరు పేరుతో సమానంగా ఉం
 msgid "Group not found!"
 msgstr "గుంపు దొరకలేదు!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "మీరు ఇప్పటికే ఆ గుంపులో సభ్యులు."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "నిర్వాహకులు ఆ గుంపు నుండి మిమ్మల్ని నిరోధించారు."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "ఓపెన్ఐడీ ఫారమును సృష్టించలేకపోయాం: %s"
@@ -453,7 +471,7 @@ msgstr "ఓపెన్ఐడీ ఫారమును సృష్టించ
 msgid "You are not a member of this group."
 msgstr "మీరు ఈ గుంపులో సభ్యులు కాదు."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "వాడుకరి %sని %s గుంపు నుండి తొలగించలేకపోయాం."
@@ -485,7 +503,7 @@ msgstr "తప్పుడు పరిమాణం."
 #: 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:309
+#: 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
@@ -494,7 +512,7 @@ msgstr "తప్పుడు పరిమాణం."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -528,7 +546,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -551,13 +569,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "ఖాతా"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -633,18 +651,18 @@ msgstr ""
 msgid "%1$s / Favorites from %2$s"
 msgstr ""
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "%s యొక్క మైక్రోబ్లాగు"
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s కాలరేఖ"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -660,12 +678,12 @@ msgstr ""
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s బహిరంగ కాలరేఖ"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "అందరి నుండి %s తాజాకరణలు!"
@@ -675,17 +693,17 @@ msgstr "అందరి నుండి %s తాజాకరణలు!"
 msgid "Repeated to %s"
 msgstr "%sకి స్పందనలు"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "%s యొక్క పునరావృతాలు"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
@@ -701,8 +719,7 @@ msgstr "అటువంటి జోడింపు లేదు."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 #, fuzzy
 msgid "No nickname."
 msgstr "పేరు లేదు."
@@ -715,7 +732,7 @@ msgstr "పరిమాణం లేదు."
 msgid "Invalid size."
 msgstr "తప్పుడు పరిమాణం."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "అవతారం"
@@ -732,30 +749,30 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "అవతారపు అమరికలు"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "అసలు"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "మునుజూపు"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "తొలగించు"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "ఎగుమతించు"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "కత్తిరించు"
 
@@ -763,7 +780,7 @@ msgstr "కత్తిరించు"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "మీ అవతారానికి గానూ ఈ చిత్రం నుండి ఒక చతురస్రపు ప్రదేశాన్ని ఎంచుకోండి"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -795,22 +812,22 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "కాదు"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "ఈ వాడుకరిని నిరోధించకు"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "అవును"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "ఈ వాడుకరిని నిరోధించు"
 
@@ -818,40 +835,44 @@ msgstr "ఈ వాడుకరిని నిరోధించు"
 msgid "Failed to save block information."
 msgstr "నిరోధపు సమాచారాన్ని భద్రపరచడంలో విఫలమయ్యాం."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "అటువంటి గుంపు లేదు."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "వాడుకరికి ప్రొఫైలు లేదు."
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s మరియు మిత్రులు"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "ఈ గుంపు లోనికి చేరకుండా నిరోధించిన వాడుకరుల యొక్క జాబితా."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "అటువంటి వాడుకరి లేరు."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "అటువంటి వాడుకరి లేరు."
@@ -927,7 +948,7 @@ msgstr "మీరు ఈ ఉపకరణం యొక్క యజమాని 
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -952,12 +973,13 @@ msgstr "ఈ ఉపకరణాన్ని తొలగించకు"
 msgid "Delete this application"
 msgstr "ఈ ఉపకరణాన్ని తొలగించు"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "లోనికి ప్రవేశించలేదు."
@@ -984,7 +1006,7 @@ msgstr "మీరు నిజంగానే ఈ నోటీసుని త
 msgid "Do not delete this notice"
 msgstr "ఈ నోటీసుని తొలగించకు"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "ఈ నోటీసుని తొలగించు"
 
@@ -1000,7 +1022,7 @@ msgstr "మీరు స్థానిక వాడుకరులను మా
 msgid "Delete user"
 msgstr "వాడుకరిని తొలగించు"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1008,12 +1030,12 @@ msgstr ""
 "మీరు నిజంగానే ఈ వాడుకరిని తొలగించాలనుకుంటున్నారా? ఇది ఆ వాడుకరి భోగట్టాని డాటాబేసు నుండి తొలగిస్తుంది, "
 "వెనక్కి తేలేకుండా."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "ఈ వాడుకరిని తొలగించు"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "రూపురేఖలు"
 
@@ -1114,6 +1136,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "భద్రపరచు"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "రూపురేఖలని భద్రపరచు"
@@ -1209,29 +1242,29 @@ msgstr "%s గుంపుని మార్చు"
 msgid "You must be logged in to create a group."
 msgstr "గుంపుని సృష్టించడానికి మీరు లోనికి ప్రవేశించాలి."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "గుంపుని మార్చడానికి మీరు నిర్వాహకులయి ఉండాలి."
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "గుంపుని మార్చడానికి ఈ ఫారాన్ని ఉపయోగించండి."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "వివరణ చాలా పెద్దదిగా ఉంది (140 అక్షరాలు గరిష్ఠం)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "గుంపుని తాజాకరించలేకున్నాం."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "మారుపేర్లని సృష్టించలేకపోయాం."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "ఎంపికలు భద్రమయ్యాయి."
 
@@ -1561,7 +1594,7 @@ msgstr "వాడుకరిని ఇప్పటికే గుంపున
 msgid "User is not a member of group."
 msgstr "వాడుకరి ఈ గుంపులో సభ్యులు కాదు."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "వాడుకరిని గుంపు నుండి నిరోధించు"
 
@@ -1596,88 +1629,88 @@ msgstr "ఐడీ లేదు."
 msgid "You must be logged in to edit a group."
 msgstr "గుంపుని మార్చడానికి మీరు ప్రవేశించి ఉండాలి."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "గుంపు అలంకారం"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "మీ రూపురేఖలని తాజాకరించలేకపోయాం."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "అభిరుచులు భద్రమయ్యాయి."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "గుంపు చిహ్నం"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "మీ గుంపుకి మీరు ఒక చిహ్నాన్ని ఎక్కించవచ్చు. ఆ ఫైలు యొక్క గరిష్ఠ పరిమాణం %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "వాడుకరికి ప్రొఫైలు లేదు."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "చిహ్నంగా ఉండాల్సిన చతురస్త్ర ప్రదేశాన్ని బొమ్మ నుండి ఎంచుకోండి."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "చిహ్నాన్ని తాజాకరించాం."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "చిహ్నపు తాజాకరణ విఫలమైంది."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s గుంపు సభ్యులు"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%1$s గుంపు సభ్యులు, పేజీ %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "ఈ గుంపులో వాడుకరులు జాబితా."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "నిరోధించు"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "వాడుకరిని గుంపుకి ఒక నిర్వాహకునిగా చేయి"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "నిర్వాహకున్ని చేయి"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "ఈ వాడుకరిని నిర్వాహకున్ని చేయి"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
@@ -1922,16 +1955,19 @@ msgstr "వ్యక్తిగత సందేశం"
 msgid "Optionally add a personal message to the invitation."
 msgstr "ఐచ్ఛికంగా ఆహ్వానానికి వ్యక్తిగత సందేశం చేర్చండి."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "పంపించు"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%2$sలో చేరమని %1$s మిమ్మల్ని ఆహ్వానించారు"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -1966,7 +2002,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "గుంపుల్లో చేరడానికి మీరు ప్రవేశించి ఉండాలి."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "పేరు లేదు."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s %2$s గుంపులో చేరారు"
@@ -1975,11 +2016,11 @@ msgstr "%1$s %2$s గుంపులో చేరారు"
 msgid "You must be logged in to leave a group."
 msgstr "గుంపుని వదిలివెళ్ళడానికి మీరు ప్రవేశించి ఉండాలి."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "మీరు ఆ గుంపులో సభ్యులు కాదు."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%2$s గుంపు నుండి %1$s వైదొలిగారు"
@@ -1996,8 +2037,7 @@ msgstr "వాడుకరిపేరు లేదా సంకేతపదం
 msgid "Error setting user. You are probably not authorized."
 msgstr ""
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "ప్రవేశించండి"
 
@@ -2191,9 +2231,8 @@ msgid "You must be logged in to list your applications."
 msgstr "మీ ఉపకరణాలను చూడడానికి మీరు ప్రవేశించి ఉండాలి."
 
 #: actions/oauthappssettings.php:74
-#, fuzzy
 msgid "OAuth applications"
-msgstr "ఇతర ఎంపికలు"
+msgstr "OAuth ఉపకరణాలు"
 
 #: actions/oauthappssettings.php:85
 msgid "Applications you have registered"
@@ -2246,8 +2285,8 @@ msgstr "విషయ రకం "
 msgid "Only "
 msgstr "మాత్రమే "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2391,7 +2430,7 @@ msgstr "కొత్త సంకేతపదాన్ని భద్రపర
 msgid "Password saved."
 msgstr "సంకేతపదం భద్రమయ్యింది."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2424,7 +2463,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "సైటు"
 
@@ -2602,7 +2640,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 చిన్నబడి అక్షరాలు లేదా అంకెలు, విరామచిహ్నాలు మరియు ఖాళీలు తప్ప"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "పూర్తి పేరు"
@@ -2630,7 +2668,7 @@ msgid "Bio"
 msgstr "స్వపరిచయం"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2694,24 +2732,25 @@ msgstr "భాష మరీ పెద్దగా ఉంది (50 అక్ష
 msgid "Invalid tag: \"%s\""
 msgstr "'%s' అనే హోమ్ పేజీ సరైనదికాదు"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "ట్యాగులని భద్రపరచలేకున్నాం."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "ప్రొఫైలుని భద్రపరచలేకున్నాం."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "ట్యాగులని భద్రపరచలేకున్నాం."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "అమరికలు భద్రమయ్యాయి."
 
@@ -2724,48 +2763,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "ప్రజా కాలరేఖ, పేజీ %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "ప్రజా కాలరేఖ"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "ప్రజా వాహిని ఫీడు"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "ప్రజా వాహిని ఫీడు"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "ప్రజా వాహిని ఫీడు"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2774,7 +2813,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2947,8 +2986,7 @@ msgstr "క్షమించండి, తప్పు ఆహ్వాన స
 msgid "Registration successful"
 msgstr "నమోదు విజయవంతం"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "నమోదు"
 
@@ -3084,7 +3122,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "చందాచేరు"
 
@@ -3123,7 +3161,7 @@ msgstr "ఈ లైసెన్సుకి అంగీకరించకపో
 msgid "You already repeated that notice."
 msgstr "మీరు ఇప్పటికే ఆ వాడుకరిని నిరోధించారు."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "సృష్టితం"
@@ -3133,40 +3171,40 @@ msgstr "సృష్టితం"
 msgid "Repeated!"
 msgstr "సృష్టితం"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "%sకి స్పందనలు"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "%sకి స్పందనలు"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, 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 "ఇది %s మరియు మిత్రుల కాలరేఖ కానీ ఇంకా ఎవరూ ఏమీ రాయలేదు."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3175,7 +3213,7 @@ msgstr ""
 "మీరు ఇతర వాడుకరులతో సంభాషించవచ్చు, మరింత మంది వ్యక్తులకు చందాచేరవచ్చు లేదా [గుంపులలో చేరవచ్చు]"
 "(%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3202,7 +3240,6 @@ msgid "User is already sandboxed."
 msgstr "వాడుకరిని ఇప్పటికే గుంపునుండి నిరోధించారు."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3228,7 +3265,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "సైటు అమరికలను భద్రపరచు"
 
@@ -3259,7 +3296,7 @@ msgstr "సంస్ధ"
 msgid "Description"
 msgstr "వివరణ"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "గణాంకాలు"
@@ -3322,35 +3359,35 @@ msgstr "%1$sకి ఇష్టమైన నోటీసులు, పేజీ
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "%s యొక్క మిత్రుల ఫీడు"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "%s యొక్క మిత్రుల ఫీడు"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "%s యొక్క ఇష్టాంశాల ఫీడు (ఆటమ్)"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3358,7 +3395,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "మీకు నచ్చినవి పంచుకోడానికి ఇదొక మార్గం."
 
@@ -3372,67 +3409,67 @@ msgstr "%s గుంపు"
 msgid "%1$s group, page %2$d"
 msgstr "%1$s గుంపు సభ్యులు, పేజీ %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "గుంపు ప్రొఫైలు"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "గమనిక"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "మారుపేర్లు"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "గుంపు చర్యలు"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s గుంపు"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "సభ్యులు"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(ఏమీలేదు)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "అందరు సభ్యులూ"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "సృష్టితం"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3442,7 +3479,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3451,7 +3488,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "నిర్వాహకులు"
 
@@ -3802,16 +3839,26 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "చందాని సృష్టించలేకపోయాం."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "స్థానిక వాడుకరి కాదు."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:107
+#, fuzzy
+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
 #, fuzzy
 msgid "Subscribed"
 msgstr "చందాదార్లు"
@@ -3873,7 +3920,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3883,35 +3930,35 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr ""
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "జాబర్"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "%s యొక్క మైక్రోబ్లాగు"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "%s యొక్క సందేశముల ఫీడు"
@@ -3962,7 +4009,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "అటువంటి ట్యాగు లేదు."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -3995,71 +4042,73 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "వాడుకరి"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "ఈ స్టేటస్&zwnj;నెట్ సైటుకి వాడుకరి అమరికలు."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "ప్రొఫైలు"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "స్వపరిచయ పరిమితి"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "స్వపరిచయం యొక్క గరిష్ఠ పొడవు, అక్షరాలలో."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "కొత్త వాడుకరులు"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "కొత్త వాడుకరి స్వాగతం"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "కొత్త వాడుకరులకై స్వాగత సందేశం (255 అక్షరాలు గరిష్ఠం)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "అప్రమేయ చందా"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "ఉపయోగించాల్సిన యాంత్రిక కుదింపు సేవ."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "ఆహ్వానాలు"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "ఆహ్వానాలని చేతనంచేసాం"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr "వాడుకరులను కొత్త వారిని ఆహ్వానించడానికి అనుమతించాలా వద్దా."
 
@@ -4232,7 +4281,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "సంచిక"
 
@@ -4269,6 +4318,11 @@ msgstr "గుంపులో భాగం కాదు."
 msgid "Group leave failed."
 msgstr "గుంపు నుండి వైదొలగడం విఫలమైంది."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "గుంపుని తాజాకరించలేకున్నాం."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4286,68 +4340,99 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "ఈ సైటులో నోటీసులు రాయడం నుండి మిమ్మల్ని నిషేధించారు."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr ""
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "చందాదార్లు"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "చందాని తొలగించలేకపోయాం."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "చందాని తొలగించలేకపోయాం."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "@%2$s, %1$sకి స్వాగతం!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "గుంపుని సృష్టించలేకపోయాం."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "చందాని సృష్టించలేకపోయాం."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4390,122 +4475,190 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "ముంగిలి"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "వ్యక్తిగత"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "మీ ఈమెయిలు, అవతారం, సంకేతపదం మరియు ప్రౌఫైళ్ళను మార్చుకోండి"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "అనుసంధానించు"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "ఖాతా"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
-msgstr ""
+msgstr "అనుసంధానాలు"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "అనుసంధానించు"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "చందాలు"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "ఆహ్వానించు"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "నిర్వాహకులు"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
-msgstr ""
+msgstr "ఈ ఫారాన్ని ఉపయోగించి మీ స్నేహితులను మరియు సహోద్యోగులను ఈ సేవను వినియోగించుకోమని ఆహ్వానించండి."
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "నిష్క్రమించు"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "ఆహ్వానించు"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "సైటు నుండి నిష్క్రమించు"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "నిష్క్రమించు"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "కొత్త ఖాతా సృష్టించు"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "నమోదు"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "సైటులోని ప్రవేశించు"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "సహాయం"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "ప్రవేశించండి"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "సహాయం కావాలి!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "వెతుకు"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "సహాయం"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
-msgstr ""
+msgstr "మరిన్ని గుంపులకై వెతుకు"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "వెతుకు"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "సైటు గమనిక"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "స్థానిక వీక్షణలు"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "పేజీ గమనిక"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "చందాలు"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "సహాయం"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "గురించి"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "ప్రశ్నలు"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "సేవా నియమాలు"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "అంతరంగికత"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "మూలము"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "సంప్రదించు"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "బాడ్జి"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "స్టేటస్‌నెట్ మృదూపకరణ లైసెన్సు"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4514,12 +4667,12 @@ msgstr ""
 "**%%site.name%%** అనేది [%%site.broughtby%%](%%site.broughtbyurl%%) వారు "
 "అందిస్తున్న మైక్రో బ్లాగింగు సదుపాయం. "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** అనేది మైక్రో బ్లాగింగు సదుపాయం."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4530,97 +4683,161 @@ msgstr ""
 "html) కింద లభ్యమయ్యే [స్టేటస్&zwnj;నెట్](http://status.net/) మైక్రోబ్లాగింగ్ ఉపకరణం సంచిక %s "
 "పై నడుస్తుంది."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "కొత్త సందేశం"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "అన్నీ "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "పేజీకరణ"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "తర్వాత"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "ఇంతక్రితం"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "ఈ సైటుకి మీరు మార్పులు చేయలేరు."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "ప్రాథమిక సైటు స్వరూపణం"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "సైటు"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "రూపకల్పన స్వరూపణం"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "రూపురేఖలు"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "వాడుకరి స్వరూపణం"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "వాడుకరి"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS నిర్ధారణ"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS నిర్ధారణ"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "రూపకల్పన స్వరూపణం"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "సంచిక"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4678,11 +4895,11 @@ msgstr ""
 
 #: lib/applicationeditform.php:297
 msgid "Read-only"
-msgstr ""
+msgstr "చదవడం-మాత్రమే"
 
 #: lib/applicationeditform.php:315
 msgid "Read-write"
-msgstr ""
+msgstr "చదవడం-వ్రాయడం"
 
 #: lib/applicationeditform.php:316
 msgid "Default access for this application: read-only, or read-write"
@@ -4714,12 +4931,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "సంకేతపదం మార్పు"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "సంకేతపదం మార్పు"
@@ -4875,80 +5092,89 @@ msgstr "సందేశాన్ని భద్రపరచడంలో పొ
 msgid "Specify the name of the user to subscribe to"
 msgstr "ఏవరికి చందా చేరాలనుకుంటున్నారో ఆ వాడుకరి పేరు తెలియజేయండి"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "అటువంటి వాడుకరి లేరు"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "%sకి చందా చేరారు"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "ఎవరి నుండి చందా విరమించాలనుకుంటున్నారో ఆ వాడుకరి పేరు తెలియజేయండి"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "%s నుండి చందా విరమించారు"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr "ఈ లంకెని ఒకే సారి ఉపయోగించగలరు, మరియు అది పనిచేసేది 2 నిమిషాలు మాత్రమే: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "%s నుండి చందా విరమించారు"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "మీరు ఎవరికీ చందాచేరలేదు."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "%sకి స్పందనలు"
 msgstr[1] "%sకి స్పందనలు"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "మీకు చందాదార్లు ఎవరూ లేరు."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "%sకి స్పందనలు"
 msgstr[1] "%sకి స్పందనలు"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "మీరు ఏ గుంపులోనూ సభ్యులు కాదు."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
 msgstr[1] "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -4962,6 +5188,7 @@ msgid ""
 "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"
@@ -4989,20 +5216,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "నిర్ధారణ సంకేతం లేదు."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5192,24 +5419,24 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr "బొమ్మ కాదు లేదా పాడైపోయిన ఫైలు."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "అటువంటి సందేశమేమీ లేదు."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "తెలియని ఫైలు రకం"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "మెబై"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "కిబై"
 
@@ -5289,7 +5516,7 @@ msgstr ""
 "%7$s.\n"
 "\n"
 "----\n"
-"మీ ఈమెయిలు చిరునామాని లేదా గమనింపుల ఎంపికలను %8$s వద్ద మార్చుకోండి"
+"మీ ఈమెయిలు చిరునామాని లేదా గమనింపుల ఎంపికలను %8$s వద్ద మార్చుకోండి\n"
 
 #: lib/mail.php:258
 #, php-format
@@ -5434,7 +5661,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "నుండి"
 
@@ -5524,6 +5751,12 @@ msgstr ""
 msgid "Available characters"
 msgstr "అందుబాటులో ఉన్న అక్షరాలు"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "పంపించు"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5558,49 +5791,49 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "ఉ"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "ద"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "తూ"
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "ప"
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "సందర్భంలో"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "సృష్టితం"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "ఈ నోటీసుపై స్పందించండి"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "స్పందించండి"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "నోటీసుని తొలగించాం."
@@ -5635,10 +5868,6 @@ msgstr "దూరపు ప్రొపైలుని చేర్చటంల
 msgid "Duplicate notice"
 msgstr "కొత్త సందేశం"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "చందాచేరడం నుండి మిమ్మల్ని నిషేధించారు."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr ""
@@ -5655,6 +5884,10 @@ msgstr "స్పందనలు"
 msgid "Favorites"
 msgstr "ఇష్టాంశాలు"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "వాడుకరి"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "వచ్చినవి"
@@ -5738,16 +5971,14 @@ msgid "Popular"
 msgstr "ప్రాచుర్యం"
 
 #: lib/repeatform.php:107
-#, fuzzy
 msgid "Repeat this notice?"
-msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81à°ªà±\88 à°¸à±\8dà°ªà°\82దిà°\82à°\9aà°\82à°¡à°¿"
+msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81ని à°ªà±\81నరావà±\83తిà°\82à°\9aాలా?"
 
 #: lib/repeatform.php:132
-#, fuzzy
 msgid "Repeat this notice"
-msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81à°ªà±\88 à°¸à±\8dà°ªà°\82దిà°\82à°\9aà°\82à°¡à°¿"
+msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81ని à°ªà±\81నరావà±\83తిà°\82à°\9aà±\81"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5768,6 +5999,10 @@ msgstr "సైటుని వెతుకు"
 msgid "Keyword(s)"
 msgstr "కీపదము(లు)"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "వెతుకు"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "సహాయంలో వెతుకు"
@@ -5821,36 +6056,15 @@ msgstr "%sకి చందాచేరిన వ్యక్తులు"
 msgid "Groups %s is a member of"
 msgstr "%s సభ్యులుగా ఉన్న గుంపులు"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "ఇప్పటికే చందాచేరారు!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "వాడుకరి మిమ్మల్ని నిరోధించారు."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "చందా చేర్చలేకపోయాం."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "ఆహ్వానించు"
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "చందాదార్లు"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "చందాని తొలగించలేకపోయాం."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "చందాని తొలగించలేకపోయాం."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5903,68 +6117,68 @@ msgstr "అవతారాన్ని మార్చు"
 msgid "User actions"
 msgstr "వాడుకరి చర్యలు"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "ఫ్రొఫైలు అమరికలు"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "మార్చు"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "ఈ వాడుకరికి ఒక నేరు సందేశాన్ని పంపించండి"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "సందేశం"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "కొన్ని క్షణాల క్రితం"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "ఓ నిమిషం క్రితం"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d నిమిషాల క్రితం"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "ఒక గంట క్రితం"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d గంటల క్రితం"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "ఓ రోజు క్రితం"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "%d రోజుల క్రితం"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "ఓ నెల క్రితం"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "%d నెలల క్రితం"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "ఒక సంవత్సరం క్రితం"
 
index 5368680c6b5128409b95f6c91382e67301952dd8..71aaa68132161073fb6d54e31400c0e9a47720a9 100644 (file)
@@ -9,82 +9,88 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:08+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:53+0000\n"
 "Language-Team: Turkish\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Kabul et"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Ayarlar"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Kayıt"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Gizlilik"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 msgid "Invite only"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Böyle bir kullanıcı yok."
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Kaydet"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Ayarlar"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Kaydet"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Böyle bir durum mesajı yok."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -98,79 +104,88 @@ msgstr "Böyle bir durum mesajı yok."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Böyle bir kullanıcı yok."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s ve arkadaşları"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s ve arkadaşları"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s ve arkadaşları"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -183,20 +198,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Onay kodu bulunamadı."
@@ -230,8 +245,9 @@ msgstr "Kullanıcı güncellenemedi."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Kullanıcının profili yok."
 
@@ -256,7 +272,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -374,7 +390,7 @@ msgstr "Kullanıcı güncellenemedi."
 msgid "Could not find target user."
 msgstr "Kullanıcı güncellenemedi."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -382,62 +398,62 @@ msgstr ""
 "Takma ad sadece küçük harflerden ve rakamlardan oluşabilir, boşluk "
 "kullanılamaz. "
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Takma ad kullanımda. Başka bir tane deneyin."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Geçersiz bir takma ad."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Başlangıç sayfası adresi geçerli bir URL değil."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Tam isim çok uzun (azm: 255 karakter)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Hakkında bölümü çok uzun (azm 140 karakter)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Yer bilgisi çok uzun (azm: 255 karakter)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "%s Geçersiz başlangıç sayfası"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Takma ad kullanımda. Başka bir tane deneyin."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -449,16 +465,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "İstek bulunamadı!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "Zaten giriş yapmış durumdasıznız!"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Sunucuya yönlendirme yapılamadı: %s"
@@ -468,7 +484,7 @@ msgstr "Sunucuya yönlendirme yapılamadı: %s"
 msgid "You are not a member of this group."
 msgstr "Bize o profili yollamadınız"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "OpenID formu yaratılamadı: %s"
@@ -500,7 +516,7 @@ msgstr "Geçersiz büyüklük."
 #: 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:309
+#: 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
@@ -509,7 +525,7 @@ msgstr "Geçersiz büyüklük."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -544,7 +560,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -567,14 +583,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "Hakkında"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -655,18 +671,18 @@ msgstr "Desteklenmeyen görüntü dosyası biçemi."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s'in %2$s'deki durum mesajları "
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -682,12 +698,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -697,17 +713,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "%s için cevaplar"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "%s için cevaplar"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%s adli kullanicinin durum mesajlari"
@@ -725,8 +741,7 @@ msgstr "Böyle bir belge yok."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Takma ad yok"
 
@@ -738,7 +753,7 @@ msgstr ""
 msgid "Invalid size."
 msgstr "Geçersiz büyüklük."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Avatar"
@@ -755,31 +770,31 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 #, fuzzy
 msgid "Avatar settings"
 msgstr "Ayarlar"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr ""
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Yükle"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -787,7 +802,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -822,23 +837,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr ""
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Böyle bir kullanıcı yok."
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr ""
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "Böyle bir kullanıcı yok."
@@ -847,41 +862,45 @@ msgstr "Böyle bir kullanıcı yok."
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "Böyle bir durum mesajı yok."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Kullanıcının profili yok."
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s ve arkadaşları"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "Böyle bir kullanıcı yok."
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "Böyle bir kullanıcı yok."
@@ -962,7 +981,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:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -988,12 +1007,13 @@ msgstr "Böyle bir durum mesajı yok."
 msgid "Delete this application"
 msgstr "Kendinizi ve ilgi alanlarınızı 140 karakter ile anlatın"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Giriş yapılmadı."
@@ -1021,7 +1041,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "Böyle bir durum mesajı yok."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr ""
 
@@ -1039,19 +1059,19 @@ msgstr "Yerel aboneliği kullanabilirsiniz!"
 msgid "Delete user"
 msgstr ""
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Böyle bir kullanıcı yok."
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1162,6 +1182,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Kaydet"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1261,31 +1292,31 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Hakkında bölümü çok uzun (azm 140 karakter)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "Kullanıcı güncellenemedi."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Avatar bilgisi kaydedilemedi"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 #, fuzzy
 msgid "Options saved."
 msgstr "Ayarlar kaydedildi."
@@ -1628,7 +1659,7 @@ msgstr "Kullanıcının profili yok."
 msgid "User is not a member of group."
 msgstr "Bize o profili yollamadınız"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Böyle bir kullanıcı yok."
@@ -1664,91 +1695,91 @@ msgstr "Kullanıcı numarası yok"
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Kullanıcı güncellenemedi."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Tercihler kaydedildi."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "Kullanıcının profili yok."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "Avatar güncellendi."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "Avatar güncellemede hata."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%s adli kullanicinin durum mesajlari"
@@ -2004,16 +2035,19 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Gönder"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2048,7 +2082,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Takma ad yok"
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2057,12 +2096,12 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "Bize o profili yollamadınız"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s'in %2$s'deki durum mesajları "
@@ -2080,8 +2119,7 @@ msgstr "Yanlış kullanıcı adı veya parola."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Yetkilendirilmemiş."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Giriş"
 
@@ -2333,8 +2371,8 @@ msgstr "Bağlan"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2482,7 +2520,7 @@ msgstr "Yeni parola kaydedilemedi."
 msgid "Password saved."
 msgstr "Parola kaydedildi."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2515,7 +2553,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2700,7 +2737,7 @@ msgstr ""
 "verilmez"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Tam İsim"
@@ -2730,7 +2767,7 @@ msgid "Bio"
 msgstr "Hakkında"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2794,25 +2831,26 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "%s Geçersiz başlangıç sayfası"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Profil kaydedilemedi."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Profil kaydedilemedi."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "Profil kaydedilemedi."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Ayarlar kaydedildi."
 
@@ -2825,48 +2863,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "Genel zaman çizgisi"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Genel zaman çizgisi"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Genel Durum Akış RSS Beslemesi"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Genel Durum Akış RSS Beslemesi"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Genel Durum Akış RSS Beslemesi"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2875,7 +2913,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3048,8 +3086,7 @@ msgstr "Onay kodu hatası."
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Kayıt"
 
@@ -3177,7 +3214,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr ""
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Abone ol"
 
@@ -3217,7 +3254,7 @@ msgstr "Eğer lisansı kabul etmezseniz kayıt olamazsınız."
 msgid "You already repeated that notice."
 msgstr "Zaten giriş yapmış durumdasıznız!"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Yarat"
@@ -3227,47 +3264,47 @@ msgstr "Yarat"
 msgid "Repeated!"
 msgstr "Yarat"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "%s için cevaplar"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "%s için cevaplar"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3295,7 +3332,6 @@ msgid "User is already sandboxed."
 msgstr "Kullanıcının profili yok."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3320,7 +3356,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Ayarlar"
@@ -3355,7 +3391,7 @@ msgstr "Yer"
 msgid "Description"
 msgstr "Abonelikler"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "İstatistikler"
@@ -3416,35 +3452,35 @@ msgstr "%s ve arkadaşları"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "%s için arkadaş güncellemeleri RSS beslemesi"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3452,7 +3488,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3466,71 +3502,71 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "Bütün abonelikler"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Böyle bir durum mesajı yok."
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 #, fuzzy
 msgid "Note"
 msgstr "Durum mesajları"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "Üyelik başlangıcı"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Yarat"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3540,7 +3576,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3549,7 +3585,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3905,17 +3941,27 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr "Bize o profili yollamadınız"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Abonelik oluşturulamadı."
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "Böyle bir kullanıcı yok."
+msgid "No such profile."
+msgstr "Böyle bir durum mesajı yok."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Bize o profili yollamadınız"
+
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "Abone ol"
@@ -3976,7 +4022,7 @@ msgstr "Sizin durumlarını takip ettiğiniz kullanıcılar"
 msgid "These are the people whose notices %s listens to."
 msgstr "%s adlı kullanıcının durumlarını takip ettiği kullanıcılar"
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3986,36 +4032,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s %2$s'da durumunuzu takip ediyor"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "JabberID yok."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "%s adli kullanicinin durum mesajlari"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "%s için durum RSS beslemesi"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "%s için durum RSS beslemesi"
@@ -4069,7 +4115,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Böyle bir durum mesajı yok."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -4104,73 +4150,74 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Profil"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr ""
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Bütün abonelikler"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "Takip talebine izin verildi"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Yer"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4350,7 +4397,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Kişisel"
@@ -4391,6 +4438,11 @@ msgstr "Kullanıcı güncellenemedi."
 msgid "Group leave failed."
 msgstr "Böyle bir durum mesajı yok."
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Kullanıcı güncellenemedi."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4408,70 +4460,102 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Cevap eklenirken veritabanı hatası: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "User has blocked you."
+msgstr "Kullanıcının profili yok."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Bu kullanıcıyı zaten takip etmiyorsunuz!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Abonelik silinemedi."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Abonelik silinemedi."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "Avatar bilgisi kaydedilemedi"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Abonelik oluşturulamadı."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Abonelik oluşturulamadı."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Abonelik oluşturulamadı."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4515,127 +4599,188 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Başlangıç"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Kişisel"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "Bağlan"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "Parolayı değiştir"
 
-#: lib/action.php:444
+#: lib/action.php:447
 #, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Hakkında"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Sunucuya yönlendirme yapılamadı: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Bağlan"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Abonelikler"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
 msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Çıkış"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Geçersiz büyüklük."
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
 #, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Çıkış"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Yeni hesap oluştur"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Kayıt"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Yardım"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Giriş"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Yardım"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Ara"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Yardım"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Ara"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Abonelikler"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Yardım"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Hakkında"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "SSS"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Gizlilik"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Kaynak"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "İletişim"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4644,12 +4789,12 @@ msgstr ""
 "**%%site.name%%** [%%site.broughtby%%](%%site.broughtbyurl%%)\" tarafından "
 "hazırlanan anında mesajlaşma ağıdır. "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** bir aninda mesajlaşma sosyal ağıdır."
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4660,102 +4805,165 @@ 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:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "Yeni durum mesajı"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "« Sonra"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "Önce »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Yeni durum mesajı"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Kişisel"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Eposta adresi onayı"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Kişisel"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4853,12 +5061,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Parola kaydedildi."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Parola kaydedildi."
@@ -5013,80 +5221,90 @@ msgstr "Durum mesajını kaydederken hata oluştu."
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Böyle bir kullanıcı yok."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Aboneliği sonlandır"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Bize o profili yollamadınız"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Bize o profili yollamadınız"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Uzaktan abonelik"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Uzaktan abonelik"
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Bize o profili yollamadınız"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Bize o profili yollamadınız"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5100,6 +5318,7 @@ msgid ""
 "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"
@@ -5127,20 +5346,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Onay kodu yok."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5338,24 +5557,24 @@ msgstr "Dosya yüklemede sistem hatası."
 msgid "Not an image or corrupt file."
 msgstr "Bu bir resim dosyası değil ya da dosyada hata var"
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Desteklenmeyen görüntü dosyası biçemi."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Böyle bir durum mesajı yok."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5569,7 +5788,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr ""
 
@@ -5660,6 +5879,12 @@ msgstr ""
 msgid "Available characters"
 msgstr "6 veya daha fazla karakter"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Gönder"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5694,51 +5919,51 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "İçerik yok!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Yarat"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "cevapla"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Durum mesajları"
@@ -5772,10 +5997,6 @@ msgstr "Uzak profil eklemede hata oluştu"
 msgid "Duplicate notice"
 msgstr "Yeni durum mesajı"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Yeni abonelik eklenemedi."
@@ -5792,6 +6013,10 @@ msgstr "Cevaplar"
 msgid "Favorites"
 msgstr ""
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5886,7 +6111,7 @@ msgstr "Böyle bir durum mesajı yok."
 msgid "Repeat this notice"
 msgstr "Böyle bir durum mesajı yok."
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5908,6 +6133,10 @@ msgstr "Ara"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Ara"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -5962,37 +6191,15 @@ msgstr "Uzaktan abonelik"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-#, fuzzy
-msgid "User has blocked you."
-msgstr "Kullanıcının profili yok."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Bu kullanıcıyı zaten takip etmiyorsunuz!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Abonelik silinemedi."
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Abonelik silinemedi."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6046,68 +6253,68 @@ msgstr "Avatar"
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Profil ayarları"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr ""
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "birkaç saniye önce"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "yaklaşık bir dakika önce"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "yaklaşık %d dakika önce"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "yaklaşık bir saat önce"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "yaklaşık %d saat önce"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "yaklaşık bir gün önce"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "yaklaşık %d gün önce"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "yaklaşık bir ay önce"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "yaklaşık %d ay önce"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "yaklaşık bir yıl önce"
 
index 5f5fa846e69b1718169aec54b22b9ca108c989f4..fd168ba50c824d96b3dee0c34b4db390d74e0f79 100644 (file)
@@ -10,78 +10,85 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:16+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:56+0000\n"
 "Language-Team: Ukrainian\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10< =4 && (n%100<10 or n%100>=20) ? 1 : 2);\n"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 msgid "Access"
 msgstr "Погодитись"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 msgid "Site access settings"
 msgstr "Параметри доступу на сайт"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 msgid "Registration"
 msgstr "Реєстрація"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr "Приватно"
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
-msgstr "Лише за запрошеннями"
+#, fuzzy
+msgctxt "LABEL"
+msgid "Private"
+msgstr "Приватно"
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr "Зробити регістрацію лише за запрошеннями."
 
-#: actions/accessadminpanel.php:173
-msgid "Closed"
-msgstr "Закрито"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr "Лише за запрошеннями"
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr "Скасувати подальшу регістрацію."
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Зберегти"
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+msgid "Closed"
+msgstr "Закрито"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 msgid "Save access settings"
 msgstr "Зберегти параметри доступу"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зберегти"
+
+#. 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 "Немає такої сторінки"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -95,52 +102,59 @@ msgstr "Немає такої сторінки"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Такого користувача немає."
 
-#: actions/all.php:84
+#. 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 та друзі, сторінка %2$d"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s з друзями"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Стрічка дописів для друзів %s (RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Стрічка дописів для друзів %s (RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Стрічка дописів для друзів %s (Atom)"
 
-#: actions/all.php:127
+#. 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 "Це стрічка дописів %s і друзів, але вона поки що порожня."
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
@@ -149,7 +163,8 @@ msgstr ""
 "Спробуйте до когось підписатись, [приєднатись до групи](%%action.groups%%) "
 "або напишіть щось самі."
 
-#: actions/all.php:134
+#. 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 "
@@ -158,7 +173,7 @@ msgstr ""
 "Ви можете [«розштовхати» %1$s](../%2$s) зі сторінки його профілю або [щось "
 "йому написати](%%%%action.newnotice%%%%?status_textarea=%3$s)."
 
-#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 "
@@ -167,12 +182,13 @@ msgstr ""
 "Чому б не [зареєструватись](%%%%action.register%%%%) і не спробувати "
 "«розштовхати» %s або щось йому написати."
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 msgid "You and friends"
 msgstr "Ви з друзями"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "Оновлення від %1$s та друзів на %2$s!"
@@ -185,20 +201,20 @@ msgstr "Оновлення від %1$s та друзів на %2$s!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API метод не знайдено."
 
@@ -231,8 +247,9 @@ msgstr "Не вдалося оновити користувача."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Користувач не має профілю."
 
@@ -258,7 +275,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -369,7 +386,7 @@ msgstr "Не вдалось встановити джерело користув
 msgid "Could not find target user."
 msgstr "Не вдалося знайти цільового користувача."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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."
@@ -377,62 +394,62 @@ msgstr ""
 "Ім’я користувача повинно складатись з літер нижнього регістру і цифр, ніяких "
 "інтервалів."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Це ім’я вже використовується. Спробуйте інше."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Це недійсне ім’я користувача."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Веб-сторінка має недійсну URL-адресу."
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Повне ім’я задовге (255 знаків максимум)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Опис надто довгий (%d знаків максимум)."
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Локація надто довга (255 знаків максимум)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr "Забагато додаткових імен! Максимум становить %d."
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Помилкове додаткове ім’я: \"%s\""
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Додаткове ім’я \"%s\" вже використовується. Спробуйте інше."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr "Додаткове ім’я не може бути таким самим що й основне."
@@ -443,15 +460,15 @@ msgstr "Додаткове ім’я не може бути таким сами
 msgid "Group not found!"
 msgstr "Групу не знайдено!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr "Ви вже є учасником цієї групи."
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr "Адмін цієї групи заблокував Вашу присутність в ній."
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Не вдалось долучити користувача %1$s до групи %2$s."
@@ -460,7 +477,7 @@ msgstr "Не вдалось долучити користувача %1$s до г
 msgid "You are not a member of this group."
 msgstr "Ви не є учасником цієї групи."
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Не вдалось видалити користувача %1$s з групи %2$s."
@@ -491,7 +508,7 @@ msgstr "Невірний токен."
 #: 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:309
+#: 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
@@ -500,7 +517,7 @@ msgstr "Невірний токен."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -535,7 +552,7 @@ msgstr "Токен запиту %s було скасовано і відхиле
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -562,13 +579,13 @@ msgstr ""
 "на доступ до Вашого акаунту %4$s лише тим стороннім додаткам, яким Ви "
 "довіряєте."
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "Акаунт"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -646,18 +663,18 @@ msgstr "Формат не підтримується."
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s / Обрані від %2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s стрічка"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -673,12 +690,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s загальна стрічка"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "%s оновлення від усіх!"
@@ -688,17 +705,17 @@ msgstr "%s оновлення від усіх!"
 msgid "Repeated to %s"
 msgstr "Вторування за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Вторування %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Дописи позначені з %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Оновлення позначені з %1$s на %2$s!"
@@ -714,8 +731,7 @@ msgstr "Такого вкладення немає."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Немає імені."
 
@@ -727,7 +743,7 @@ msgstr "Немає розміру."
 msgid "Invalid size."
 msgstr "Недійсний розмір."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Аватара"
@@ -744,30 +760,30 @@ msgid "User without matching profile"
 msgstr "Користувач з невідповідним профілем"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Налаштування аватари"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "Оригінал"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Перегляд"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr "Видалити"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Завантажити"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "Втяти"
 
@@ -775,7 +791,7 @@ msgstr "Втяти"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "Оберіть квадратну ділянку зображення, яка й буде Вашою автарою."
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "Дані Вашого файлу десь загубились."
 
@@ -810,22 +826,22 @@ msgstr ""
 "більше не отримуватимете жодних дописів від нього."
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Ні"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 msgid "Do not block this user"
 msgstr "Не блокувати цього користувача"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Так"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 msgid "Block this user"
 msgstr "Блокувати користувача"
 
@@ -833,39 +849,43 @@ msgstr "Блокувати користувача"
 msgid "Failed to save block information."
 msgstr "Збереження інформації про блокування завершилось невдачею."
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "Такої групи немає."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, php-format
 msgid "%s blocked profiles"
 msgstr "Заблоковані профілі %s"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "Заблоковані профілі %1$s, сторінка %2$d"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr "Список користувачів блокованих в цій групі."
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 msgid "Unblock user from group"
 msgstr "Розблокувати користувача"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Розблокувати"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Розблокувати цього користувача"
 
@@ -940,7 +960,7 @@ msgstr "Ви не є власником цього додатку."
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr "Виникли певні проблеми з токеном поточної сесії."
 
@@ -966,12 +986,13 @@ msgstr "Не видаляти додаток"
 msgid "Delete this application"
 msgstr "Видалити додаток"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Не увійшли."
@@ -998,7 +1019,7 @@ msgstr "Ви впевненні, що бажаєте видалити цей д
 msgid "Do not delete this notice"
 msgstr "Не видаляти цей допис"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr "Видалити допис"
 
@@ -1014,7 +1035,7 @@ msgstr "Ви можете видаляти лише локальних кори
 msgid "Delete user"
 msgstr "Видалити користувача"
 
-#: actions/deleteuser.php:135
+#: 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."
@@ -1022,12 +1043,12 @@ msgstr ""
 "Впевнені, що бажаєте видалити цього користувача? Усі дані буде знищено без "
 "можливості відновлення."
 
-#: actions/deleteuser.php:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 msgid "Delete this user"
 msgstr "Видалити цього користувача"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr "Дизайн"
 
@@ -1130,6 +1151,17 @@ msgstr "Оновити налаштування за замовчуванням"
 msgid "Reset back to default"
 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/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 "Зберегти"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr "Зберегти дизайн"
@@ -1221,29 +1253,29 @@ msgstr "Редагувати групу %s"
 msgid "You must be logged in to create a group."
 msgstr "Ви маєте спочатку увійти, аби мати змогу створити групу."
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Ви маєте бути наділені правами адмінистратора, аби редагувати групу"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "Скористайтесь цією формою, щоб відредагувати групу."
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, php-format
 msgid "description is too long (max %d chars)."
 msgstr "опис надто довгий (%d знаків максимум)."
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "Не вдалося оновити групу."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 msgid "Could not create aliases."
 msgstr "Неможна призначити додаткові імена."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "Опції збережено."
 
@@ -1581,7 +1613,7 @@ msgstr "Користувача заблоковано в цій групі."
 msgid "User is not a member of group."
 msgstr "Користувач не є учасником групи."
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 msgid "Block user from group"
 msgstr "Блокувати користувача в групі"
 
@@ -1616,11 +1648,11 @@ msgstr "Немає ID."
 msgid "You must be logged in to edit a group."
 msgstr "Ви маєте спочатку увійти, аби мати змогу редагувати групу."
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr "Дизайн групи"
 
-#: actions/groupdesignsettings.php:152
+#: actions/groupdesignsettings.php:155
 msgid ""
 "Customize the way your group looks with a background image and a colour "
 "palette of your choice."
@@ -1628,20 +1660,20 @@ msgstr ""
 "Налаштуйте вигляд сторінки групи, використовуючи фонове зображення і кольори "
 "на свій смак."
 
-#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 msgid "Couldn't update your design."
 msgstr "Не вдалося оновити дизайн."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr "Преференції дизайну збережно."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "Логотип групи"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
@@ -1649,57 +1681,57 @@ msgstr ""
 "Ви маєте можливість завантажити логотип для Вашої группи. Максимальний "
 "розмір файлу %s."
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr "Користувач без відповідного профілю."
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr "Оберіть квадратну ділянку зображення, яка й буде логотипом групи."
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "Логотип оновлено."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 msgid "Failed updating logo."
 msgstr "Оновлення логотипу завершилось невдачею."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "Учасники групи %s"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Учасники групи %1$s, сторінка %2$d"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "Список учасників цієї групи."
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "Адмін"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "Блок"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr "Надати користувачеві права адміністратора"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr "Зробити адміном"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr "Надати цьому користувачеві права адміністратора"
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "Оновлення членів %1$s на %2$s!"
@@ -1965,16 +1997,19 @@ msgstr "Особисті повідомлення"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Можна додати персональне повідомлення до запрошення (опціонально)."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
-msgstr "Так!"
+msgstr "Ð\9dадÑ\96Ñ\81лаÑ\82и"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s запросив(ла) Вас приєднатися до нього(неї) на %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2036,7 +2071,11 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Ви повинні спочатку увійти на сайт, аби приєднатися до групи."
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+msgid "No nickname or ID."
+msgstr "Немає імені або ІД."
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%1$s приєднався до групи %2$s"
@@ -2045,11 +2084,11 @@ msgstr "%1$s приєднався до групи %2$s"
 msgid "You must be logged in to leave a group."
 msgstr "Ви повинні спочатку увійти на сайт, аби залишити групу."
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr "Ви не є учасником цієї групи."
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s залишив групу %2$s"
@@ -2066,8 +2105,7 @@ msgstr "Неточне ім’я або пароль."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Помилка. Можливо, Ви не авторизовані."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Увійти"
 
@@ -2323,8 +2361,8 @@ msgstr "тип змісту "
 msgid "Only "
 msgstr "Лише "
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Такий формат даних не підтримується."
 
@@ -2465,7 +2503,7 @@ msgstr "Неможна зберегти новий пароль."
 msgid "Password saved."
 msgstr "Пароль збережено."
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr "Шлях"
 
@@ -2498,7 +2536,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr "Помилковий SSL-сервер. Максимальна довжина 255 знаків."
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr "Сайт"
 
@@ -2671,7 +2708,7 @@ msgstr ""
 "1-64 літери нижнього регістру і цифри, ніякої пунктуації або інтервалів"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Повне ім’я"
@@ -2699,7 +2736,7 @@ msgid "Bio"
 msgstr "Про себе"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2766,23 +2803,24 @@ msgstr "Мова задовга (50 знаків максимум)."
 msgid "Invalid tag: \"%s\""
 msgstr "Недійсний теґ: \"%s\""
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "Не вдалося оновити користувача для автопідписки."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 msgid "Couldn't save location prefs."
 msgstr "Не вдалося зберегти налаштування розташування."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Не вдалося зберегти профіль."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 msgid "Couldn't save tags."
 msgstr "Не вдалося зберегти теґи."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Налаштування збережено."
 
@@ -2795,28 +2833,28 @@ msgstr "Досягнуто ліміту сторінки (%s)"
 msgid "Could not retrieve public stream."
 msgstr "Не вдається відновити загальну стрічку."
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr "Загальний стрічка, сторінка %d"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Загальна стрічка"
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Стрічка публічних дописів (RSS 1.0)"
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Стрічка публічних дописів (RSS 2.0)"
 
-#: actions/public.php:167
+#: actions/public.php:168
 msgid "Public Stream Feed (Atom)"
 msgstr "Стрічка публічних дописів (Atom)"
 
-#: actions/public.php:187
+#: actions/public.php:188
 #, php-format
 msgid ""
 "This is the public timeline for %%site.name%% but no one has posted anything "
@@ -2824,11 +2862,11 @@ msgid ""
 msgstr ""
 "Це публічна стрічка дописів сайту %%site.name%%, але вона поки що порожня."
 
-#: actions/public.php:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr "Станьте першим! Напишіть щось!"
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
@@ -2836,7 +2874,7 @@ msgstr ""
 "Чому б не [зареєструватись](%%action.register%%) і не зробити свій перший "
 "допис!"
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2850,7 +2888,7 @@ msgstr ""
 "розділити своє життя з друзями, родиною і колегами! ([Дізнатися більше](%%"
 "doc.help%%))"
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3030,8 +3068,7 @@ msgstr "Даруйте, помилка у коді запрошення."
 msgid "Registration successful"
 msgstr "Реєстрація успішна"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Реєстрація"
 
@@ -3179,7 +3216,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "URL-адреса Вашого профілю на іншому сумісному сервісі"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Підписатись"
 
@@ -3216,7 +3253,7 @@ msgstr "Ви не можете вторувати своїм власним до
 msgid "You already repeated that notice."
 msgstr "Ви вже вторували цьому допису."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 msgid "Repeated"
 msgstr "Вторування"
 
@@ -3224,33 +3261,33 @@ msgstr "Вторування"
 msgid "Repeated!"
 msgstr "Вторувати!"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Відповіді до %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "Відповіді до %1$s, сторінка %2$d"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Стрічка відповідей до %s (RSS 1.0)"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Стрічка відповідей до %s (RSS 2.0)"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Стрічка відповідей до %s (Atom)"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, php-format
 msgid ""
 "This is the timeline showing replies to %1$s but %2$s hasn't received a "
@@ -3259,7 +3296,7 @@ msgstr ""
 "Ця стрічка дописів містить відповіді для %1$s, але %2$s поки що нічого не "
 "отримав у відповідь."
 
-#: actions/replies.php:203
+#: actions/replies.php:204
 #, php-format
 msgid ""
 "You can engage other users in a conversation, subscribe to more people or "
@@ -3268,7 +3305,7 @@ msgstr ""
 "Ви можете долучити інших користувачів до спілкування, підписавшись до "
 "більшої кількості людей або [приєднавшись до груп](%%action.groups%%)."
 
-#: actions/replies.php:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3295,7 +3332,6 @@ msgid "User is already sandboxed."
 msgstr "Користувача ізольовано доки набереться уму-розуму."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr "Сесії"
 
@@ -3320,7 +3356,7 @@ msgid "Turn on debugging output for sessions."
 msgstr "Виводити дані сесії наладки."
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 msgid "Save site settings"
 msgstr "Зберегти налаштування сайту"
 
@@ -3350,7 +3386,7 @@ msgstr "Організація"
 msgid "Description"
 msgstr "Опис"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Статистика"
@@ -3413,22 +3449,22 @@ msgstr "Обрані дописи %1$s, сторінка %2$d"
 msgid "Could not retrieve favorite notices."
 msgstr "Не можна відновити обрані дописи."
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Стрічка обраних дописів %s (RSS 1.0)"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Стрічка обраних дописів %s (RSS 2.0)"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Стрічка обраних дописів %s (Atom)"
 
-#: actions/showfavorites.php:205
+#: 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."
@@ -3437,7 +3473,7 @@ msgstr ""
 "дописі який Ви вподобали, аби повернутись до нього пізніше, або звернути на "
 "нього увагу інших."
 
-#: actions/showfavorites.php:207
+#: actions/showfavorites.php:208
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Post something interesting "
@@ -3446,7 +3482,7 @@ msgstr ""
 "%s поки що не вподобав жодних дописів. Може Ви б написали йому щось "
 "цікаве? :)"
 
-#: actions/showfavorites.php:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3457,7 +3493,7 @@ msgstr ""
 "action.register%%%%) і не написати щось цікаве, що мало б сподобатись цьому "
 "користувачеві :)"
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr "Це спосіб поділитись з усіма тим, що вам подобається."
 
@@ -3471,67 +3507,67 @@ msgstr "Група %s"
 msgid "%1$s group, page %2$d"
 msgstr "Група %1$s, сторінка %2$d"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 msgid "Group profile"
 msgstr "Профіль групи"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr "Зауваження"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr "Додаткові імена"
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "Діяльність групи"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Стрічка дописів групи %s (RSS 1.0)"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Стрічка дописів групи %s (RSS 2.0)"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Стрічка дописів групи %s (Atom)"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "FOAF для групи %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Учасники"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(Пусто)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "Всі учасники"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 msgid "Created"
 msgstr "Створено"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3546,7 +3582,7 @@ msgstr ""
 "короткі дописи про своє життя та інтереси. [Приєднуйтесь](%%action.register%"
 "%) зараз і долучіться до спілкування! ([Дізнатися більше](%%doc.help%%))"
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3559,7 +3595,7 @@ msgstr ""
 "забезпеченні [StatusNet](http://status.net/). Члени цієї групи роблять "
 "короткі дописи про своє життя та інтереси. "
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr "Адміни"
 
@@ -3928,15 +3964,24 @@ msgstr "Код не введено"
 msgid "You are not subscribed to that profile."
 msgstr "Ви не підписані до цього профілю."
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 msgid "Could not save subscription."
 msgstr "Не вдалося зберегти підписку."
 
-#: actions/subscribe.php:55
-msgid "Not a local user."
-msgstr "Такого ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð½ÐµÐ¼Ð°Ñ\94."
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr "ЦÑ\8f Ð´Ñ\96Ñ\8f Ð¿Ñ\80иймаÑ\94 Ð»Ð¸Ñ\88е Ð·Ð°Ð¿Ð¸Ñ\82и POST."
 
-#: actions/subscribe.php:69
+#: 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 "Цією дією Ви не зможете підписатися до віддаленого профілю OMB 0.1."
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Підписані"
 
@@ -4000,7 +4045,7 @@ msgstr "Тут представлені ті, за чиїми дописами 
 msgid "These are the people whose notices %s listens to."
 msgstr "Тут представлені ті, за чиїми дописами слідкує %s."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4016,35 +4061,35 @@ msgstr ""
 "action.twittersettings%%), то можете автоматично підписатись до людей, за "
 "якими слідкуєте там."
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, php-format
 msgid "%s is not listening to anyone."
 msgstr "%s не відслідковує нічого"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 msgid "Jabber"
 msgstr "Jabber"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "СМС"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Дописи з теґом %1$s, сторінка %2$d"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Стрічка дописів для теґу %s (RSS 1.0)"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Стрічка дописів для теґу %s (RSS 2.0)"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Стрічка дописів для теґу %s (Atom)"
@@ -4098,7 +4143,7 @@ msgstr "Скористайтесь цією формою, щоб додати т
 msgid "No such tag."
 msgstr "Такого теґу немає."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API метод наразі знаходиться у розробці."
 
@@ -4128,70 +4173,72 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr "Ліцензія «%1$s» не відповідає ліцензії сайту «%2$s»."
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "Користувач"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr "Власні налаштування користувача для цього сайту StatusNet."
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr "Помилкове обмеження біо. Це мають бути цифри."
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr "Помилковий текст привітання. Максимальна довжина 255 знаків."
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr "Помилкова підписка за замовчуванням: '%1$s' не є користувачем."
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Профіль"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr "Обмеження біо"
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr "Максимальна довжина біо користувача в знаках."
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr "Нові користувачі"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr "Привітання нового користувача"
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr "Текст привітання нових користувачів (255 знаків)."
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 msgid "Default subscription"
 msgstr "Підписка за замовчуванням"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr "Автоматично підписувати нових користувачів до цього користувача."
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 msgid "Invitations"
 msgstr "Запрошення"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr "Запрошення скасовано"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 "В той чи інший спосіб дозволити користувачам вітати нових користувачів."
@@ -4389,7 +4436,7 @@ msgstr ""
 msgid "Plugins"
 msgstr "Додатки"
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 msgid "Version"
 msgstr "Версія"
 
@@ -4428,6 +4475,10 @@ msgstr "Не є частиною групи."
 msgid "Group leave failed."
 msgstr "Не вдалося залишити групу."
 
+#: 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"
@@ -4445,27 +4496,27 @@ msgstr "Не можна долучити повідомлення."
 msgid "Could not update message with new URI."
 msgstr "Не можна оновити повідомлення з новим URI."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Помилка бази даних при додаванні теґу: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 msgid "Problem saving notice. Too long."
 msgstr "Проблема при збереженні допису. Надто довге."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при збереженні допису. Невідомий користувач."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Дуже багато дописів за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4473,41 +4524,68 @@ msgstr ""
 "Дуже багато повідомлень за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "Вам заборонено надсилати дописи до цього сайту."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Проблема при збереженні допису."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 msgid "Problem saving group inbox."
 msgstr "Проблема при збереженні вхідних дописів для групи."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Помилка бази даних при додаванні відповіді: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr "RT @%1$s %2$s"
 
-#: classes/User.php:385
+#: 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:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Не вдалося видалити підписку."
+
+#: classes/User.php:373
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Вітаємо на %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "Не вдалося створити нову групу."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+msgid "Could not set group URI."
+msgstr "Не вдалося встановити URI групи."
+
+#: classes/User_group.php:492
 msgid "Could not set group membership."
 msgstr "Не вдалося встановити членство."
 
+#: classes/User_group.php:506
+msgid "Could not save local group info."
+msgstr "Не вдалося зберегти інформацію про локальну групу."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Змінити налаштування профілю"
@@ -4549,120 +4627,190 @@ msgstr "Сторінка без заголовку"
 msgid "Primary site navigation"
 msgstr "Відправна навігація по сайту"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Дім"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "Персональний профіль і стрічка друзів"
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Особисте"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Змінити електронну адресу, аватару, пароль, профіль"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "З’єднання"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Акаунт"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "З’єднання з сервісами"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "З’єднання"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Змінити конфігурацію сайту"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Запросити"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "Адмін"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
-#, php-format
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
+#, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "Запросіть друзів та колег приєднатись до Вас на %s"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "Вийти"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Запросити"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "Вийти з сайту"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Вийти"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Створити новий акаунт"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Реєстрація"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "Увійти на сайт"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Допомога"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Увійти"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Допоможіть!"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Пошук"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Допомога"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "Пошук людей або текстів"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "Пошук"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 msgid "Site notice"
 msgstr "Зауваження сайту"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "Огляд"
 
-#: lib/action.php:625
+#: lib/action.php:656
 msgid "Page notice"
 msgstr "Зауваження сторінки"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr "Другорядна навігація по сайту"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Допомога"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Про"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "ЧаПи"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr "Умови"
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Конфіденційність"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Джерело"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Контакт"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr "Бедж"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "Ліцензія програмного забезпечення StatusNet"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4671,12 +4819,12 @@ msgstr ""
 "**%%site.name%%** — це сервіс мікроблоґів наданий вам [%%site.broughtby%%](%%"
 "site.broughtbyurl%%). "
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** — це сервіс мікроблоґів. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4687,96 +4835,161 @@ msgstr ""
 "для мікроблоґів, версія %s, доступному під [GNU Affero General Public "
 "License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 msgid "Site content license"
 msgstr "Ліцензія змісту сайту"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr "Зміст і дані %1$s є приватними і конфіденційними."
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr "Авторські права на зміст і дані належать %1$s. Всі права захищено."
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторські права на зміст і дані належать розробникам. Всі права захищено."
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "Всі "
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "ліцензія."
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "Нумерація сторінок"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr "Вперед"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 msgid "Before"
 msgstr "Назад"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr "Поки що не можу обробити віддалений контент."
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr "Поки що не можу обробити вбудований XML контент."
+
+#: lib/activity.php:481
+msgid "Can't handle embedded Base64 content yet."
+msgstr "Поки що не можу обробити вбудований контент Base64."
+
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:98
 msgid "You cannot make changes to this site."
 msgstr "Ви не можете щось змінювати на цьому сайті."
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr "Для цієї панелі зміни не припустимі."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr "showForm() не виконано."
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr "saveSettings() не виконано."
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr "Немає можливості видалити налаштування дизайну."
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 msgid "Basic site configuration"
 msgstr "Основна конфігурація сайту"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Сайт"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 msgid "Design configuration"
 msgstr "Конфігурація дизайну"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Дизайн"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 msgid "User configuration"
 msgstr "Конфігурація користувача"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "Користувач"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 msgid "Access configuration"
 msgstr "Прийняти конфігурацію"
 
-#: lib/adminpanelaction.php:332
+#. 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
 msgid "Paths configuration"
 msgstr "Конфігурація шляху"
 
-#: lib/adminpanelaction.php:337
+#. 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
 msgid "Sessions configuration"
 msgstr "Конфігурація сесій"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Сесії"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 "API-ресурс вимагає дозвіл типу «читання-запис», але у вас є лише доступ для "
 "читання."
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4868,11 +5081,11 @@ msgstr "Дописи, до яких прикріплено це вкладенн
 msgid "Tags for this attachment"
 msgstr "Теґи для цього вкладення"
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr "Не вдалося змінити пароль"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr "Змінювати пароль не дозволено"
 
@@ -5023,84 +5236,93 @@ msgstr "Проблема при збереженні допису."
 msgid "Specify the name of the user to subscribe to"
 msgstr "Зазначте ім’я користувача, до якого бажаєте підписатись"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "Такого користувача немає."
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "Підписано до %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "Зазначте ім’я користувача, від якого бажаєте відписатись"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "Відписано від %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "Виконання команди ще не завершено."
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "Сповіщення вимкнуто."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "Не можна вимкнути сповіщення."
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "Сповіщення увімкнуто."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "Не можна увімкнути сповіщення."
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr "Команду входу відключено"
 
-#: lib/command.php:652
+#: lib/command.php:665
 #, php-format
 msgid "This link is useable only once, and is good for only 2 minutes: %s"
 msgstr ""
 "Це посилання можна використати лише раз, воно дійсне протягом 2 хвилин: %s"
 
-#: lib/command.php:668
+#: lib/command.php:692
+#, php-format
+msgid "Unsubscribed  %s"
+msgstr "Відписано %s"
+
+#: lib/command.php:709
 msgid "You are not subscribed to anyone."
 msgstr "Ви не маєте жодних підписок."
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Ви підписані до цієї особи:"
 msgstr[1] "Ви підписані до цих людей:"
 msgstr[2] "Ви підписані до цих людей:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 msgid "No one is subscribed to you."
 msgstr "До Вас ніхто не підписаний."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Ця особа є підписаною до Вас:"
 msgstr[1] "Ці люди підписані до Вас:"
 msgstr[2] "Ці люди підписані до Вас:"
 
-#: lib/command.php:712
+#: lib/command.php:753
 msgid "You are not a member of any groups."
 msgstr "Ви не є учасником жодної групи."
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Ви є учасником групи:"
 msgstr[1] "Ви є учасником таких груп:"
 msgstr[2] "Ви є учасником таких груп:"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5114,6 +5336,7 @@ msgid ""
 "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"
@@ -5176,19 +5399,19 @@ msgstr ""
 "tracks — наразі не виконується\n"
 "tracking — наразі не виконується\n"
 
-#: lib/common.php:135
+#: lib/common.php:148
 msgid "No configuration file found. "
 msgstr "Файлу конфігурації не знайдено. "
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr "Шукав файли конфігурації в цих місцях: "
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr "Запустіть файл інсталяції, аби полагодити це."
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr "Іти до файлу інсталяції."
 
@@ -5377,23 +5600,23 @@ msgstr "Система відповіла помилкою при заванта
 msgid "Not an image or corrupt file."
 msgstr "Це не зображення, або файл зіпсовано."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Формат зображення не підтримується."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 msgid "Lost our file."
 msgstr "Файл втрачено."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "Тип файлу не підтримується"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr "Мб"
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr "кб"
 
@@ -5683,7 +5906,7 @@ msgstr ""
 "повідомлення аби долучити користувачів до розмови. Такі повідомлення бачите "
 "лише Ви."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "від"
 
@@ -5775,6 +5998,11 @@ msgstr "До"
 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 "Надіслати допис"
@@ -5808,48 +6036,48 @@ msgstr ""
 "На жаль, отримання інформації щодо Вашого місцезнаходження займе більше "
 "часу, ніж очікувалось; будь ласка, спробуйте пізніше"
 
-#: lib/noticelist.php:428
+#: lib/noticelist.php:429
 #, php-format
 msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr "Півн."
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr "Півд."
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr "Сх."
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr "Зах."
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr "в"
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 msgid "in context"
 msgstr "в контексті"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 msgid "Repeated by"
 msgstr "Вторуванні"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr "Відповісти на цей допис"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Відповісти"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 msgid "Notice repeated"
 msgstr "Допис вторували"
 
@@ -5881,10 +6109,6 @@ msgstr "Помилка при додаванні віддаленого проф
 msgid "Duplicate notice"
 msgstr "Дублікат допису"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr "Вас позбавлено можливості підписатись."
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Не вдалося додати нову підписку."
@@ -5901,6 +6125,10 @@ msgstr "Відповіді"
 msgid "Favorites"
 msgstr "Обрані"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "Користувач"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "Вхідні"
@@ -5990,7 +6218,7 @@ msgstr "Повторити цей допис?"
 msgid "Repeat this notice"
 msgstr "Вторувати цьому допису"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr "Користувача для однокористувацького режиму не визначено."
 
@@ -6010,6 +6238,10 @@ msgstr "Пошук"
 msgid "Keyword(s)"
 msgstr "Ключові слова"
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Пошук"
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr "Пошук"
@@ -6061,33 +6293,14 @@ msgstr "Люди підписані до %s"
 msgid "Groups %s is a member of"
 msgstr "%s бере участь в цих групах"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr "Вже підписаний!"
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr "Користувач заблокував Вас."
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "Невдала підписка."
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "Не вдалося підписати інших до Вас."
-
-#: lib/subs.php:137
-msgid "Not subscribed!"
-msgstr "Не підписано!"
-
-#: lib/subs.php:142
-msgid "Couldn't delete self-subscription."
-msgstr "Не можу видалити самопідписку."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Запросити"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Не вдалося видалити підписку."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "Запросіть друзів та колег приєднатись до Вас на %s"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6139,67 +6352,67 @@ msgstr "Аватара"
 msgid "User actions"
 msgstr "Діяльність користувача"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 msgid "Edit profile settings"
 msgstr "Налаштування профілю"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr "Правка"
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr "Надіслати пряме повідомлення цьому користувачеві"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr "Повідомлення"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr "Модерувати"
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "мить тому"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "хвилину тому"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "близько %d хвилин тому"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "годину тому"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "близько %d годин тому"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "день тому"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "близько %d днів тому"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "місяць тому"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "близько %d місяців тому"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "рік тому"
 
index cf152eff5f4d063f0571a73d0287f989e8118211..d64fae91d4faece901ab57e9c2a34e0f096cbd21 100644 (file)
@@ -7,83 +7,89 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:19+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:03:59+0000\n"
 "Language-Team: Vietnamese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "Chấp nhận"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "Thay đổi hình đại diện"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "Đăng ký"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "Riêng tư"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "Thư mời"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "Ban user"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "Lưu"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "Thay đổi hình đại diện"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Lưu"
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "Không có tin nhắn nào."
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -97,79 +103,88 @@ msgstr "Không có tin nhắn nào."
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "Không có user nào."
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s và bạn bè"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s và bạn bè"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s và bạn bè"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -182,20 +197,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Phương thức API không tìm thấy!"
@@ -229,8 +244,9 @@ msgstr "Không thể cập nhật thành viên."
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "Người dùng không có thông tin."
 
@@ -255,7 +271,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -378,68 +394,68 @@ msgstr "Không thể lấy lại các tin nhắn ưa thích"
 msgid "Could not find target user."
 msgstr "Không tìm thấy bất kỳ trạng thái nào."
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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 "Biệt hiệu phải là chữ viết thường hoặc số và không có khoảng trắng."
 
-#: actions/apigroupcreate.php:173 actions/editgroup.php:186
+#: 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 "Biệt hiệu này đã dùng rồi. Hãy nhập biệt hiệu khác."
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "Biệt hiệu không hợp lệ."
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "Trang chủ không phải là URL"
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "Tên đầy đủ quá dài (tối đa là 255 ký tự)."
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "Lý lịch quá dài (không quá 140 ký tự)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "Tên khu vực quá dài (không quá 255 ký tự)."
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "Trang chủ '%s'  không hợp lệ"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "Biệt hiệu này đã dùng rồi. Hãy nhập biệt hiệu khác."
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -451,16 +467,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "Phương thức API không tìm thấy!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "Bạn đã theo những người này:"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè của bạn rồi."
@@ -470,7 +486,7 @@ msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè c
 msgid "You are not a member of this group."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè của bạn rồi."
@@ -502,7 +518,7 @@ msgstr "Kích thước không hợp lệ."
 #: 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:309
+#: 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
@@ -511,7 +527,7 @@ msgstr "Kích thước không hợp lệ."
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -546,7 +562,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -569,14 +585,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "Giới thiệu"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -656,18 +672,18 @@ msgstr "Không hỗ trợ kiểu file ảnh này."
 msgid "%1$s / Favorites from %2$s"
 msgstr "Tìm kiếm các tin nhắn ưa thích của %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: 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:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -683,12 +699,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, fuzzy, php-format
 msgid "%s public timeline"
 msgstr "Dòng tin công cộng"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 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!"
@@ -698,17 +714,17 @@ msgstr "%s cập nhật từ tất cả mọi người!"
 msgid "Repeated to %s"
 msgstr "Trả lời cho %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "Trả lời cho %s"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "Thông báo được gắn thẻ %s"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "Dòng tin nhắn cho %s"
@@ -726,8 +742,7 @@ msgstr "Không có tài liệu nào."
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "Không có biệt hiệu."
 
@@ -739,7 +754,7 @@ msgstr "Không có kích thước."
 msgid "Invalid size."
 msgstr "Kích thước không hợp lệ."
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "Hình đại diện"
@@ -759,31 +774,31 @@ 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"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "Thay đổi hình đại diện"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "Xem trước"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete"
 msgstr "Xóa tin nhắn"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "Tải file"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 #, fuzzy
 msgid "Crop"
 msgstr "Nhóm"
@@ -792,7 +807,7 @@ msgstr "Nhóm"
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -827,23 +842,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "Không"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "Bỏ chặn người dùng này"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "Có"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "Ban user"
@@ -852,41 +867,45 @@ msgstr "Ban user"
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "Không có tin nhắn nào."
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "Hồ sơ"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s và bạn bè"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "Bỏ chặn người dùng này"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "Bỏ chặn"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 msgid "Unblock this user"
 msgstr "Bỏ chặn người dùng này"
 
@@ -966,7 +985,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:1195
+#: lib/action.php:1228
 #, 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."
@@ -993,12 +1012,13 @@ msgstr "Không thể xóa tin nhắn này."
 msgid "Delete this application"
 msgstr "Xóa tin nhắn"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "Chưa đăng nhập."
@@ -1027,7 +1047,7 @@ msgstr "Bạn có chắc chắn là muốn xóa tin nhắn này không?"
 msgid "Do not delete this notice"
 msgstr "Không thể xóa tin nhắn này."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete this notice"
 msgstr "Xóa tin nhắn"
@@ -1047,19 +1067,19 @@ msgstr "Bạn đã không xóa trạng thái của những người khác."
 msgid "Delete user"
 msgstr "Xóa tin nhắn"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "Xóa tin nhắn"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1174,6 +1194,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "Lưu"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 #, fuzzy
 msgid "Save design"
@@ -1279,32 +1310,32 @@ msgstr "%s và nhóm"
 msgid "You must be logged in to create a group."
 msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "Lý lịch quá dài (không quá 140 ký tự)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "Không thể cập nhật thành viên."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Không thể tạo favorite."
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 #, fuzzy
 msgid "Options saved."
 msgstr "Đã lưu các điều chỉnh."
@@ -1668,7 +1699,7 @@ msgstr "Người dùng không có thông tin."
 msgid "User is not a member of group."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "Ban user"
@@ -1705,95 +1736,95 @@ msgstr "Không có id."
 msgid "You must be logged in to edit a group."
 msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "Nhóm"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "Không thể cập nhật thành viên."
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "Các tính năng đã được lưu."
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 #, fuzzy
 msgid "Group logo"
 msgstr "Mã nhóm"
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 #, 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"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "Hình đại diện đã được cập nhật."
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "Cập nhật hình đại diện không thành công."
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, fuzzy, php-format
 msgid "%s group members"
 msgstr "Thành viên"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "Thành viên"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 #, fuzzy
 msgid "Make user an admin of the group"
 msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 #, fuzzy
 msgid "Make this user an admin"
 msgstr "Kênh mà bạn tham gia"
 
-#: actions/grouprss.php:133
+#: 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"
@@ -2057,16 +2088,19 @@ msgstr "Tin nhắn cá nhân"
 msgid "Optionally add a personal message to the invitation."
 msgstr "Không bắt buộc phải thêm thông điệp vào thư mời."
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "Gửi"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s moi ban tham gia vao %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2128,7 +2162,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "Không có biệt hiệu."
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s và nhóm"
@@ -2138,12 +2177,12 @@ msgstr "%s và nhóm"
 msgid "You must be logged in to leave a group."
 msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những "
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s và nhóm"
@@ -2161,8 +2200,7 @@ msgstr "Sai tên đăng nhập hoặc mật khẩu."
 msgid "Error setting user. You are probably not authorized."
 msgstr "Chưa được phép."
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "Đăng nhập"
 
@@ -2422,8 +2460,8 @@ msgstr "Kết nối"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "Không hỗ trợ định dạng dữ liệu này."
 
@@ -2575,7 +2613,7 @@ 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 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2608,7 +2646,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "Thư mời"
@@ -2797,7 +2834,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64 chữ cái thường hoặc là chữ số, không có dấu chấm hay "
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "Tên đầy đủ"
@@ -2826,7 +2863,7 @@ msgid "Bio"
 msgstr "Lý lịch"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2891,26 +2928,27 @@ msgstr "Ngôn ngữ quá dài (tối đa là 50 ký tự)."
 msgid "Invalid tag: \"%s\""
 msgstr "Trang chủ '%s'  không hợp lệ"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 #, fuzzy
 msgid "Couldn't update user for autosubscribe."
 msgstr "Không thể cập nhật thành viên."
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Không thể lưu hồ sơ cá nhân."
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "Không thể lưu hồ sơ cá nhân."
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "Không thể lưu hồ sơ cá nhân."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "Đã lưu các điều chỉnh."
 
@@ -2924,48 +2962,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "Không thể lấy lại các tin nhắn ưa thích"
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "Dòng tin công cộng"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "Dòng tin công cộng"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "Dòng tin công cộng"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "Dòng tin công cộng"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "Dòng tin công cộng"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2974,7 +3012,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3148,8 +3186,7 @@ msgstr "Lỗi xảy ra với mã xác nhận."
 msgid "Registration successful"
 msgstr "Đăng ký thành công"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "Đăng ký"
 
@@ -3295,7 +3332,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "Theo bạn này"
 
@@ -3336,7 +3373,7 @@ msgstr "Bạn không thể đăng ký nếu không đồng ý các điều kho
 msgid "You already repeated that notice."
 msgstr "Bạn đã theo những người này:"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "Tạo"
@@ -3346,47 +3383,47 @@ msgstr "Tạo"
 msgid "Repeated!"
 msgstr "Tạo"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "Trả lời cho %s"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "%s chào mừng bạn "
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3414,7 +3451,6 @@ msgid "User is already sandboxed."
 msgstr "Người dùng không có thông tin."
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3439,7 +3475,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "Thay đổi hình đại diện"
@@ -3474,7 +3510,7 @@ msgstr "Thư mời đã gửi"
 msgid "Description"
 msgstr "Mô tả"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "Số liệu thống kê"
@@ -3536,35 +3572,35 @@ msgstr "Những tin nhắn ưa thích của %s"
 msgid "Could not retrieve favorite notices."
 msgstr "Không thể lấy lại các tin nhắn ưa thích"
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "Chọn những người bạn của %s"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3572,7 +3608,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3586,72 +3622,72 @@ msgstr "%s và nhóm"
 msgid "%1$s group, page %2$d"
 msgstr "Thành viên"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "Thông tin nhóm"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 #, fuzzy
 msgid "Note"
 msgstr "Tin nhắn"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 #, fuzzy
 msgid "Group actions"
 msgstr "Mã nhóm"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "Hộp thư đi của %s"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 msgid "Members"
 msgstr "Thành viên"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 #, fuzzy
 msgid "All members"
 msgstr "Thành viên"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "Tạo"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3661,7 +3697,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3670,7 +3706,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -4044,17 +4080,27 @@ msgstr "Không có mã nào được nhập"
 msgid "You are not subscribed to that profile."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "Không thể tạo đăng nhận."
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "Không có user nào."
+msgid "No such profile."
+msgstr "Không có tin nhắn nào."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Bạn chưa cập nhật thông tin riêng"
+
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "Theo bạn này"
@@ -4115,7 +4161,7 @@ msgstr "Có nhiều người gửi lời nhắn để bạn nghe theo."
 msgid "These are the people whose notices %s listens to."
 msgstr "Có nhiều người gửi lời nhắn để  %s nghe theo."
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4125,36 +4171,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s dang theo doi tin nhan cua ban tren %2$s."
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "Không có Jabber ID."
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "Dòng tin nhắn cho %s"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "Dòng tin nhắn cho %s"
@@ -4209,7 +4255,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "Không có tin nhắn nào."
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "Phương thức API dưới cấu trúc có sẵn."
 
@@ -4244,75 +4290,76 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "Hồ sơ "
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "Gửi thư mời đến những người chưa có tài khoản"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "Tất cả đăng nhận"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "Tự động theo những người nào đăng ký theo tôi"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "Thư mời đã gửi"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "Thư mời đã gửi"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4499,7 +4546,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "Cá nhân"
@@ -4540,6 +4587,11 @@ msgstr "Không thể cập nhật thành viên."
 msgid "Group leave failed."
 msgstr "Thông tin nhóm"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "Không thể cập nhật thành viên."
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4560,70 +4612,102 @@ msgstr "Không thể chèn thêm vào đăng nhận."
 msgid "Could not update message with new URI."
 msgstr "Không thể cập nhật thông tin user với địa chỉ email đã được xác nhận."
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, fuzzy, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%s (%s)"
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "User has blocked you."
+msgstr "Người dùng không có thông tin."
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "Chưa đăng nhận!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Không thể xóa đăng nhận."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Không thể xóa đăng nhận."
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%s chào mừng bạn "
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "Không thể tạo favorite."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "Không thể tạo đăng nhận."
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Không thể tạo đăng nhận."
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "Không thể tạo đăng nhận."
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "Thay đổi các thiết lập trong hồ sơ cá nhân của bạn"
@@ -4668,131 +4752,191 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "Trang chủ"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "Cá nhân"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "Thay đổi mật khẩu của bạn"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "Kết nối"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "Giới thiệu"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "Không thể chuyển đến máy chủ: %s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "Kết nối"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "Tôi theo"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "Thư mời"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
+msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 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:458
-msgid "Logout"
-msgstr "Thoát"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "Thư mời"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
 #, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "Thoát"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "Tạo tài khoản mới"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "Đăng ký"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "Hướng dẫn"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "Đăng nhập"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "Hướng dẫn"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "Tìm kiếm"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "Hướng dẫn"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, 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
 #, fuzzy
 msgid "Site notice"
 msgstr "Thông báo mới"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "Thông báo mới"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "Tôi theo"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "Hướng dẫn"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "Giới thiệu"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "Riêng tư"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "Nguồn"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "Liên hệ"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "Tin đã gửi"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4801,12 +4945,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:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** là dịch vụ gửi tin nhắn. "
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, fuzzy, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4817,105 +4961,168 @@ msgstr ""
 "quyền [GNU Affero General Public License](http://www.fsf.org/licensing/"
 "licenses/agpl-3.0.html)."
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "Tìm theo nội dung của tin nhắn"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "Sau"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "Trước"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "Bạn đã theo những người này:"
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "Biệt hiệu không được cho phép."
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "Không thể lưu thông tin Twitter của bạn!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "Xac nhan dia chi email"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "Thư mời"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "Xác nhận SMS"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "Cá nhân"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "Xác nhận SMS"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "Xác nhận SMS"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "Xác nhận SMS"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "Xác nhận SMS"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "Cá nhân"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -5011,12 +5218,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "Đã lưu mật khẩu."
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "Đã lưu mật khẩu."
@@ -5176,82 +5383,92 @@ msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "Không có user nào."
+
+#: lib/command.php:561
 #, fuzzy, php-format
 msgid "Subscribed to %s"
 msgstr "Theo nhóm này"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, fuzzy, php-format
 msgid "Unsubscribed from %s"
 msgstr "Hết theo"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 #, fuzzy
 msgid "Notification off."
 msgstr "Không có mã số xác nhận."
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 #, fuzzy
 msgid "Notification on."
 msgstr "Không có mã số xác nhận."
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Hết theo"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "Bạn đã theo những người này:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Không thể tạo favorite."
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "Không thể tạo favorite."
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "Bạn chưa cập nhật thông tin riêng"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "Bạn chưa cập nhật thông tin riêng"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5265,6 +5482,7 @@ msgid ""
 "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"
@@ -5292,20 +5510,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Không có mã số xác nhận."
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5509,25 +5727,25 @@ msgstr "Hệ thống xảy ra lỗi trong khi tải file."
 msgid "Not an image or corrupt file."
 msgstr "File hỏng hoặc không phải là file ảnh."
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "Không hỗ trợ kiểu file ảnh này."
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "Không có tin nhắn nào."
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 #, fuzzy
 msgid "Unknown file type"
 msgstr "Không hỗ trợ kiểu file ảnh này."
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5791,7 +6009,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " từ "
@@ -5885,6 +6103,12 @@ msgstr ""
 msgid "Available characters"
 msgstr "Nhiều hơn 6 ký tự"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "Gửi"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5919,52 +6143,52 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "Không"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "Không có nội dung!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "Tạo"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "Trả lời tin nhắn này"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr "Trả lời"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Tin đã gửi"
@@ -6001,10 +6225,6 @@ msgstr "Lỗi xảy ra khi thêm mới hồ sơ cá nhân"
 msgid "Duplicate notice"
 msgstr "Xóa tin nhắn"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "Không thể chèn thêm vào đăng nhận."
@@ -6021,6 +6241,10 @@ 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"
@@ -6119,7 +6343,7 @@ 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:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6142,6 +6366,10 @@ msgstr "Tìm kiếm"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "Tìm kiếm"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6197,38 +6425,16 @@ msgstr "Theo nhóm này"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-#, fuzzy
-msgid "User has blocked you."
-msgstr "Người dùng không có thông tin."
-
-#: lib/subs.php:63
-#, fuzzy
-msgid "Could not subscribe."
-msgstr "Chưa đăng nhận!"
-
-#: lib/subs.php:82
-#, fuzzy
-msgid "Could not subscribe other to you."
-msgstr "Không thể tạo favorite."
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "Chưa đăng nhận!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "Không thể xóa đăng nhận."
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "Thư mời"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Không thể xóa đăng nhận."
+#: lib/subgroupnav.php:106
+#, fuzzy, php-format
+msgid "Invite friends and colleagues to join you on %s"
+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/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6286,70 +6492,70 @@ msgstr "Hình đại diện"
 msgid "User actions"
 msgstr "Không tìm thấy action"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "Các thiết lập cho Hồ sơ cá nhân"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 #, fuzzy
 msgid "Send a direct message to this user"
 msgstr "Bạn đã theo những người này:"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 #, fuzzy
 msgid "Message"
 msgstr "Tin mới nhất"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "vài giây trước"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "1 phút trước"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d phút trước"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "1 giờ trước"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d giờ trước"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "1 ngày trước"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "%d ngày trước"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "1 tháng trước"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "%d tháng trước"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "1 năm trước"
 
index a7aeec7ca5c6be5d90671f69f530febaa7798d24..45fdfe6dc05c0883be670b8ed17f639366d3fe72 100644 (file)
@@ -10,82 +10,88 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:22+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:04:02+0000\n"
 "Language-Team: Simplified Chinese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "接受"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "头像设置"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "注册"
 
-#: actions/accessadminpanel.php:161
+#. 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
 #, fuzzy
+msgctxt "LABEL"
 msgid "Private"
 msgstr "隐私"
 
-#: actions/accessadminpanel.php:163
-msgid "Prohibit anonymous users (not logged in) from viewing site?"
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
+msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:167
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
 #, fuzzy
 msgid "Invite only"
 msgstr "邀请"
 
-#: actions/accessadminpanel.php:169
-msgid "Make registration invitation only."
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
+msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
 #, fuzzy
 msgid "Closed"
 msgstr "阻止"
 
-#: actions/accessadminpanel.php:175
-msgid "Disable new registrations."
-msgstr ""
-
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr "保存"
-
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "头像设置"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+#, fuzzy
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "保存"
+
+#. 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 "没有该页面"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -99,79 +105,88 @@ msgstr "没有该页面"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "没有这个用户。"
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s 及好友"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s 及好友"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "%s 好友的聚合(RSS 1.0)"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "%s 好友的聚合(RSS 2.0)"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "%s 好友的聚合(Atom)"
 
-#: actions/all.php:127
+#. 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 "这是 %s 和好友的时间线,但是没有任何人发布内容。"
 
-#: actions/all.php:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s 及好友"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 "来自%2$s 上 %1$s 和好友的更新!"
@@ -184,20 +199,20 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!"
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 方法未实现!"
@@ -231,8 +246,9 @@ msgstr "无法更新用户。"
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 "用户没有个人信息。"
 
@@ -257,7 +273,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300
 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220
 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273
 #, fuzzy
@@ -376,68 +392,68 @@ msgstr "无法获取收藏的通告。"
 msgid "Could not find target user."
 msgstr "找不到任何信息。"
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "昵称已被使用,换一个吧。"
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 "不是有效的昵称。"
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "主页的URL不正确。"
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "全名过长(不能超过 255 个字符)。"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "描述过长(不能超过140字符)。"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "位置过长(不能超过255个字符)。"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "主页'%s'不正确"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "昵称已被使用,换一个吧。"
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -449,16 +465,16 @@ msgstr ""
 msgid "Group not found!"
 msgstr "API 方法未实现!"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 #, fuzzy
 msgid "You are already a member of that group."
 msgstr "您已经是该组成员"
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "无法把 %s 用户添加到 %s 组"
@@ -468,7 +484,7 @@ msgstr "无法把 %s 用户添加到 %s 组"
 msgid "You are not a member of this group."
 msgstr "您未告知此个人信息"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "无法订阅用户:未找到。"
@@ -500,7 +516,7 @@ msgstr "大小不正确。"
 #: 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:309
+#: 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
@@ -509,7 +525,7 @@ msgstr "大小不正确。"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -544,7 +560,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -567,13 +583,13 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 msgid "Account"
 msgstr "帐号"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -654,18 +670,18 @@ msgstr "不支持这种图像格式。"
 msgid "%1$s / Favorites from %2$s"
 msgstr "%s 的收藏 / %s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 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:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr "%s 时间表"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,12 +697,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:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr "%s 公众时间表"
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr "来自所有人的 %s 消息!"
@@ -696,17 +712,17 @@ msgstr "来自所有人的 %s 消息!"
 msgid "Repeated to %s"
 msgstr "%s 的回复"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "%s 的回复"
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr "带 %s 标签的通告"
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "%2$s 上 %1$s 的更新!"
@@ -724,8 +740,7 @@ msgstr "没有这份文档。"
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "没有昵称。"
 
@@ -737,7 +752,7 @@ msgstr "没有大小。"
 msgid "Invalid size."
 msgstr "大小不正确。"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "头像"
@@ -754,31 +769,31 @@ msgid "User without matching profile"
 msgstr "找不到匹配的用户。"
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 msgid "Avatar settings"
 msgstr "头像设置"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr "原来的"
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr "预览"
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete"
 msgstr "删除"
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr "上传"
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr "剪裁"
 
@@ -786,7 +801,7 @@ msgstr "剪裁"
 msgid "Pick a square area of the image to be your avatar"
 msgstr "请选择一块方形区域作为你的头像"
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr "文件数据丢失"
 
@@ -821,23 +836,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr "否"
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "取消阻止次用户"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr "是"
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "阻止该用户"
@@ -846,41 +861,45 @@ msgstr "阻止该用户"
 msgid "Failed to save block information."
 msgstr "保存阻止信息失败。"
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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 "没有这个组。"
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "用户没有个人信息。"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s 及好友"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 #, fuzzy
 msgid "A list of the users blocked from joining this group."
 msgstr "该组成员列表。"
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "取消阻止用户失败。"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr "取消阻止"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "取消阻止次用户"
@@ -962,7 +981,7 @@ msgstr "您未告知此个人信息"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "会话标识有问题,请重试。"
@@ -989,12 +1008,13 @@ msgstr "无法删除通告。"
 msgid "Delete this application"
 msgstr "删除通告"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr "未登录。"
@@ -1023,7 +1043,7 @@ msgstr "确定要删除这条消息吗?"
 msgid "Do not delete this notice"
 msgstr "无法删除通告。"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 #, fuzzy
 msgid "Delete this notice"
 msgstr "删除通告"
@@ -1043,19 +1063,19 @@ msgstr "您不能删除其他用户的状态。"
 msgid "Delete user"
 msgstr "删除"
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "删除通告"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1166,6 +1186,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 "保存"
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1268,31 +1299,31 @@ msgstr "编辑 %s 组"
 msgid "You must be logged in to create a group."
 msgstr "您必须登录才能创建小组。"
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 "只有admin才能编辑这个组"
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr "使用这个表单来编辑组"
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "描述过长(不能超过140字符)。"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 msgid "Could not update group."
 msgstr "无法更新组"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "无法创建收藏。"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr "选项已保存。"
 
@@ -1646,7 +1677,7 @@ msgstr "用户没有个人信息。"
 msgid "User is not a member of group."
 msgstr "您未告知此个人信息"
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "阻止用户"
@@ -1683,94 +1714,94 @@ msgstr "没有ID"
 msgid "You must be logged in to edit a group."
 msgstr "您必须登录才能创建小组。"
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 #, fuzzy
 msgid "Group design"
 msgstr "组"
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "无法更新用户。"
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 #, fuzzy
 msgid "Design preferences saved."
 msgstr "同步选项已保存。"
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr "组logo"
 
-#: actions/grouplogo.php:150
+#: actions/grouplogo.php:153
 #, fuzzy, php-format
 msgid ""
 "You can upload a logo image for your group. The maximum file size is %s."
 msgstr "你可以给你的组上载一个logo图。"
 
-#: actions/grouplogo.php:178
+#: actions/grouplogo.php:181
 #, fuzzy
 msgid "User without matching profile."
 msgstr "找不到匹配的用户。"
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 #, fuzzy
 msgid "Pick a square area of the image to be the logo."
 msgstr "请选择一块方形区域作为你的头像"
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 msgid "Logo updated."
 msgstr "logo已更新。"
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "更新logo失败。"
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr "%s 组成员"
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, fuzzy, php-format
 msgid "%1$s group members, page %2$d"
 msgstr "%s 组成员, 第 %d 页"
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr "该组成员列表。"
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr "admin管理员"
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr "阻止"
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 #, fuzzy
 msgid "Make user an admin of the group"
 msgstr "只有admin才能编辑这个组"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 #, fuzzy
 msgid "Make Admin"
 msgstr "admin管理员"
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "%2$s 上 %1$s 的更新!"
@@ -2021,16 +2052,19 @@ msgstr "个人消息"
 msgid "Optionally add a personal message to the invitation."
 msgstr "在邀请中加几句话(可选)。"
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+#, fuzzy
+msgctxt "BUTTON"
 msgid "Send"
 msgstr "发送"
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr "%1$s 邀请您加入 %2$s"
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2086,7 +2120,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr "您必须登录才能加入组。"
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "没有昵称。"
+
+#: actions/joingroup.php:141
 #, fuzzy, php-format
 msgid "%1$s joined group %2$s"
 msgstr "%s 加入 %s 组"
@@ -2096,12 +2135,12 @@ msgstr "%s 加入 %s 组"
 msgid "You must be logged in to leave a group."
 msgstr "您必须登录才能邀请其他人使用 %s"
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 #, fuzzy
 msgid "You are not a member of that group."
 msgstr "您未告知此个人信息"
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%s 离开群 %s"
@@ -2119,8 +2158,7 @@ msgstr "用户名或密码不正确。"
 msgid "Error setting user. You are probably not authorized."
 msgstr "未认证。"
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "登录"
 
@@ -2372,8 +2410,8 @@ msgstr "连接"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr "不支持的数据格式。"
 
@@ -2522,7 +2560,7 @@ msgstr "无法保存新密码。"
 msgid "Password saved."
 msgstr "密码已保存。"
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2555,7 +2593,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 #, fuzzy
 msgid "Site"
 msgstr "邀请"
@@ -2738,7 +2775,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1 到 64 个小写字母或数字,不包含标点及空白"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "全名"
@@ -2767,7 +2804,7 @@ msgid "Bio"
 msgstr "自述"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2831,25 +2868,26 @@ msgstr "语言过长(不能超过50个字符)。"
 msgid "Invalid tag: \"%s\""
 msgstr "主页'%s'不正确"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr "无法更新用户的自动订阅选项。"
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "无法保存个人信息。"
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "无法保存个人信息。"
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "无法保存个人信息。"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr "设置已保存。"
 
@@ -2863,48 +2901,48 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr "无法获取收藏的通告。"
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, fuzzy, php-format
 msgid "Public timeline, page %d"
 msgstr "公开的时间表"
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr "公开的时间表"
 
-#: actions/public.php:159
+#: actions/public.php:160
 #, fuzzy
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr "公开的聚合"
 
-#: actions/public.php:163
+#: actions/public.php:164
 #, fuzzy
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr "公开的聚合"
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "公开的聚合"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2913,7 +2951,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, fuzzy, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -3086,8 +3124,7 @@ msgstr "验证码出错。"
 msgid "Registration successful"
 msgstr "注册成功。"
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr "注册"
 
@@ -3227,7 +3264,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "您在其他兼容的微博客服务的个人信息URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "订阅"
 
@@ -3270,7 +3307,7 @@ msgstr "您必须同意此授权方可注册。"
 msgid "You already repeated that notice."
 msgstr "您已成功阻止该用户:"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "创建"
@@ -3280,47 +3317,47 @@ msgstr "创建"
 msgid "Repeated!"
 msgstr "创建"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr "%s 的回复"
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "发送给 %1$s 的 %2$s 消息"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "%s 的通告聚合"
 
-#: actions/replies.php:198
+#: actions/replies.php:199
 #, fuzzy, 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 "这是 %s 和好友的时间线,但是没有任何人发布内容。"
 
-#: actions/replies.php:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3348,7 +3385,6 @@ msgid "User is already sandboxed."
 msgstr "用户没有个人信息。"
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3373,7 +3409,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "头像设置"
@@ -3409,7 +3445,7 @@ msgstr "分页"
 msgid "Description"
 msgstr "描述"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr "统计"
@@ -3471,35 +3507,35 @@ msgstr "%s 收藏的通告"
 msgid "Could not retrieve favorite notices."
 msgstr "无法获取收藏的通告。"
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "%s 好友的聚合"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "%s 好友的聚合"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "%s 好友的聚合"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3507,7 +3543,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3521,71 +3557,71 @@ msgstr "%s 组"
 msgid "%1$s group, page %2$d"
 msgstr "%s 组成员, 第 %d 页"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "组资料"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr "URL 互联网地址"
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 #, fuzzy
 msgid "Note"
 msgstr "通告"
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr "组动作"
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, fuzzy, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, fuzzy, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr "%s 的通告聚合"
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, php-format
 msgid "FOAF for %s group"
 msgstr "%s 的发件箱"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "注册于"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr "(没有)"
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr "所有成员"
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "创建"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3595,7 +3631,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, fuzzy, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3606,7 +3642,7 @@ msgstr ""
 "**%s** 是一个 %%%%site.name%%%% 的用户组,一个微博客服务 [micro-blogging]"
 "(http://en.wikipedia.org/wiki/Micro-blogging)"
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 #, fuzzy
 msgid "Admins"
 msgstr "admin管理员"
@@ -3973,17 +4009,27 @@ msgstr "没有输入验证码"
 msgid "You are not subscribed to that profile."
 msgstr "您未告知此个人信息"
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "无法删除订阅。"
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "没有这个用户。"
+msgid "No such profile."
+msgstr "没有这份通告。"
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "您未告知此个人信息"
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "订阅"
@@ -4044,7 +4090,7 @@ msgstr "这是您订阅的用户。"
 msgid "These are the people whose notices %s listens to."
 msgstr "这是 %s 订阅的用户。"
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -4054,36 +4100,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "%1$s 开始关注您的 %2$s 信息。"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "没有 Jabber ID。"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr "SMS短信"
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "用户自加标签 %s - 第 %d 页"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "%s 的通告聚合"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr "%s 的通告聚合"
@@ -4139,7 +4185,7 @@ msgstr "使用这个表格给你的关注者或你的订阅加注标签。"
 msgid "No such tag."
 msgstr "未找到此消息。"
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr "API 方法尚未实现。"
 
@@ -4174,75 +4220,77 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+#, fuzzy
+msgctxt "TITLE"
 msgid "User"
 msgstr "用户"
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr "个人信息"
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 #, fuzzy
 msgid "New users"
 msgstr "邀请新用户"
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "所有订阅"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 #, fuzzy
 msgid "Automatically subscribe new users to this user."
 msgstr "自动订阅任何订阅我的更新的人(这个选项最适合机器人)"
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "已发送邀请"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 #, fuzzy
 msgid "Invitations enabled"
 msgstr "已发送邀请"
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4426,7 +4474,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "个人"
@@ -4467,6 +4515,11 @@ msgstr "无法更新组"
 msgid "Group leave failed."
 msgstr "组资料"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "无法更新组"
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4485,70 +4538,103 @@ msgstr "无法添加信息。"
 msgid "Could not update message with new URI."
 msgstr "无法添加新URI的信息。"
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr "添加标签时数据库出错:%s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。"
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。"
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr "在这个网站你被禁止发布消息。"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "添加回复时数据库出错:%s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, fuzzy, php-format
 msgid "RT @%1$s %2$s"
 msgstr "%1$s (%2$s)"
 
-#: classes/User.php:385
+#: classes/Subscription.php:66 lib/oauthstore.php:465
+#, fuzzy
+msgid "You have been banned from subscribing."
+msgstr "那个用户阻止了你的订阅。"
+
+#: classes/Subscription.php:70
+msgid "Already subscribed!"
+msgstr ""
+
+#: classes/Subscription.php:74
+#, fuzzy
+msgid "User has blocked you."
+msgstr "用户没有个人信息。"
+
+#: classes/Subscription.php:157
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "未订阅!"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "无法删除订阅。"
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "无法删除订阅。"
+
+#: classes/User.php:373
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "发送给 %1$s 的 %2$s 消息"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:462
 msgid "Could not create group."
 msgstr "无法创建组。"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "无法删除订阅。"
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "无法删除订阅。"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "无法删除订阅。"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr "修改您的个人信息"
@@ -4591,129 +4677,194 @@ msgstr "无标题页"
 msgid "Primary site navigation"
 msgstr "主站导航"
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "主页"
-
-#: lib/action.php:439
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr "个人资料及朋友年表"
 
-#: lib/action.php:441
+#: lib/action.php:442
 #, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "个人"
+
+#. TRANS: Tooltip for main menu option "Account"
+#: lib/action.php:444
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change your email, avatar, password, profile"
 msgstr "修改资料"
 
-#: lib/action.php:444
-msgid "Connect"
-msgstr "连接"
+#: lib/action.php:447
+#, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "帐号"
 
-#: lib/action.php:444
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "无法重定向到服务器:%s"
 
-#: lib/action.php:448
+#: lib/action.php:453
 #, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "连接"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
 msgstr "主站导航"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
-msgstr "邀请"
+#: lib/action.php:460
+#, fuzzy
+msgctxt "MENU"
+msgid "Admin"
+msgstr "admin管理员"
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, fuzzy, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr "使用这个表单来邀请好友和同事加入。"
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "登出"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "邀请"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr "登出本站"
 
-#: lib/action.php:463
+#: lib/action.php:476
+#, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "登出"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "创建新帐号"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "注册"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr "登入本站"
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "帮助"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "登录"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "帮助"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr "搜索"
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "帮助"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr "检索人或文字"
 
-#: lib/action.php:493
+#: lib/action.php:502
+#, fuzzy
+msgctxt "MENU"
+msgid "Search"
+msgstr "搜索"
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "新通告"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr "本地显示"
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "新通告"
 
-#: lib/action.php:727
+#: lib/action.php:758
 #, fuzzy
 msgid "Secondary site navigation"
 msgstr "次项站导航"
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "帮助"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "关于"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "常见问题FAQ"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr "隐私"
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr "来源"
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "联系人"
 
-#: lib/action.php:751
+#: lib/action.php:782
 #, fuzzy
 msgid "Badge"
 msgstr "呼叫"
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr "StatusNet软件注册证"
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4722,12 +4873,12 @@ msgstr ""
 "**%%site.name%%** 是一个微博客服务,提供者为 [%%site.broughtby%%](%%site."
 "broughtbyurl%%)。"
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%** 是一个微博客服务。"
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4738,107 +4889,171 @@ msgstr ""
 "General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)"
 "授权。"
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "StatusNet软件注册证"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr "全部"
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr "注册证"
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr "分页"
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 #, fuzzy
 msgid "After"
 msgstr "« 之后"
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "之前 »"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 "无法向此用户发送消息。"
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 #, fuzzy
 msgid "Changes to that panel are not allowed."
 msgstr "不允许注册。"
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 #, fuzzy
 msgid "showForm() not implemented."
 msgstr "命令尚未实现。"
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 #, fuzzy
 msgid "saveSettings() not implemented."
 msgstr "命令尚未实现。"
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 #, fuzzy
 msgid "Unable to delete design setting."
 msgstr "无法保存 Twitter 设置!"
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "电子邮件地址确认"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "邀请"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "SMS短信确认"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "个人"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "SMS短信确认"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+#, fuzzy
+msgctxt "MENU"
+msgid "User"
+msgstr "用户"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "SMS短信确认"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "SMS短信确认"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "SMS短信确认"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "个人"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4934,12 +5149,12 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 #, fuzzy
 msgid "Password changing failed"
 msgstr "密码已保存。"
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 #, fuzzy
 msgid "Password changing is not allowed"
 msgstr "密码已保存。"
@@ -5093,80 +5308,89 @@ msgstr "保存通告时出错。"
 msgid "Specify the name of the user to subscribe to"
 msgstr "指定要订阅的用户名"
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+msgid "No such user"
+msgstr "没有这个用户。"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr "订阅 %s"
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr "指定要取消订阅的用户名"
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr "取消订阅 %s"
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr "命令尚未实现。"
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr "通告关闭。"
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr "无法关闭通告。"
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr "通告开启。"
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr "无法开启通告。"
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "取消订阅 %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "您未告知此个人信息"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "您已订阅这些用户:"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "无法订阅他人更新。"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "无法订阅他人更新。"
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "您未告知此个人信息"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "您未告知此个人信息"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5180,6 +5404,7 @@ msgid ""
 "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"
@@ -5207,20 +5432,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "没有验证码"
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 #, fuzzy
 msgid "Go to the installer."
 msgstr "登入本站"
@@ -5420,24 +5645,24 @@ msgstr "上传文件时出错。"
 msgid "Not an image or corrupt file."
 msgstr "不是图片文件或文件已损坏。"
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr "不支持这种图像格式。"
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "没有这份通告。"
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr "未知文件类型"
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5659,7 +5884,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 #, fuzzy
 msgid "from"
 msgstr " 从 "
@@ -5752,6 +5977,12 @@ msgstr "到"
 msgid "Available characters"
 msgstr "6 个或更多字符"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+#, fuzzy
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr "发送"
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5786,53 +6017,53 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 #, fuzzy
 msgid "N"
 msgstr "否"
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "没有内容!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "创建"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "无法删除通告。"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 #, fuzzy
 msgid "Reply"
 msgstr "回复"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "消息已发布。"
@@ -5867,11 +6098,6 @@ msgstr "添加远程的个人信息出错"
 msgid "Duplicate notice"
 msgstr "删除通告"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-#, fuzzy
-msgid "You have been banned from subscribing."
-msgstr "那个用户阻止了你的订阅。"
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "无法添加新的订阅。"
@@ -5888,6 +6114,10 @@ msgstr "回复"
 msgid "Favorites"
 msgstr "收藏夹"
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr "用户"
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr "收件箱"
@@ -5985,7 +6215,7 @@ msgstr "无法删除通告。"
 msgid "Repeat this notice"
 msgstr "无法删除通告。"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -6008,6 +6238,10 @@ msgstr "搜索"
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr "搜索"
+
 #: lib/searchaction.php:162
 #, fuzzy
 msgid "Search help"
@@ -6063,36 +6297,14 @@ msgstr "订阅 %s"
 msgid "Groups %s is a member of"
 msgstr "%s 组是成员组成了"
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-#, fuzzy
-msgid "User has blocked you."
-msgstr "用户没有个人信息。"
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
-msgstr "无法订阅。"
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-msgstr "无法订阅他人更新。"
-
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "未订阅!"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "无法删除订阅。"
+#: lib/subgroupnav.php:105
+msgid "Invite"
+msgstr "邀请"
 
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "无法删除订阅。"
+#: lib/subgroupnav.php:106
+#, fuzzy, php-format
+msgid "Invite friends and colleagues to join you on %s"
+msgstr "使用这个表单来邀请好友和同事加入。"
 
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
@@ -6151,70 +6363,70 @@ msgstr "头像"
 msgid "User actions"
 msgstr "未知动作"
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "个人设置"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 #, fuzzy
 msgid "Send a direct message to this user"
 msgstr "无法向此用户发送消息。"
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 #, fuzzy
 msgid "Message"
 msgstr "新消息"
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr "几秒前"
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr "一分钟前"
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d 分钟前"
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr "一小时前"
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d 小时前"
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr "一天前"
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr "%d 天前"
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr "一个月前"
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr "%d 个月前"
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr "一年前"
 
index 815f95eacddd782c9d829cbad3d51bc9ee04c3c6..5cca450ca933717742f06ea872bdce9586264b19 100644 (file)
@@ -7,81 +7,86 @@ msgid ""
 msgstr ""
 "Project-Id-Version: StatusNet\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-11 08:14+0000\n"
-"PO-Revision-Date: 2010-02-11 08:16:25+0000\n"
+"POT-Creation-Date: 2010-03-02 21:02+0000\n"
+"PO-Revision-Date: 2010-03-02 21:04:05+0000\n"
 "Language-Team: Traditional Chinese\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n"
+"X-Generator: MediaWiki 1.17alpha (r63186); 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"
 
-#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
+#. TRANS: Page title
+#: actions/accessadminpanel.php:55
 #, fuzzy
 msgid "Access"
 msgstr "接受"
 
-#: actions/accessadminpanel.php:65
+#. TRANS: Page notice
+#: actions/accessadminpanel.php:67
 #, fuzzy
 msgid "Site access settings"
 msgstr "線上即時通設定"
 
-#: actions/accessadminpanel.php:158
+#. TRANS: Form legend for registration form.
+#: actions/accessadminpanel.php:161
 #, fuzzy
 msgid "Registration"
 msgstr "所有訂閱"
 
-#: actions/accessadminpanel.php:161
-msgid "Private"
-msgstr ""
-
-#: actions/accessadminpanel.php:163
+#. 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
-msgid "Invite only"
+msgctxt "LABEL"
+msgid "Private"
 msgstr ""
 
-#: actions/accessadminpanel.php:169
+#. TRANS: Checkbox instructions for admin setting "Invite only"
+#: actions/accessadminpanel.php:174
 msgid "Make registration invitation only."
 msgstr ""
 
-#: actions/accessadminpanel.php:173
-#, fuzzy
-msgid "Closed"
-msgstr "無此使用者"
+#. TRANS: Checkbox label for configuring site as invite only.
+#: actions/accessadminpanel.php:176
+msgid "Invite only"
+msgstr ""
 
-#: actions/accessadminpanel.php:175
+#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations)
+#: actions/accessadminpanel.php:183
 msgid "Disable new registrations."
 msgstr ""
 
-#: actions/accessadminpanel.php:189 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:203 actions/tagother.php:154
-#: actions/useradminpanel.php:293 lib/applicationeditform.php:333
-#: lib/applicationeditform.php:334 lib/designsettings.php:256
-#: lib/groupeditform.php:202
-msgid "Save"
-msgstr ""
+#. TRANS: Checkbox label for disabling new user registrations.
+#: actions/accessadminpanel.php:185
+#, fuzzy
+msgid "Closed"
+msgstr "無此使用者"
 
-#: actions/accessadminpanel.php:189
+#. TRANS: Title / tooltip for button to save access settings in site admin panel
+#: actions/accessadminpanel.php:202
 #, fuzzy
 msgid "Save access settings"
 msgstr "線上即時通設定"
 
-#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
-#: actions/showfavorites.php:137 actions/tag.php:51
+#: actions/accessadminpanel.php:203
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+#. 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
 #, fuzzy
 msgid "No such page"
 msgstr "無此通知"
 
-#: actions/all.php:74 actions/allrss.php:68
+#: actions/all.php:75 actions/allrss.php:68
 #: actions/apiaccountupdatedeliverydevice.php:113
 #: actions/apiaccountupdateprofile.php:105
 #: actions/apiaccountupdateprofilebackgroundimage.php:116
@@ -95,79 +100,88 @@ msgstr "無此通知"
 #: 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/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:38 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
-#: lib/subs.php:34 lib/subs.php:125
+#: 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:38
+#: 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 "無此使用者"
 
-#: actions/all.php:84
+#. TRANS: Page title. %1$s is user nickname, %2$d is page number
+#: actions/all.php:86
 #, fuzzy, php-format
 msgid "%1$s and friends, page %2$d"
 msgstr "%s與好友"
 
-#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
+#. 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/apitimelinefriends.php:114 actions/apitimelinehome.php:115
 #: lib/personalgroupnav.php:100
 #, php-format
 msgid "%s and friends"
 msgstr "%s與好友"
 
-#: actions/all.php:99
+#. TRANS: %1$s is user nickname
+#: actions/all.php:103
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 1.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/all.php:107
+#. TRANS: %1$s is user nickname
+#: actions/all.php:112
 #, fuzzy, php-format
 msgid "Feed for friends of %s (RSS 2.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/all.php:115
+#. TRANS: %1$s is user nickname
+#: actions/all.php:121
 #, fuzzy, php-format
 msgid "Feed for friends of %s (Atom)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/all.php:127
+#. 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:132
+#: actions/all.php:139
 #, php-format
 msgid ""
 "Try subscribing to more people, [join a group](%%action.groups%%) or post "
 "something yourself."
 msgstr ""
 
-#: actions/all.php:134
+#. 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:137 actions/replies.php:209 actions/showstream.php:211
+#: 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 ""
 
-#: actions/all.php:165
+#. TRANS: H1 text
+#: actions/all.php:174
 #, fuzzy
 msgid "You and friends"
 msgstr "%s與好友"
 
-#: actions/allrss.php:119 actions/apitimelinefriends.php:121
-#: actions/apitimelinehome.php:122
+#: 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 ""
@@ -180,20 +194,20 @@ msgstr ""
 #: 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:136
+#: 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:137
+#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135
 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111
-#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155
-#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156
-#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131
+#: 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/apitimelineretweetedtome.php:121
-#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141
-#: actions/apitimelineuser.php:166 actions/apiusershow.php:101
+#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166
+#: actions/apitimelineuser.php:196 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "確認碼遺失"
@@ -227,8 +241,9 @@ msgstr "無法更新使用者"
 #: 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/replies.php:80
-#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84
+#: 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 ""
 
@@ -253,7 +268,7 @@ msgstr ""
 #: actions/apiaccountupdateprofilebackgroundimage.php:146
 #: actions/apiaccountupdateprofilecolors.php:164
 #: actions/apiaccountupdateprofilecolors.php:174
-#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297
+#: 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."
@@ -369,68 +384,68 @@ msgstr "無法更新使用者"
 msgid "Could not find target user."
 msgstr "無法更新使用者"
 
-#: actions/apigroupcreate.php:164 actions/editgroup.php:182
+#: 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:173 actions/editgroup.php:186
+#: 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 "此暱稱已有人使用。再試試看別的吧。"
 
-#: actions/apigroupcreate.php:180 actions/editgroup.php:189
+#: 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 ""
 
-#: actions/apigroupcreate.php:196 actions/editapplication.php:215
-#: actions/editgroup.php:195 actions/newapplication.php:203
+#: 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 "個人首頁位址錯誤"
 
-#: actions/apigroupcreate.php:205 actions/editgroup.php:198
+#: 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 "全名過長(最多255字元)"
 
-#: actions/apigroupcreate.php:213 actions/editapplication.php:190
+#: actions/apigroupcreate.php:215 actions/editapplication.php:190
 #: actions/newapplication.php:172
 #, fuzzy, php-format
 msgid "Description is too long (max %d chars)."
 msgstr "自我介紹過長(共140個字元)"
 
-#: actions/apigroupcreate.php:224 actions/editgroup.php:204
+#: 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 "地點過長(共255個字)"
 
-#: actions/apigroupcreate.php:243 actions/editgroup.php:215
+#: actions/apigroupcreate.php:245 actions/editgroup.php:219
 #: actions/newgroup.php:159
 #, php-format
 msgid "Too many aliases! Maximum %d."
 msgstr ""
 
-#: actions/apigroupcreate.php:264 actions/editgroup.php:224
+#: actions/apigroupcreate.php:266 actions/editgroup.php:228
 #: actions/newgroup.php:168
 #, fuzzy, php-format
 msgid "Invalid alias: \"%s\""
 msgstr "個人首頁連結%s無效"
 
-#: actions/apigroupcreate.php:273 actions/editgroup.php:228
+#: actions/apigroupcreate.php:275 actions/editgroup.php:232
 #: actions/newgroup.php:172
 #, fuzzy, php-format
 msgid "Alias \"%s\" already in use. Try another one."
 msgstr "此暱稱已有人使用。再試試看別的吧。"
 
-#: actions/apigroupcreate.php:286 actions/editgroup.php:234
+#: actions/apigroupcreate.php:288 actions/editgroup.php:238
 #: actions/newgroup.php:178
 msgid "Alias can't be the same as nickname."
 msgstr ""
@@ -442,15 +457,15 @@ msgstr ""
 msgid "Group not found!"
 msgstr "目前無請求"
 
-#: actions/apigroupjoin.php:110 actions/joingroup.php:90
+#: actions/apigroupjoin.php:110 actions/joingroup.php:100
 msgid "You are already a member of that group."
 msgstr ""
 
-#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221
+#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221
 msgid "You have been blocked from that group by the admin."
 msgstr ""
 
-#: actions/apigroupjoin.php:138 actions/joingroup.php:124
+#: actions/apigroupjoin.php:138 actions/joingroup.php:134
 #, fuzzy, php-format
 msgid "Could not join user %1$s to group %2$s."
 msgstr "無法連結到伺服器:%s"
@@ -460,7 +475,7 @@ msgstr "無法連結到伺服器:%s"
 msgid "You are not a member of this group."
 msgstr "無法連結到伺服器:%s"
 
-#: actions/apigroupleave.php:124 actions/leavegroup.php:119
+#: actions/apigroupleave.php:124 actions/leavegroup.php:129
 #, fuzzy, php-format
 msgid "Could not remove user %1$s from group %2$s."
 msgstr "無法從 %s 建立OpenID"
@@ -492,7 +507,7 @@ msgstr "尺寸錯誤"
 #: 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:309
+#: 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
@@ -501,7 +516,7 @@ msgstr "尺寸錯誤"
 #: 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:46 actions/tagother.php:166
+#: 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."
@@ -536,7 +551,7 @@ msgstr ""
 
 #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281
 #: actions/designadminpanel.php:103 actions/editapplication.php:139
-#: actions/emailsettings.php:256 actions/grouplogo.php:319
+#: 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
@@ -559,14 +574,14 @@ msgid ""
 "give access to your %4$s account to third parties you trust."
 msgstr ""
 
-#: actions/apioauthauthorize.php:310 lib/action.php:441
+#: actions/apioauthauthorize.php:310
 #, fuzzy
 msgid "Account"
 msgstr "關於"
 
 #: actions/apioauthauthorize.php:313 actions/login.php:230
 #: actions/profilesettings.php:106 actions/register.php:424
-#: actions/showgroup.php:236 actions/tagother.php:94
+#: actions/showgroup.php:244 actions/tagother.php:94
 #: actions/userauthorization.php:145 lib/groupeditform.php:152
 #: lib/userprofile.php:131
 msgid "Nickname"
@@ -645,18 +660,18 @@ msgstr ""
 msgid "%1$s / Favorites from %2$s"
 msgstr "%1$s的狀態是%2$s"
 
-#: actions/apitimelinefavorites.php:120
+#: actions/apitimelinefavorites.php:117
 #, fuzzy, php-format
 msgid "%1$s updates favorited by %2$s / %2$s."
 msgstr "&s的微型部落格"
 
 #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118
-#: actions/grouprss.php:131 actions/userrss.php:90
+#: actions/grouprss.php:138 actions/userrss.php:90
 #, php-format
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -672,12 +687,12 @@ msgstr "%1$s的狀態是%2$s"
 msgid "%1$s updates that reply to updates from %2$s / %3$s."
 msgstr ""
 
-#: actions/apitimelinepublic.php:107 actions/publicrss.php:103
+#: actions/apitimelinepublic.php:111 actions/publicrss.php:103
 #, php-format
 msgid "%s public timeline"
 msgstr ""
 
-#: actions/apitimelinepublic.php:111 actions/publicrss.php:105
+#: actions/apitimelinepublic.php:115 actions/publicrss.php:105
 #, php-format
 msgid "%s updates from everyone!"
 msgstr ""
@@ -687,17 +702,17 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:102 actions/tag.php:66
+#: actions/apitimelinetag.php:102 actions/tag.php:67
 #, php-format
 msgid "Notices tagged with %s"
 msgstr ""
 
-#: actions/apitimelinetag.php:108 actions/tagrss.php:64
+#: actions/apitimelinetag.php:104 actions/tagrss.php:64
 #, fuzzy, php-format
 msgid "Updates tagged with %1$s on %2$s!"
 msgstr "&s的微型部落格"
@@ -715,8 +730,7 @@ msgstr "無此文件"
 #: 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/joingroup.php:76 actions/leavegroup.php:76
-#: actions/showgroup.php:121
+#: actions/grouprss.php:91 actions/showgroup.php:121
 msgid "No nickname."
 msgstr "無暱稱"
 
@@ -728,7 +742,7 @@ msgstr "無尺寸"
 msgid "Invalid size."
 msgstr "尺寸錯誤"
 
-#: actions/avatarsettings.php:67 actions/showgroup.php:221
+#: actions/avatarsettings.php:67 actions/showgroup.php:229
 #: lib/accountsettingsaction.php:112
 msgid "Avatar"
 msgstr "個人圖像"
@@ -745,31 +759,31 @@ msgid "User without matching profile"
 msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
-#: actions/grouplogo.php:251
+#: actions/grouplogo.php:254
 #, fuzzy
 msgid "Avatar settings"
 msgstr "線上即時通設定"
 
 #: actions/avatarsettings.php:127 actions/avatarsettings.php:205
-#: actions/grouplogo.php:199 actions/grouplogo.php:259
+#: actions/grouplogo.php:202 actions/grouplogo.php:262
 msgid "Original"
 msgstr ""
 
 #: actions/avatarsettings.php:142 actions/avatarsettings.php:217
-#: actions/grouplogo.php:210 actions/grouplogo.php:271
+#: actions/grouplogo.php:213 actions/grouplogo.php:274
 msgid "Preview"
 msgstr ""
 
 #: actions/avatarsettings.php:149 actions/showapplication.php:252
-#: lib/deleteuserform.php:66 lib/noticelist.php:624
+#: lib/deleteuserform.php:66 lib/noticelist.php:655
 msgid "Delete"
 msgstr ""
 
-#: actions/avatarsettings.php:166 actions/grouplogo.php:233
+#: actions/avatarsettings.php:166 actions/grouplogo.php:236
 msgid "Upload"
 msgstr ""
 
-#: actions/avatarsettings.php:231 actions/grouplogo.php:286
+#: actions/avatarsettings.php:231 actions/grouplogo.php:289
 msgid "Crop"
 msgstr ""
 
@@ -777,7 +791,7 @@ msgstr ""
 msgid "Pick a square area of the image to be your avatar"
 msgstr ""
 
-#: actions/avatarsettings.php:343 actions/grouplogo.php:377
+#: actions/avatarsettings.php:343 actions/grouplogo.php:380
 msgid "Lost our file data."
 msgstr ""
 
@@ -812,23 +826,23 @@ msgid ""
 msgstr ""
 
 #: actions/block.php:143 actions/deleteapplication.php:153
-#: actions/deletenotice.php:145 actions/deleteuser.php:147
+#: actions/deletenotice.php:145 actions/deleteuser.php:150
 #: actions/groupblock.php:178
 msgid "No"
 msgstr ""
 
-#: actions/block.php:143 actions/deleteuser.php:147
+#: actions/block.php:143 actions/deleteuser.php:150
 #, fuzzy
 msgid "Do not block this user"
 msgstr "無此使用者"
 
 #: actions/block.php:144 actions/deleteapplication.php:158
-#: actions/deletenotice.php:146 actions/deleteuser.php:148
+#: actions/deletenotice.php:146 actions/deleteuser.php:151
 #: actions/groupblock.php:179 lib/repeatform.php:132
 msgid "Yes"
 msgstr ""
 
-#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80
+#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80
 #, fuzzy
 msgid "Block this user"
 msgstr "無此使用者"
@@ -837,41 +851,45 @@ msgstr "無此使用者"
 msgid "Failed to save block information."
 msgstr ""
 
-#: actions/blockedfromgroup.php:80 actions/editgroup.php:96
-#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86
-#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97
-#: actions/grouplogo.php:99 actions/groupmembers.php:83
-#: actions/grouprss.php:98 actions/groupunblock.php:86
-#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86
-#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260
+#: 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
 #, fuzzy
 msgid "No such group."
 msgstr "無此通知"
 
-#: actions/blockedfromgroup.php:90
+#: actions/blockedfromgroup.php:97
 #, fuzzy, php-format
 msgid "%s blocked profiles"
 msgstr "無此通知"
 
-#: actions/blockedfromgroup.php:93
+#: actions/blockedfromgroup.php:100
 #, fuzzy, php-format
 msgid "%1$s blocked profiles, page %2$d"
 msgstr "%s與好友"
 
-#: actions/blockedfromgroup.php:108
+#: actions/blockedfromgroup.php:115
 msgid "A list of the users blocked from joining this group."
 msgstr ""
 
-#: actions/blockedfromgroup.php:281
+#: actions/blockedfromgroup.php:288
 #, fuzzy
 msgid "Unblock user from group"
 msgstr "無此使用者"
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:69
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:69
 msgid "Unblock"
 msgstr ""
 
-#: actions/blockedfromgroup.php:313 lib/unblockform.php:80
+#: actions/blockedfromgroup.php:320 lib/unblockform.php:80
 #, fuzzy
 msgid "Unblock this user"
 msgstr "無此使用者"
@@ -952,7 +970,7 @@ msgstr "無法連結到伺服器:%s"
 
 #: actions/deleteapplication.php:102 actions/editapplication.php:127
 #: actions/newapplication.php:110 actions/showapplication.php:118
-#: lib/action.php:1195
+#: lib/action.php:1228
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -978,12 +996,13 @@ msgstr "無此通知"
 msgid "Delete this application"
 msgstr "請在140個字以內描述你自己與你的興趣"
 
+#. 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:30
+#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96
 #: actions/tagother.php:33 actions/unsubscribe.php:52
-#: lib/adminpanelaction.php:72 lib/profileformaction.php:63
+#: lib/adminpanelaction.php:73 lib/profileformaction.php:63
 #: lib/settingsaction.php:72
 msgid "Not logged in."
 msgstr ""
@@ -1011,7 +1030,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "無此通知"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:655
 msgid "Delete this notice"
 msgstr ""
 
@@ -1029,19 +1048,19 @@ msgstr "無此使用者"
 msgid "Delete user"
 msgstr ""
 
-#: actions/deleteuser.php:135
+#: 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:148 lib/deleteuserform.php:77
+#: actions/deleteuser.php:151 lib/deleteuserform.php:77
 #, fuzzy
 msgid "Delete this user"
 msgstr "無此使用者"
 
 #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124
-#: lib/adminpanelaction.php:316 lib/groupnav.php:119
+#: lib/groupnav.php:119
 msgid "Design"
 msgstr ""
 
@@ -1150,6 +1169,17 @@ msgstr ""
 msgid "Reset back to default"
 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/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 ""
+
 #: actions/designadminpanel.php:587 lib/designsettings.php:257
 msgid "Save design"
 msgstr ""
@@ -1249,31 +1279,31 @@ msgstr ""
 msgid "You must be logged in to create a group."
 msgstr ""
 
-#: actions/editgroup.php:103 actions/editgroup.php:168
-#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106
+#: 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 ""
 
-#: actions/editgroup.php:154
+#: actions/editgroup.php:158
 msgid "Use this form to edit the group."
 msgstr ""
 
-#: actions/editgroup.php:201 actions/newgroup.php:145
+#: actions/editgroup.php:205 actions/newgroup.php:145
 #, fuzzy, php-format
 msgid "description is too long (max %d chars)."
 msgstr "自我介紹過長(共140個字元)"
 
-#: actions/editgroup.php:253
+#: actions/editgroup.php:258
 #, fuzzy
 msgid "Could not update group."
 msgstr "無法更新使用者"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:264 classes/User_group.php:478
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "無法存取個人圖像資料"
 
-#: actions/editgroup.php:269
+#: actions/editgroup.php:280
 msgid "Options saved."
 msgstr ""
 
@@ -1612,7 +1642,7 @@ msgstr ""
 msgid "User is not a member of group."
 msgstr ""
 
-#: actions/groupblock.php:136 actions/groupmembers.php:316
+#: actions/groupblock.php:136 actions/groupmembers.php:323
 #, fuzzy
 msgid "Block user from group"
 msgstr "無此使用者"
@@ -1648,89 +1678,89 @@ msgstr "查無此Jabber ID"
 msgid "You must be logged in to edit a group."
 msgstr ""
 
-#: actions/groupdesignsettings.php:141
+#: actions/groupdesignsettings.php:144
 msgid "Group design"
 msgstr ""
 
-#: actions/groupdesignsettings.php:152
+#: 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:263 actions/userdesignsettings.php:186
+#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186
 #: lib/designsettings.php:391 lib/designsettings.php:413
 #, fuzzy
 msgid "Couldn't update your design."
 msgstr "無法更新使用者"
 
-#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231
+#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231
 msgid "Design preferences saved."
 msgstr ""
 
-#: actions/grouplogo.php:139 actions/grouplogo.php:192
+#: actions/grouplogo.php:142 actions/grouplogo.php:195
 msgid "Group logo"
 msgstr ""
 
-#: actions/grouplogo.php:150
+#: 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:178
+#: actions/grouplogo.php:181
 msgid "User without matching profile."
 msgstr ""
 
-#: actions/grouplogo.php:362
+#: actions/grouplogo.php:365
 msgid "Pick a square area of the image to be the logo."
 msgstr ""
 
-#: actions/grouplogo.php:396
+#: actions/grouplogo.php:399
 #, fuzzy
 msgid "Logo updated."
 msgstr "更新個人圖像"
 
-#: actions/grouplogo.php:398
+#: actions/grouplogo.php:401
 #, fuzzy
 msgid "Failed updating logo."
 msgstr "無法上傳個人圖像"
 
-#: actions/groupmembers.php:93 lib/groupnav.php:92
+#: actions/groupmembers.php:100 lib/groupnav.php:92
 #, php-format
 msgid "%s group members"
 msgstr ""
 
-#: actions/groupmembers.php:96
+#: actions/groupmembers.php:103
 #, php-format
 msgid "%1$s group members, page %2$d"
 msgstr ""
 
-#: actions/groupmembers.php:111
+#: actions/groupmembers.php:118
 msgid "A list of the users in this group."
 msgstr ""
 
-#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107
+#: actions/groupmembers.php:182 lib/groupnav.php:107
 msgid "Admin"
 msgstr ""
 
-#: actions/groupmembers.php:348 lib/blockform.php:69
+#: actions/groupmembers.php:355 lib/blockform.php:69
 msgid "Block"
 msgstr ""
 
-#: actions/groupmembers.php:443
+#: actions/groupmembers.php:450
 msgid "Make user an admin of the group"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make Admin"
 msgstr ""
 
-#: actions/groupmembers.php:475
+#: actions/groupmembers.php:482
 msgid "Make this user an admin"
 msgstr ""
 
-#: actions/grouprss.php:133
+#: actions/grouprss.php:140
 #, fuzzy, php-format
 msgid "Updates from members of %1$s on %2$s!"
 msgstr "&s的微型部落格"
@@ -1974,16 +2004,18 @@ msgstr ""
 msgid "Optionally add a personal message to the invitation."
 msgstr ""
 
-#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236
+#. TRANS: Send button for inviting friends
+#: actions/invite.php:198
+msgctxt "BUTTON"
 msgid "Send"
 msgstr ""
 
-#: actions/invite.php:226
+#: actions/invite.php:227
 #, php-format
 msgid "%1$s has invited you to join them on %2$s"
 msgstr ""
 
-#: actions/invite.php:228
+#: actions/invite.php:229
 #, php-format
 msgid ""
 "%1$s has invited you to join them on %2$s (%3$s).\n"
@@ -2018,7 +2050,12 @@ msgstr ""
 msgid "You must be logged in to join a group."
 msgstr ""
 
-#: actions/joingroup.php:131
+#: actions/joingroup.php:88 actions/leavegroup.php:88
+#, fuzzy
+msgid "No nickname or ID."
+msgstr "無暱稱"
+
+#: actions/joingroup.php:141
 #, php-format
 msgid "%1$s joined group %2$s"
 msgstr ""
@@ -2027,11 +2064,11 @@ msgstr ""
 msgid "You must be logged in to leave a group."
 msgstr ""
 
-#: actions/leavegroup.php:90 lib/command.php:265
+#: actions/leavegroup.php:100 lib/command.php:265
 msgid "You are not a member of that group."
 msgstr ""
 
-#: actions/leavegroup.php:127
+#: actions/leavegroup.php:137
 #, fuzzy, php-format
 msgid "%1$s left group %2$s"
 msgstr "%1$s的狀態是%2$s"
@@ -2048,8 +2085,7 @@ msgstr "使用者名稱或密碼錯誤"
 msgid "Error setting user. You are probably not authorized."
 msgstr ""
 
-#: actions/login.php:188 actions/login.php:241 lib/action.php:466
-#: lib/logingroupnav.php:79
+#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79
 msgid "Login"
 msgstr "登入"
 
@@ -2292,8 +2328,8 @@ msgstr "連結"
 msgid "Only "
 msgstr ""
 
-#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040
+#: lib/apiaction.php:1068 lib/apiaction.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2439,7 +2475,7 @@ msgstr "無法存取新密碼"
 msgid "Password saved."
 msgstr ""
 
-#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331
+#: actions/pathsadminpanel.php:59
 msgid "Paths"
 msgstr ""
 
@@ -2472,7 +2508,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters."
 msgstr ""
 
 #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58
-#: lib/adminpanelaction.php:311
 msgid "Site"
 msgstr ""
 
@@ -2647,7 +2682,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr "1-64個小寫英文字母或數字,勿加標點符號或空格"
 
 #: actions/profilesettings.php:111 actions/register.php:448
-#: actions/showgroup.php:247 actions/tagother.php:104
+#: actions/showgroup.php:255 actions/tagother.php:104
 #: lib/groupeditform.php:157 lib/userprofile.php:149
 msgid "Full name"
 msgstr "全名"
@@ -2676,7 +2711,7 @@ msgid "Bio"
 msgstr "自我介紹"
 
 #: actions/profilesettings.php:132 actions/register.php:471
-#: actions/showgroup.php:256 actions/tagother.php:112
+#: actions/showgroup.php:264 actions/tagother.php:112
 #: actions/userauthorization.php:166 lib/groupeditform.php:177
 #: lib/userprofile.php:164
 msgid "Location"
@@ -2740,25 +2775,26 @@ msgstr ""
 msgid "Invalid tag: \"%s\""
 msgstr "個人首頁連結%s無效"
 
-#: actions/profilesettings.php:302
+#: actions/profilesettings.php:306
 msgid "Couldn't update user for autosubscribe."
 msgstr ""
 
-#: actions/profilesettings.php:359
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "無法儲存個人資料"
 
-#: actions/profilesettings.php:371
+#: actions/profilesettings.php:375
 msgid "Couldn't save profile."
 msgstr "無法儲存個人資料"
 
-#: actions/profilesettings.php:379
+#: actions/profilesettings.php:383
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "無法儲存個人資料"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#. TRANS: Message after successful saving of administrative settings.
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:141
 msgid "Settings saved."
 msgstr ""
 
@@ -2771,46 +2807,46 @@ msgstr ""
 msgid "Could not retrieve public stream."
 msgstr ""
 
-#: actions/public.php:129
+#: actions/public.php:130
 #, php-format
 msgid "Public timeline, page %d"
 msgstr ""
 
-#: actions/public.php:131 lib/publicgroupnav.php:79
+#: actions/public.php:132 lib/publicgroupnav.php:79
 msgid "Public timeline"
 msgstr ""
 
-#: actions/public.php:159
+#: actions/public.php:160
 msgid "Public Stream Feed (RSS 1.0)"
 msgstr ""
 
-#: actions/public.php:163
+#: actions/public.php:164
 msgid "Public Stream Feed (RSS 2.0)"
 msgstr ""
 
-#: actions/public.php:167
+#: actions/public.php:168
 #, fuzzy
 msgid "Public Stream Feed (Atom)"
 msgstr "%s的公開內容"
 
-#: actions/public.php:187
+#: 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:190
+#: actions/public.php:191
 msgid "Be the first to post!"
 msgstr ""
 
-#: actions/public.php:194
+#: actions/public.php:195
 #, php-format
 msgid ""
 "Why not [register an account](%%action.register%%) and be the first to post!"
 msgstr ""
 
-#: actions/public.php:241
+#: actions/public.php:242
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2819,7 +2855,7 @@ msgid ""
 "friends, family, and colleagues! ([Read more](%%doc.help%%))"
 msgstr ""
 
-#: actions/public.php:246
+#: actions/public.php:247
 #, php-format
 msgid ""
 "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
@@ -2989,8 +3025,7 @@ msgstr "確認碼發生錯誤"
 msgid "Registration successful"
 msgstr ""
 
-#: actions/register.php:114 actions/register.php:503 lib/action.php:463
-#: lib/logingroupnav.php:85
+#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85
 msgid "Register"
 msgstr ""
 
@@ -3114,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:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr ""
 
@@ -3153,7 +3188,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr "無此使用者"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:674
 #, fuzzy
 msgid "Repeated"
 msgstr "新增"
@@ -3163,47 +3198,47 @@ msgstr "新增"
 msgid "Repeated!"
 msgstr "新增"
 
-#: actions/replies.php:125 actions/repliesrss.php:68
+#: actions/replies.php:126 actions/repliesrss.php:68
 #: lib/personalgroupnav.php:105
 #, php-format
 msgid "Replies to %s"
 msgstr ""
 
-#: actions/replies.php:127
+#: actions/replies.php:128
 #, fuzzy, php-format
 msgid "Replies to %1$s, page %2$d"
 msgstr "&s的微型部落格"
 
-#: actions/replies.php:144
+#: actions/replies.php:145
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 1.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/replies.php:151
+#: actions/replies.php:152
 #, fuzzy, php-format
 msgid "Replies feed for %s (RSS 2.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/replies.php:158
+#: actions/replies.php:159
 #, fuzzy, php-format
 msgid "Replies feed for %s (Atom)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/replies.php:198
+#: 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:203
+#: 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:205
+#: actions/replies.php:206
 #, php-format
 msgid ""
 "You can try to [nudge %1$s](../%2$s) or [post something to his or her "
@@ -3230,7 +3265,6 @@ msgid "User is already sandboxed."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelaction.php:336
 msgid "Sessions"
 msgstr ""
 
@@ -3255,7 +3289,7 @@ msgid "Turn on debugging output for sessions."
 msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
-#: actions/useradminpanel.php:293
+#: actions/useradminpanel.php:294
 #, fuzzy
 msgid "Save site settings"
 msgstr "線上即時通設定"
@@ -3289,7 +3323,7 @@ msgstr "地點"
 msgid "Description"
 msgstr "所有訂閱"
 
-#: actions/showapplication.php:192 actions/showgroup.php:429
+#: actions/showapplication.php:192 actions/showgroup.php:437
 #: lib/profileaction.php:174
 msgid "Statistics"
 msgstr ""
@@ -3350,35 +3384,35 @@ msgstr "%s與好友"
 msgid "Could not retrieve favorite notices."
 msgstr ""
 
-#: actions/showfavorites.php:170
+#: actions/showfavorites.php:171
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 1.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/showfavorites.php:177
+#: actions/showfavorites.php:178
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (RSS 2.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/showfavorites.php:184
+#: actions/showfavorites.php:185
 #, fuzzy, php-format
 msgid "Feed for favorites of %s (Atom)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/showfavorites.php:205
+#: 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:207
+#: 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:211
+#: actions/showfavorites.php:212
 #, php-format
 msgid ""
 "%s hasn't added any notices to his favorites yet. Why not [register an "
@@ -3386,7 +3420,7 @@ msgid ""
 "would add to their favorites :)"
 msgstr ""
 
-#: actions/showfavorites.php:242
+#: actions/showfavorites.php:243
 msgid "This is a way to share what you like."
 msgstr ""
 
@@ -3400,70 +3434,70 @@ msgstr ""
 msgid "%1$s group, page %2$d"
 msgstr "所有訂閱"
 
-#: actions/showgroup.php:218
+#: actions/showgroup.php:226
 #, fuzzy
 msgid "Group profile"
 msgstr "無此通知"
 
-#: actions/showgroup.php:263 actions/tagother.php:118
+#: actions/showgroup.php:271 actions/tagother.php:118
 #: actions/userauthorization.php:175 lib/userprofile.php:177
 msgid "URL"
 msgstr ""
 
-#: actions/showgroup.php:274 actions/tagother.php:128
+#: actions/showgroup.php:282 actions/tagother.php:128
 #: actions/userauthorization.php:187 lib/userprofile.php:194
 msgid "Note"
 msgstr ""
 
-#: actions/showgroup.php:284 lib/groupeditform.php:184
+#: actions/showgroup.php:292 lib/groupeditform.php:184
 msgid "Aliases"
 msgstr ""
 
-#: actions/showgroup.php:293
+#: actions/showgroup.php:301
 msgid "Group actions"
 msgstr ""
 
-#: actions/showgroup.php:328
+#: actions/showgroup.php:336
 #, php-format
 msgid "Notice feed for %s group (RSS 1.0)"
 msgstr ""
 
-#: actions/showgroup.php:334
+#: actions/showgroup.php:342
 #, php-format
 msgid "Notice feed for %s group (RSS 2.0)"
 msgstr ""
 
-#: actions/showgroup.php:340
+#: actions/showgroup.php:348
 #, php-format
 msgid "Notice feed for %s group (Atom)"
 msgstr ""
 
-#: actions/showgroup.php:345
+#: actions/showgroup.php:353
 #, fuzzy, php-format
 msgid "FOAF for %s group"
 msgstr "無此通知"
 
-#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91
+#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91
 #, fuzzy
 msgid "Members"
 msgstr "何時加入會員的呢?"
 
-#: actions/showgroup.php:386 lib/profileaction.php:117
+#: actions/showgroup.php:394 lib/profileaction.php:117
 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95
 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71
 msgid "(None)"
 msgstr ""
 
-#: actions/showgroup.php:392
+#: actions/showgroup.php:400
 msgid "All members"
 msgstr ""
 
-#: actions/showgroup.php:432
+#: actions/showgroup.php:440
 #, fuzzy
 msgid "Created"
 msgstr "新增"
 
-#: actions/showgroup.php:448
+#: actions/showgroup.php:456
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3473,7 +3507,7 @@ msgid ""
 "of this group and many more! ([Read more](%%%%doc.help%%%%))"
 msgstr ""
 
-#: actions/showgroup.php:454
+#: actions/showgroup.php:462
 #, php-format
 msgid ""
 "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
@@ -3482,7 +3516,7 @@ msgid ""
 "their life and interests. "
 msgstr ""
 
-#: actions/showgroup.php:482
+#: actions/showgroup.php:490
 msgid "Admins"
 msgstr ""
 
@@ -3836,17 +3870,26 @@ msgstr ""
 msgid "You are not subscribed to that profile."
 msgstr ""
 
-#: actions/subedit.php:83
+#: actions/subedit.php:83 classes/Subscription.php:89
+#: classes/Subscription.php:116
 #, fuzzy
 msgid "Could not save subscription."
 msgstr "註冊失敗"
 
-#: actions/subscribe.php:55
+#: actions/subscribe.php:77
+msgid "This action only accepts POST requests."
+msgstr ""
+
+#: actions/subscribe.php:107
 #, fuzzy
-msgid "Not a local user."
-msgstr "無此使用者"
+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:69
+#: actions/subscribe.php:145
 #, fuzzy
 msgid "Subscribed"
 msgstr "此帳號已註冊"
@@ -3907,7 +3950,7 @@ msgstr ""
 msgid "These are the people whose notices %s listens to."
 msgstr ""
 
-#: actions/subscriptions.php:121
+#: actions/subscriptions.php:126
 #, php-format
 msgid ""
 "You're not listening to anyone's notices right now, try subscribing to "
@@ -3917,36 +3960,36 @@ msgid ""
 "automatically subscribe to people you already follow there."
 msgstr ""
 
-#: actions/subscriptions.php:123 actions/subscriptions.php:127
+#: actions/subscriptions.php:128 actions/subscriptions.php:132
 #, fuzzy, php-format
 msgid "%s is not listening to anyone."
 msgstr "現在%1$s在%2$s成為你的粉絲囉"
 
-#: actions/subscriptions.php:194
+#: actions/subscriptions.php:199
 #, fuzzy
 msgid "Jabber"
 msgstr "查無此Jabber ID"
 
-#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115
+#: actions/subscriptions.php:204 lib/connectsettingsaction.php:115
 msgid "SMS"
 msgstr ""
 
-#: actions/tag.php:68
+#: actions/tag.php:69
 #, fuzzy, php-format
 msgid "Notices tagged with %1$s, page %2$d"
 msgstr "&s的微型部落格"
 
-#: actions/tag.php:86
+#: actions/tag.php:87
 #, php-format
 msgid "Notice feed for tag %s (RSS 1.0)"
 msgstr ""
 
-#: actions/tag.php:92
+#: actions/tag.php:93
 #, fuzzy, php-format
 msgid "Notice feed for tag %s (RSS 2.0)"
 msgstr "發送給%s好友的訂閱"
 
-#: actions/tag.php:98
+#: actions/tag.php:99
 #, php-format
 msgid "Notice feed for tag %s (Atom)"
 msgstr ""
@@ -4000,7 +4043,7 @@ msgstr ""
 msgid "No such tag."
 msgstr "無此通知"
 
-#: actions/twitapitrends.php:87
+#: actions/twitapitrends.php:85
 msgid "API method under construction."
 msgstr ""
 
@@ -4033,72 +4076,73 @@ msgid ""
 "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
 msgstr ""
 
-#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321
-#: lib/personalgroupnav.php:115
+#. TRANS: User admin panel title
+#: actions/useradminpanel.php:59
+msgctxt "TITLE"
 msgid "User"
 msgstr ""
 
-#: actions/useradminpanel.php:69
+#: actions/useradminpanel.php:70
 msgid "User settings for this StatusNet site."
 msgstr ""
 
-#: actions/useradminpanel.php:148
+#: actions/useradminpanel.php:149
 msgid "Invalid bio limit. Must be numeric."
 msgstr ""
 
-#: actions/useradminpanel.php:154
+#: actions/useradminpanel.php:155
 msgid "Invalid welcome text. Max length is 255 characters."
 msgstr ""
 
-#: actions/useradminpanel.php:164
+#: actions/useradminpanel.php:165
 #, php-format
 msgid "Invalid default subscripton: '%1$s' is not user."
 msgstr ""
 
-#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108
+#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108
 #: lib/personalgroupnav.php:109
 msgid "Profile"
 msgstr ""
 
-#: actions/useradminpanel.php:221
+#: actions/useradminpanel.php:222
 msgid "Bio Limit"
 msgstr ""
 
-#: actions/useradminpanel.php:222
+#: actions/useradminpanel.php:223
 msgid "Maximum length of a profile bio in characters."
 msgstr ""
 
-#: actions/useradminpanel.php:230
+#: actions/useradminpanel.php:231
 msgid "New users"
 msgstr ""
 
-#: actions/useradminpanel.php:234
+#: actions/useradminpanel.php:235
 msgid "New user welcome"
 msgstr ""
 
-#: actions/useradminpanel.php:235
+#: actions/useradminpanel.php:236
 msgid "Welcome text for new users (Max 255 chars)."
 msgstr ""
 
-#: actions/useradminpanel.php:240
+#: actions/useradminpanel.php:241
 #, fuzzy
 msgid "Default subscription"
 msgstr "所有訂閱"
 
-#: actions/useradminpanel.php:241
+#: actions/useradminpanel.php:242
 msgid "Automatically subscribe new users to this user."
 msgstr ""
 
-#: actions/useradminpanel.php:250
+#: actions/useradminpanel.php:251
 #, fuzzy
 msgid "Invitations"
 msgstr "地點"
 
-#: actions/useradminpanel.php:255
+#: actions/useradminpanel.php:256
 msgid "Invitations enabled"
 msgstr ""
 
-#: actions/useradminpanel.php:257
+#: actions/useradminpanel.php:258
 msgid "Whether to allow users to invite new users."
 msgstr ""
 
@@ -4272,7 +4316,7 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
-#: actions/version.php:196 lib/action.php:747
+#: actions/version.php:196 lib/action.php:778
 #, fuzzy
 msgid "Version"
 msgstr "地點"
@@ -4313,6 +4357,11 @@ msgstr "無法更新使用者"
 msgid "Group leave failed."
 msgstr "無此通知"
 
+#: classes/Local_group.php:41
+#, fuzzy
+msgid "Could not update local group."
+msgstr "無法更新使用者"
+
 #: classes/Login_token.php:76
 #, fuzzy, php-format
 msgid "Could not create login token for %s"
@@ -4330,70 +4379,101 @@ msgstr ""
 msgid "Could not update message with new URI."
 msgstr ""
 
-#: classes/Notice.php:157
+#: classes/Notice.php:172
 #, php-format
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:239
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:243
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:248
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:254
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
 msgstr ""
 
-#: classes/Notice.php:235
+#: classes/Notice.php:260
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:326 classes/Notice.php:352
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:911
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "增加回覆時,資料庫發生錯誤: %s"
-
-#: classes/Notice.php:1235
+#: classes/Notice.php:1442
 #, php-format
 msgid "RT @%1$s %2$s"
 msgstr ""
 
-#: classes/User.php:385
+#: 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
+#, fuzzy
+msgid "Not subscribed!"
+msgstr "此帳號已註冊"
+
+#: classes/Subscription.php:163
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "無法刪除帳號"
+
+#: classes/Subscription.php:179 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:380
+#: classes/User_group.php:462
 #, fuzzy
 msgid "Could not create group."
 msgstr "無法存取個人圖像資料"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:471
+#, fuzzy
+msgid "Could not set group URI."
+msgstr "註冊失敗"
+
+#: classes/User_group.php:492
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "註冊失敗"
 
+#: classes/User_group.php:506
+#, fuzzy
+msgid "Could not save local group info."
+msgstr "註冊失敗"
+
 #: lib/accountsettingsaction.php:108
 msgid "Change your profile settings"
 msgstr ""
@@ -4437,125 +4517,186 @@ msgstr ""
 msgid "Primary site navigation"
 msgstr ""
 
+#. TRANS: Tooltip for main menu option "Personal"
 #: lib/action.php:439
-msgid "Home"
-msgstr "主頁"
-
-#: lib/action.php:439
+msgctxt "TOOLTIP"
 msgid "Personal profile and friends timeline"
 msgstr ""
 
-#: lib/action.php:441
-msgid "Change your email, avatar, password, profile"
-msgstr ""
+#: lib/action.php:442
+#, fuzzy
+msgctxt "MENU"
+msgid "Personal"
+msgstr "地點"
 
+#. TRANS: Tooltip for main menu option "Account"
 #: lib/action.php:444
-msgid "Connect"
-msgstr "連結"
+#, fuzzy
+msgctxt "TOOLTIP"
+msgid "Change your email, avatar, password, profile"
+msgstr "更改密碼"
 
-#: lib/action.php:444
+#: lib/action.php:447
 #, fuzzy
+msgctxt "MENU"
+msgid "Account"
+msgstr "關於"
+
+#. TRANS: Tooltip for main menu option "Services"
+#: lib/action.php:450
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Connect to services"
 msgstr "無法連結到伺服器:%s"
 
-#: lib/action.php:448
+#: lib/action.php:453
+#, fuzzy
+msgctxt "MENU"
+msgid "Connect"
+msgstr "連結"
+
+#. TRANS: Tooltip for menu option "Admin"
+#: lib/action.php:457
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Change site configuration"
-msgstr ""
+msgstr "確認信箱"
 
-#: lib/action.php:452 lib/subgroupnav.php:105
-msgid "Invite"
+#: lib/action.php:460
+msgctxt "MENU"
+msgid "Admin"
 msgstr ""
 
-#: lib/action.php:453 lib/subgroupnav.php:106
+#. TRANS: Tooltip for main menu option "Invite"
+#: lib/action.php:464
 #, php-format
+msgctxt "TOOLTIP"
 msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/action.php:458
-msgid "Logout"
-msgstr "登出"
+#: lib/action.php:467
+#, fuzzy
+msgctxt "MENU"
+msgid "Invite"
+msgstr "尺寸錯誤"
 
-#: lib/action.php:458
+#. TRANS: Tooltip for main menu option "Logout"
+#: lib/action.php:473
+msgctxt "TOOLTIP"
 msgid "Logout from the site"
 msgstr ""
 
-#: lib/action.php:463
+#: lib/action.php:476
 #, fuzzy
+msgctxt "MENU"
+msgid "Logout"
+msgstr "登出"
+
+#. TRANS: Tooltip for main menu option "Register"
+#: lib/action.php:481
+#, fuzzy
+msgctxt "TOOLTIP"
 msgid "Create an account"
 msgstr "新增帳號"
 
-#: lib/action.php:466
+#: lib/action.php:484
+#, fuzzy
+msgctxt "MENU"
+msgid "Register"
+msgstr "所有訂閱"
+
+#. TRANS: Tooltip for main menu option "Login"
+#: lib/action.php:487
+msgctxt "TOOLTIP"
 msgid "Login to the site"
 msgstr ""
 
-#: lib/action.php:469 lib/action.php:732
-msgid "Help"
-msgstr "求救"
+#: lib/action.php:490
+#, fuzzy
+msgctxt "MENU"
+msgid "Login"
+msgstr "登入"
 
-#: lib/action.php:469
+#. TRANS: Tooltip for main menu option "Help"
+#: lib/action.php:493
 #, fuzzy
+msgctxt "TOOLTIP"
 msgid "Help me!"
 msgstr "求救"
 
-#: lib/action.php:472 lib/searchaction.php:127
-msgid "Search"
-msgstr ""
+#: lib/action.php:496
+#, fuzzy
+msgctxt "MENU"
+msgid "Help"
+msgstr "求救"
 
-#: lib/action.php:472
+#. TRANS: Tooltip for main menu option "Search"
+#: lib/action.php:499
+msgctxt "TOOLTIP"
 msgid "Search for people or text"
 msgstr ""
 
-#: lib/action.php:493
+#: lib/action.php:502
+msgctxt "MENU"
+msgid "Search"
+msgstr ""
+
+#. TRANS: DT element for site notice. String is hidden in default CSS.
+#: lib/action.php:524
 #, fuzzy
 msgid "Site notice"
 msgstr "新訊息"
 
-#: lib/action.php:559
+#: lib/action.php:590
 msgid "Local views"
 msgstr ""
 
-#: lib/action.php:625
+#: lib/action.php:656
 #, fuzzy
 msgid "Page notice"
 msgstr "新訊息"
 
-#: lib/action.php:727
+#: lib/action.php:758
 msgid "Secondary site navigation"
 msgstr ""
 
-#: lib/action.php:734
+#: lib/action.php:763
+msgid "Help"
+msgstr "求救"
+
+#: lib/action.php:765
 msgid "About"
 msgstr "關於"
 
-#: lib/action.php:736
+#: lib/action.php:767
 msgid "FAQ"
 msgstr "常見問題"
 
-#: lib/action.php:740
+#: lib/action.php:771
 msgid "TOS"
 msgstr ""
 
-#: lib/action.php:743
+#: lib/action.php:774
 msgid "Privacy"
 msgstr ""
 
-#: lib/action.php:745
+#: lib/action.php:776
 msgid "Source"
 msgstr ""
 
-#: lib/action.php:749
+#: lib/action.php:780
 msgid "Contact"
 msgstr "好友名單"
 
-#: lib/action.php:751
+#: lib/action.php:782
 msgid "Badge"
 msgstr ""
 
-#: lib/action.php:779
+#: lib/action.php:810
 msgid "StatusNet software license"
 msgstr ""
 
-#: lib/action.php:782
+#: lib/action.php:813
 #, php-format
 msgid ""
 "**%%site.name%%** is a microblogging service brought to you by [%%site."
@@ -4564,12 +4705,12 @@ msgstr ""
 "**%%site.name%%**是由[%%site.broughtby%%](%%site.broughtbyurl%%)所提供的微型"
 "部落格服務"
 
-#: lib/action.php:784
+#: lib/action.php:815
 #, php-format
 msgid "**%%site.name%%** is a microblogging service. "
 msgstr "**%%site.name%%**是個微型部落格"
 
-#: lib/action.php:786
+#: lib/action.php:817
 #, php-format
 msgid ""
 "It runs the [StatusNet](http://status.net/) microblogging software, version %"
@@ -4577,101 +4718,164 @@ msgid ""
 "org/licensing/licenses/agpl-3.0.html)."
 msgstr ""
 
-#: lib/action.php:801
+#: lib/action.php:832
 #, fuzzy
 msgid "Site content license"
 msgstr "新訊息"
 
-#: lib/action.php:806
+#: lib/action.php:837
 #, php-format
 msgid "Content and data of %1$s are private and confidential."
 msgstr ""
 
-#: lib/action.php:811
+#: lib/action.php:842
 #, php-format
 msgid "Content and data copyright by %1$s. All rights reserved."
 msgstr ""
 
-#: lib/action.php:814
+#: lib/action.php:845
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:858
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:864
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1163
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1172
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1180
 #, fuzzy
 msgid "Before"
 msgstr "之前的內容»"
 
-#: lib/adminpanelaction.php:96
+#: lib/activity.php:449
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:477
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:481
+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 ""
 
-#: lib/adminpanelaction.php:107
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:110
 msgid "Changes to that panel are not allowed."
 msgstr ""
 
-#: lib/adminpanelaction.php:206
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:211
 msgid "showForm() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:235
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:241
 msgid "saveSettings() not implemented."
 msgstr ""
 
-#: lib/adminpanelaction.php:258
+#. TRANS: Client error message
+#: lib/adminpanelaction.php:265
 msgid "Unable to delete design setting."
 msgstr ""
 
-#: lib/adminpanelaction.php:312
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:330
 #, fuzzy
 msgid "Basic site configuration"
 msgstr "確認信箱"
 
-#: lib/adminpanelaction.php:317
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:332
+#, fuzzy
+msgctxt "MENU"
+msgid "Site"
+msgstr "新訊息"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:338
 #, fuzzy
 msgid "Design configuration"
 msgstr "確認信箱"
 
-#: lib/adminpanelaction.php:322
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:340
+#, fuzzy
+msgctxt "MENU"
+msgid "Design"
+msgstr "地點"
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:346
 #, fuzzy
 msgid "User configuration"
 msgstr "確認信箱"
 
-#: lib/adminpanelaction.php:327
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:348
+msgctxt "MENU"
+msgid "User"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:354
 #, fuzzy
 msgid "Access configuration"
 msgstr "確認信箱"
 
-#: lib/adminpanelaction.php:332
+#. 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
 #, fuzzy
 msgid "Paths configuration"
 msgstr "確認信箱"
 
-#: lib/adminpanelaction.php:337
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:364
+msgctxt "MENU"
+msgid "Paths"
+msgstr ""
+
+#. TRANS: Menu item title/tooltip
+#: lib/adminpanelaction.php:370
 #, fuzzy
 msgid "Sessions configuration"
 msgstr "確認信箱"
 
-#: lib/apiauth.php:95
+#. TRANS: Menu item for site administration
+#: lib/adminpanelaction.php:372
+#, fuzzy
+msgctxt "MENU"
+msgid "Sessions"
+msgstr "地點"
+
+#: lib/apiauth.php:94
 msgid "API resource requires read-write access, but you only have read access."
 msgstr ""
 
-#: lib/apiauth.php:273
+#: lib/apiauth.php:272
 #, php-format
 msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s"
 msgstr ""
@@ -4762,11 +4966,11 @@ msgstr ""
 msgid "Tags for this attachment"
 msgstr ""
 
-#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223
+#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225
 msgid "Password changing failed"
 msgstr ""
 
-#: lib/authenticationplugin.php:233
+#: lib/authenticationplugin.php:235
 msgid "Password changing is not allowed"
 msgstr ""
 
@@ -4919,80 +5123,90 @@ msgstr "儲存使用者發生錯誤"
 msgid "Specify the name of the user to subscribe to"
 msgstr ""
 
-#: lib/command.php:554
+#: lib/command.php:554 lib/command.php:589
+#, fuzzy
+msgid "No such user"
+msgstr "無此使用者"
+
+#: lib/command.php:561
 #, php-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: lib/command.php:575
+#: lib/command.php:582 lib/command.php:685
 msgid "Specify the name of the user to unsubscribe from"
 msgstr ""
 
-#: lib/command.php:582
+#: lib/command.php:595
 #, php-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: lib/command.php:600 lib/command.php:623
+#: lib/command.php:613 lib/command.php:636
 msgid "Command not yet implemented."
 msgstr ""
 
-#: lib/command.php:603
+#: lib/command.php:616
 msgid "Notification off."
 msgstr ""
 
-#: lib/command.php:605
+#: lib/command.php:618
 msgid "Can't turn off notification."
 msgstr ""
 
-#: lib/command.php:626
+#: lib/command.php:639
 msgid "Notification on."
 msgstr ""
 
-#: lib/command.php:628
+#: lib/command.php:641
 msgid "Can't turn on notification."
 msgstr ""
 
-#: lib/command.php:641
+#: lib/command.php:654
 msgid "Login command is disabled"
 msgstr ""
 
-#: lib/command.php:652
+#: 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:668
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "此帳號已註冊"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "此帳號已註冊"
 
-#: lib/command.php:670
+#: lib/command.php:711
 msgid "You are subscribed to this person:"
 msgid_plural "You are subscribed to these people:"
 msgstr[0] "此帳號已註冊"
 
-#: lib/command.php:690
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "無此訂閱"
 
-#: lib/command.php:692
+#: lib/command.php:733
 msgid "This person is subscribed to you:"
 msgid_plural "These people are subscribed to you:"
 msgstr[0] "無此訂閱"
 
-#: lib/command.php:712
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "無法連結到伺服器:%s"
 
-#: lib/command.php:714
+#: lib/command.php:755
 msgid "You are a member of this group:"
 msgid_plural "You are a member of these groups:"
 msgstr[0] "無法連結到伺服器:%s"
 
-#: lib/command.php:728
+#: lib/command.php:769
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5006,6 +5220,7 @@ msgid ""
 "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"
@@ -5033,20 +5248,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:148
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "無確認碼"
 
-#: lib/common.php:136
+#: lib/common.php:149
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:151
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:152
 msgid "Go to the installer."
 msgstr ""
 
@@ -5238,24 +5453,24 @@ msgstr ""
 msgid "Not an image or corrupt file."
 msgstr ""
 
-#: lib/imagefile.php:105
+#: lib/imagefile.php:109
 msgid "Unsupported image file format."
 msgstr ""
 
-#: lib/imagefile.php:118
+#: lib/imagefile.php:122
 #, fuzzy
 msgid "Lost our file."
 msgstr "無此通知"
 
-#: lib/imagefile.php:150 lib/imagefile.php:197
+#: lib/imagefile.php:166 lib/imagefile.php:231
 msgid "Unknown file type"
 msgstr ""
 
-#: lib/imagefile.php:217
+#: lib/imagefile.php:251
 msgid "MB"
 msgstr ""
 
-#: lib/imagefile.php:219
+#: lib/imagefile.php:253
 msgid "kB"
 msgstr ""
 
@@ -5469,7 +5684,7 @@ msgid ""
 "users in conversation. People can send you messages for your eyes only."
 msgstr ""
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr ""
 
@@ -5560,6 +5775,11 @@ msgstr ""
 msgid "Available characters"
 msgstr "6個以上字元"
 
+#: lib/messageform.php:178 lib/noticeform.php:236
+msgctxt "Send button for sending notice"
+msgid "Send"
+msgstr ""
+
 #: lib/noticeform.php:160
 #, fuzzy
 msgid "Send a notice"
@@ -5594,50 +5814,50 @@ msgid ""
 "try again later"
 msgstr ""
 
-#: lib/noticelist.php:428
+#: 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:429
+#: lib/noticelist.php:430
 msgid "N"
 msgstr ""
 
-#: lib/noticelist.php:429
+#: lib/noticelist.php:430
 msgid "S"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "E"
 msgstr ""
 
-#: lib/noticelist.php:430
+#: lib/noticelist.php:431
 msgid "W"
 msgstr ""
 
-#: lib/noticelist.php:436
+#: lib/noticelist.php:438
 msgid "at"
 msgstr ""
 
-#: lib/noticelist.php:547
+#: lib/noticelist.php:566
 #, fuzzy
 msgid "in context"
 msgstr "無內容"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:601
 #, fuzzy
 msgid "Repeated by"
 msgstr "新增"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:628
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:629
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:673
 #, fuzzy
 msgid "Notice repeated"
 msgstr "更新個人圖像"
@@ -5671,10 +5891,6 @@ msgstr "新增外部個人資料發生錯誤(Error inserting remote profile)"
 msgid "Duplicate notice"
 msgstr "新訊息"
 
-#: lib/oauthstore.php:465 lib/subs.php:48
-msgid "You have been banned from subscribing."
-msgstr ""
-
 #: lib/oauthstore.php:490
 msgid "Couldn't insert new subscription."
 msgstr "無法新增訂閱"
@@ -5691,6 +5907,10 @@ msgstr ""
 msgid "Favorites"
 msgstr ""
 
+#: lib/personalgroupnav.php:115
+msgid "User"
+msgstr ""
+
 #: lib/personalgroupnav.php:125
 msgid "Inbox"
 msgstr ""
@@ -5784,7 +6004,7 @@ msgstr "無此通知"
 msgid "Repeat this notice"
 msgstr "無此通知"
 
-#: lib/router.php:665
+#: lib/router.php:668
 msgid "No single user defined for single-user mode."
 msgstr ""
 
@@ -5805,6 +6025,10 @@ msgstr ""
 msgid "Keyword(s)"
 msgstr ""
 
+#: lib/searchaction.php:127
+msgid "Search"
+msgstr ""
+
 #: lib/searchaction.php:162
 msgid "Search help"
 msgstr ""
@@ -5858,36 +6082,15 @@ msgstr "此帳號已註冊"
 msgid "Groups %s is a member of"
 msgstr ""
 
-#: lib/subs.php:52
-msgid "Already subscribed!"
-msgstr ""
-
-#: lib/subs.php:56
-msgid "User has blocked you."
-msgstr ""
-
-#: lib/subs.php:63
-msgid "Could not subscribe."
+#: lib/subgroupnav.php:105
+msgid "Invite"
 msgstr ""
 
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
+#: lib/subgroupnav.php:106
+#, php-format
+msgid "Invite friends and colleagues to join you on %s"
 msgstr ""
 
-#: lib/subs.php:137
-#, fuzzy
-msgid "Not subscribed!"
-msgstr "此帳號已註冊"
-
-#: lib/subs.php:142
-#, fuzzy
-msgid "Couldn't delete self-subscription."
-msgstr "無法刪除帳號"
-
-#: lib/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "無法刪除帳號"
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5941,68 +6144,68 @@ msgstr "個人圖像"
 msgid "User actions"
 msgstr ""
 
-#: lib/userprofile.php:248
+#: lib/userprofile.php:251
 #, fuzzy
 msgid "Edit profile settings"
 msgstr "線上即時通設定"
 
-#: lib/userprofile.php:249
+#: lib/userprofile.php:252
 msgid "Edit"
 msgstr ""
 
-#: lib/userprofile.php:272
+#: lib/userprofile.php:275
 msgid "Send a direct message to this user"
 msgstr ""
 
-#: lib/userprofile.php:273
+#: lib/userprofile.php:276
 msgid "Message"
 msgstr ""
 
-#: lib/userprofile.php:311
+#: lib/userprofile.php:314
 msgid "Moderate"
 msgstr ""
 
-#: lib/util.php:870
+#: lib/util.php:1013
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:872
+#: lib/util.php:1015
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:874
+#: lib/util.php:1017
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:876
+#: lib/util.php:1019
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:878
+#: lib/util.php:1021
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:880
+#: lib/util.php:1023
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:882
+#: lib/util.php:1025
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:884
+#: lib/util.php:1027
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:886
+#: lib/util.php:1029
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:888
+#: lib/util.php:1031
 msgid "about a year ago"
 msgstr ""
 
index 84a2cb6168e7752d2ea2489917c06ec6c927cb4a..fb8f7306f51e4a4747e670294fbd2a136ebcd975 100644 (file)
@@ -22,7 +22,7 @@
  * @category  Action
  * @package   StatusNet
  * @author    Evan Prodromou <evan@status.net>
- * @copyright 2009 StatusNet Inc.
+ * @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/
  */
@@ -47,6 +47,55 @@ class BlacklistPlugin extends Plugin
 
     public $nicknames = array();
     public $urls      = array();
+    public $canAdmin  = true;
+
+    private $_nicknamePatterns = array();
+    private $_urlPatterns      = array();
+
+    /**
+     * Initialize the plugin
+     *
+     * @return void
+     */
+
+    function initialize()
+    {
+        $confNicknames = $this->_configArray('blacklist', 'nicknames');
+
+        $this->_nicknamePatterns = array_merge($this->nicknames,
+                                               $confNicknames);
+
+        $confURLs = $this->_configArray('blacklist', 'urls');
+
+        $this->_urlPatterns = array_merge($this->urls,
+                                          $confURLs);
+    }
+
+    /**
+     * Retrieve an array from configuration
+     *
+     * Carefully checks a section.
+     *
+     * @param string $section Configuration section
+     * @param string $setting Configuration setting
+     *
+     * @return array configuration values
+     */
+
+    function _configArray($section, $setting)
+    {
+        $config = common_config($section, $setting);
+
+        if (empty($config)) {
+            return array();
+        } else if (is_array($config)) {
+            return $config;
+        } else if (is_string($config)) {
+            return explode("\r\n", $config);
+        } else {
+            throw new Exception("Unknown data type for config $section + $setting");
+        }
+    }
 
     /**
      * Hook registration to prevent blacklisted homepages or nicknames
@@ -173,7 +222,8 @@ class BlacklistPlugin extends Plugin
 
     private function _checkUrl($url)
     {
-        foreach ($this->urls as $pattern) {
+        foreach ($this->_urlPatterns as $pattern) {
+            common_debug("Checking $url against $pattern");
             if (preg_match("/$pattern/", $url)) {
                 return false;
             }
@@ -194,7 +244,8 @@ class BlacklistPlugin extends Plugin
 
     private function _checkNickname($nickname)
     {
-        foreach ($this->nicknames as $pattern) {
+        foreach ($this->_nicknamePatterns as $pattern) {
+            common_debug("Checking $nickname against $pattern");
             if (preg_match("/$pattern/", $nickname)) {
                 return false;
             }
@@ -203,14 +254,191 @@ class BlacklistPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Add our actions to the URL router
+     *
+     * @param Net_URL_Mapper $m URL mapper for this hit
+     *
+     * @return boolean hook return
+     */
+
+    function onRouterInitialized($m)
+    {
+        $m->connect('admin/blacklist', array('action' => 'blacklistadminpanel'));
+        return true;
+    }
+
+    /**
+     * Auto-load our classes if called
+     *
+     * @param string $cls Class to load
+     *
+     * @return boolean hook return
+     */
+
+    function onAutoload($cls)
+    {
+        switch (strtolower($cls))
+        {
+        case 'blacklistadminpanelaction':
+            $base = strtolower(mb_substr($cls, 0, -6));
+            include_once INSTALLDIR.'/plugins/Blacklist/'.$base.'.php';
+            return false;
+        default:
+            return true;
+        }
+    }
+
+    /**
+     * Plugin version data
+     *
+     * @param array &$versions array of version blocks
+     *
+     * @return boolean hook value
+     */
+
     function onPluginVersion(&$versions)
     {
         $versions[] = array('name' => 'Blacklist',
                             'version' => self::VERSION,
                             'author' => 'Evan Prodromou',
-                            'homepage' => 'http://status.net/wiki/Plugin:Blacklist',
+                            'homepage' =>
+                            'http://status.net/wiki/Plugin:Blacklist',
                             'description' =>
-                            _m('Keep a blacklist of forbidden nickname and URL patterns.'));
+                            _m('Keep a blacklist of forbidden nickname '.
+                               'and URL patterns.'));
+        return true;
+    }
+
+    /**
+     * Determines if our admin panel can be shown
+     *
+     * @param string  $name  name of the admin panel
+     * @param boolean &$isOK result
+     *
+     * @return boolean hook value
+     */
+
+    function onAdminPanelCheck($name, &$isOK)
+    {
+        if ($name == 'blacklist') {
+            $isOK = $this->canAdmin;
+            return false;
+        }
+
         return true;
     }
+
+    /**
+     * Add our tab to the admin panel
+     *
+     * @param Widget $nav Admin panel nav
+     *
+     * @return boolean hook value
+     */
+
+    function onEndAdminPanelNav($nav)
+    {
+        if (AdminPanelAction::canAdmin('blacklist')) {
+
+            $action_name = $nav->action->trimmed('action');
+
+            $nav->out->menuItem(common_local_url('blacklistadminpanel'),
+                                _('Blacklist'),
+                                _('Blacklist configuration'),
+                                $action_name == 'blacklistadminpanel',
+                                'nav_blacklist_admin_panel');
+        }
+
+        return true;
+    }
+
+    function onEndDeleteUserForm($action, $user)
+    {
+        $cur = common_current_user();
+
+        if (empty($cur) || !$cur->hasRight(Right::CONFIGURESITE)) {
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (empty($profile)) {
+            return;
+        }
+
+        $action->elementStart('ul', 'form_data');
+        $action->elementStart('li');
+        $this->checkboxAndText($action,
+                               'blacklistnickname',
+                               _('Add this nickname pattern to blacklist'),
+                               'blacklistnicknamepattern',
+                               $this->patternizeNickname($user->nickname));
+        $action->elementEnd('li');
+
+        if (!empty($profile->homepage)) {
+            $action->elementStart('li');
+            $this->checkboxAndText($action,
+                                   'blacklisthomepage',
+                                   _('Add this homepage pattern to blacklist'),
+                                   'blacklisthomepagepattern',
+                                   $this->patternizeHomepage($profile->homepage));
+            $action->elementEnd('li');
+        }
+
+        $action->elementEnd('ul');
+    }
+
+    function onEndDeleteUser($action, $user)
+    {
+        common_debug("Action args: " . print_r($action->args, true));
+
+        if ($action->boolean('blacklisthomepage')) {
+            $pattern = $action->trimmed('blacklisthomepagepattern');
+            $confURLs = $this->_configArray('blacklist', 'urls');
+            $confURLs[] = $pattern;
+            Config::save('blacklist', 'urls', implode("\r\n", $confURLs));
+        }
+
+        if ($action->boolean('blacklistnickname')) {
+            $pattern = $action->trimmed('blacklistnicknamepattern');
+            $confNicknames = $this->_configArray('blacklist', 'nicknames');
+            $confNicknames[] = $pattern;
+            Config::save('blacklist', 'nicknames', implode("\r\n", $confNicknames));
+        }
+
+        return true;
+    }
+
+    function checkboxAndText($action, $checkID, $label, $textID, $value)
+    {
+        $action->element('input', array('name' => $checkID,
+                                        'type' => 'checkbox',
+                                        'class' => 'checkbox',
+                                        'id' => $checkID));
+
+        $action->text(' ');
+
+        $action->element('label', array('class' => 'checkbox',
+                                        'for' => $checkID),
+                         $label);
+
+        $action->text(' ');
+
+        $action->element('input', array('name' => $textID,
+                                        'type' => 'text',
+                                        'id' => $textID,
+                                        'value' => $value));
+    }
+
+    function patternizeNickname($nickname)
+    {
+        return $nickname;
+    }
+
+    function patternizeHomepage($homepage)
+    {
+        $hostname = parse_url($homepage, PHP_URL_HOST);
+        return $hostname;
+    }
 }
diff --git a/plugins/Blacklist/blacklistadminpanel.php b/plugins/Blacklist/blacklistadminpanel.php
new file mode 100644 (file)
index 0000000..98d0708
--- /dev/null
@@ -0,0 +1,222 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Blacklist administration panel
+ *
+ * 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  Settings
+ * @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/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Administer blacklist
+ *
+ * @category Admin
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class BlacklistadminpanelAction extends AdminPanelAction
+{
+    /**
+     * title of the admin panel
+     *
+     * @return string title
+     */
+
+    function title()
+    {
+        return _('Blacklist');
+    }
+
+    /**
+     * Panel instructions
+     *
+     * @return string instructions
+     */
+
+    function getInstructions()
+    {
+        return _('Blacklisted URLs and nicknames');
+    }
+
+    /**
+     * Show the actual form
+     *
+     * @return void
+     *
+     * @see BlacklistAdminPanelForm
+     */
+
+    function showForm()
+    {
+        $form = new BlacklistAdminPanelForm($this);
+        $form->show();
+        return;
+    }
+
+    /**
+     * Save the form settings
+     *
+     * @return void
+     */
+
+    function saveSettings()
+    {
+        static $settings = array(
+                'blacklist' => array('nicknames', 'urls'),
+        );
+
+        $values = array();
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                $values[$section][$setting] = $this->trimmed("$section-$setting");
+            }
+        }
+
+        // This throws an exception on validation errors
+
+        $this->validate($values);
+
+        // assert(all values are valid);
+
+        $config = new Config();
+
+        $config->query('BEGIN');
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                Config::save($section, $setting, $values[$section][$setting]);
+            }
+        }
+
+        $config->query('COMMIT');
+
+        return;
+    }
+
+    /**
+     * Validate the values
+     *
+     * @param array &$values 2d array of values to check
+     *
+     * @return boolean success flag
+     */
+
+    function validate(&$values)
+    {
+        return true;
+    }
+}
+
+/**
+ * Admin panel form for blacklist panel
+ *
+ * @category Admin
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class BlacklistAdminPanelForm extends Form
+{
+    /**
+     * ID of the form
+     *
+     * @return string ID
+     */
+
+    function id()
+    {
+        return 'blacklistadminpanel';
+    }
+
+    /**
+     * Class of the form
+     *
+     * @return string class
+     */
+
+    function formClass()
+    {
+        return 'form_settings';
+    }
+
+    /**
+     * Action we post to
+     *
+     * @return string action URL
+     */
+
+    function action()
+    {
+        return common_local_url('blacklistadminpanel');
+    }
+
+    /**
+     * Show the form controls
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->out->elementStart('li');
+        $this->out->textarea('blacklist-nicknames', _m('Nicknames'),
+                             common_config('blacklist', 'nicknames'),
+                             _('Patterns of nicknames to block, one per line'));
+        $this->out->elementEnd('li');
+
+        $this->out->elementStart('li');
+        $this->out->textarea('blacklist-urls', _m('URLs'),
+                             common_config('blacklist', 'urls'),
+                             _('Patterns of URLs to block, one per line'));
+        $this->out->elementEnd('li');
+
+        $this->out->elementEnd('ul');
+    }
+
+    /**
+     * Buttons for submitting
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit('submit',
+                           _('Save'),
+                           'submit',
+                           null,
+                           _('Save site settings'));
+    }
+}
index 51236001aa3fb9aca78ed0a65de62a4a299c7622..d52e6006ac8dbb4bc33bd203af9d59521782826f 100644 (file)
@@ -72,8 +72,10 @@ class BlogspamNetPlugin extends Plugin
         common_debug("Blogspamnet args = " . print_r($args, TRUE));
         $requestBody = xmlrpc_encode_request('testComment', array($args));
 
-        $request = HTTPClient::start();
-        $httpResponse = $request->post($this->baseUrl, array('Content-Type: text/xml'), $requestBody);
+        $request = new HTTPClient($this->baseUrl, HTTPClient::METHOD_POST);
+        $request->setHeader('Content-Type', 'text/xml');
+        $request->setBody($requestBody);
+        $httpResponse = $request->send();
 
         $response = xmlrpc_decode($httpResponse->getBody());
         if (xmlrpc_is_fault($response)) {
@@ -118,7 +120,7 @@ class BlogspamNetPlugin extends Plugin
         $args['site'] = common_root_url();
         $args['version'] = $this->userAgent();
 
-        $args['options'] = "max-size=140,min-size=0,min-words=0,exclude=bayasian";
+        $args['options'] = "max-size=" . common_config('site','textlimit') . ",min-size=0,min-words=0,exclude=bayasian";
 
         return $args;
     }
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 78c9054e14818c1444e4d39e0173b2424b03a5e3..443cb396fcc5107f8e2a10f52a559758c934f97b 100644 (file)
@@ -22,7 +22,7 @@
  * @category  Plugin
  * @package   StatusNet
  * @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/
  */
@@ -32,12 +32,12 @@ if (!defined('STATUSNET')) {
 }
 
 define("FACEBOOK_CONNECT_SERVICE", 3);
-define('FACEBOOKPLUGIN_VERSION', '0.9');
 
 require_once INSTALLDIR . '/plugins/Facebook/facebookutil.php';
 
 /**
- * Facebook plugin to add a StatusNet Facebook application
+ * Facebook plugin to add a StatusNet Facebook canvas application
+ * and allow registration and authentication via Facebook Connect
  *
  * @category Plugin
  * @package  StatusNet
@@ -49,6 +49,36 @@ require_once INSTALLDIR . '/plugins/Facebook/facebookutil.php';
 class FacebookPlugin extends Plugin
 {
 
+    const VERSION = STATUSNET_VERSION;
+
+    /**
+     * Initializer for the plugin.
+     */
+
+    function initialize()
+    {
+        // Allow the key and secret to be passed in
+        // Control panel will override
+
+        if (isset($this->apikey)) {
+            $key = common_config('facebook', 'apikey');
+            if (empty($key)) {
+                Config::save('facebook', 'apikey', $this->apikey);
+            }
+        }
+
+        if (isset($this->secret)) {
+            $secret = common_config('facebook', 'secret');
+            if (empty($secret)) {
+                Config::save(
+                    'facebook',
+                    'secret',
+                    $this->secret
+                );
+            }
+        }
+    }
+
     /**
      * Add Facebook app actions to the router table
      *
@@ -70,6 +100,7 @@ class FacebookPlugin extends Plugin
                     array('action' => 'facebooksettings'));
         $m->connect('facebook/app/invite.php', array('action' => 'facebookinvite'));
         $m->connect('facebook/app/remove', array('action' => 'facebookremove'));
+        $m->connect('admin/facebook', array('action' => 'facebookadminpanel'));
 
         // Facebook Connect stuff
 
@@ -98,6 +129,7 @@ class FacebookPlugin extends Plugin
         case 'FacebookinviteAction':
         case 'FacebookremoveAction':
         case 'FacebooksettingsAction':
+        case 'FacebookadminpanelAction':
             include_once INSTALLDIR . '/plugins/Facebook/' .
               strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
@@ -122,6 +154,32 @@ class FacebookPlugin extends Plugin
         }
     }
 
+    /**
+     * Add a Facebook tab to the admin panels
+     *
+     * @param Widget $nav Admin panel nav
+     *
+     * @return boolean hook value
+     */
+
+    function onEndAdminPanelNav($nav)
+    {
+        if (AdminPanelAction::canAdmin('facebook')) {
+
+            $action_name = $nav->action->trimmed('action');
+
+            $nav->out->menuItem(
+                common_local_url('facebookadminpanel'),
+                _m('Facebook'),
+                _m('Facebook integration configuration'),
+                $action_name == 'facebookadminpanel',
+                'nav_facebook_admin_panel'
+            );
+        }
+
+        return true;
+    }
+
     /**
      * Override normal HTML output to force the content type to
      * text/html and add in xmlns:fb
@@ -359,8 +417,6 @@ class FacebookPlugin extends Plugin
             $connect = 'imsettings';
         } else if (common_config('sms', 'enabled')) {
             $connect = 'smssettings';
-        } else if (common_config('twitter', 'enabled')) {
-            $connect = 'twittersettings';
         }
 
         if (!empty($user)) {
@@ -525,15 +581,18 @@ class FacebookPlugin extends Plugin
 
     function onPluginVersion(&$versions)
     {
-        $versions[] = array('name' => 'Facebook',
-                            'version' => FACEBOOKPLUGIN_VERSION,
-                            'author' => 'Zach Copley',
-                            'homepage' => 'http://status.net/wiki/Plugin:Facebook',
-                            'rawdescription' =>
-                            _m('The Facebook plugin allows you to integrate ' .
-                               'your StatusNet instance with ' .
-                               '<a href="http://facebook.com/">Facebook</a> ' .
-                               'and Facebook Connect.'));
+        $versions[] = array(
+            'name' => 'Facebook',
+            'version' => self::VERSION,
+            'author' => 'Zach Copley',
+            'homepage' => 'http://status.net/wiki/Plugin:Facebook',
+            'rawdescription' => _m(
+                'The Facebook plugin allows you to integrate ' .
+                'your StatusNet instance with ' .
+                '<a href="http://facebook.com/">Facebook</a> ' .
+                'and Facebook Connect.'
+            )
+        );
         return true;
     }
 
index bf2f4a1800925ab05555125f1b4044c7f8b9a063..14c1d324197b988577caa12cb5c4469f64185d30 100644 (file)
@@ -1,6 +1,9 @@
-This plugin allows you to use Facebook Connect with StatusNet, provides a
-Facebook application for your users, and allows them to update their
-Facebook statuses from StatusNet.
+Facebook Plugin
+===============
+
+This plugin allows you to use Facebook Connect with StatusNet, provides
+a Facebook canvas application for your users, and allows them to update
+their Facebook statuses from StatusNet.
 
 Facebook Connect
 ----------------
@@ -15,12 +18,12 @@ Facebook credentials. With Facebook Connect, your users can:
 Built-in Facebook Application
 -----------------------------
 
-The plugin also installs a StatusNet Facebook application that allows your
-users to automatically update their Facebook statuses with their latest
-notices, invite their friends to use the app (and thus your site), view
-their notice timelines, and post notices -- all from within Facebook. The
-application is built into the StatusNet Facebook plugin and runs on your
-host.
+The plugin also installs a StatusNet Facebook canvas application that
+allows your users to automatically update their Facebook status with
+their latest notices, invite their friends to use the app (and thus your
+site), view their notice timelines and post notices -- all from within
+Facebook.  The application is built into the StatusNet Facebook plugin
+and runs on your host.
 
 Quick setup instructions*
 -------------------------
@@ -29,13 +32,9 @@ Install the Facebook Developer application on Facebook:
 
     http://www.facebook.com/developers/
 
-Use it to create a new application and generate an API key and secret. Add a
-Facebook app section of your config.php and copy in the key and secret,
-e.g.:
-
-    // Config section for the built-in Facebook application
-    $config['facebook']['apikey'] = 'APIKEY';
-    $config['facebook']['secret'] = 'SECRET';
+Use it to create a new application and generate an API key and secret.
+You will need the key and secret so cut-n-paste them into your text
+editor or write them down.
 
 In Facebook's application editor, specify the following URLs for your app:
 
@@ -67,11 +66,36 @@ can be left with default values.
     http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site
     http://wiki.developers.facebook.com/index.php/Creating_your_first_application
 
-Finally you must activate the plugin by adding the following line to your
-config.php:
+Finally you must activate the plugin by adding it in your config.php
+(this is where you'll need the API key and secret generated earlier):
+
+    addPlugin(
+        'Facebook',
+        array(
+            'apikey' => 'YOUR_APIKEY',
+            'secret' => 'YOUR_SECRET'
+        )
+    );
+
+Administration Panel
+--------------------
+
+As of StatusNet 0.9.0 you can alternatively specify the key and secret
+via a Facebook administration panel from within StatusNet, in which case
+you can just add:
 
     addPlugin('Facebook');
 
+to activate the plugin.
+
+NOTE: To enable the administration panel you'll need to add it to the
+list of active administration panels, e.g.:
+
+    $config['admin']['panels'][] = 'facebook';
+
+and of course you'll need a user with the administrative role to access
+it and input the API key and secret (see: scripts/userrole.php).
+
 Testing It Out
 --------------
 
@@ -81,11 +105,11 @@ disconnect* to their Facebook accounts from it.
 
 To try out the plugin, fire up your browser and connect to:
 
-    http://SITE/PATH_TO_STATUSNET/main/facebooklogin
+    http://example.net/mublog/main/facebooklogin
 
 or, if you do not have fancy URLs turned on:
 
-    http://SITE/PATH_TO_STATUSNET/index.php/main/facebooklogin
+    http://example.net/mublog/index.php/main/facebooklogin
 
 You should see a page with a blue button that says: "Connect with Facebook"
 and you should be able to login or register.
@@ -101,7 +125,7 @@ the app, you are given the option to update their Facebook status via
 StatusNet.
 
 * Note: Before a user can disconnect from Facebook, she must set a normal
-  StatusNet password. Otherwise, she might not be able to login in to her
+  StatusNet password.  Otherwise, she might not be able to login in to her
   account in the future.  This is usually only required for users who have
   used Facebook Connect to register their StatusNet account, and therefore
   haven't already set a local password.
@@ -109,16 +133,20 @@ StatusNet.
 Offline Queue Handling
 ----------------------
 
-For larger sites needing better performance it's possible to enable queuing
-and have users' notices posted to Facebook via a separate "offline"
-FacebookQueueHandler (facebookqueuhandler.php in the Facebook plugin
-directory), which will be started by the plugin along with their other
-daemons when you run scripts/startdaemons.sh. See the StatusNet README for
-more about queuing and daemons.
+For larger sites needing better performance it's possible to enable
+queuing and have users' notices posted to Facebook via a separate
+"offline" process -- FacebookQueueHandler (facebookqueuhandler.php in
+the Facebook plugin directory).  It will run automatically if you have
+enabled StatusNet's offline queueing subsystem.  See the "Queues and
+daemons" section in the StatusNet README for more about queuing.
+
 
 TODO
 ----
 
+- Make Facebook Connect work for authentication for multi-site setups
+  (e.g.: *.status.net)
+- Posting to Facebook user streams using only Facebook Connect
 - Invite Facebook friends to use your StatusNet installation via Facebook
   Connect
 - Auto-subscribe Facebook friends already using StatusNet
@@ -126,4 +154,4 @@ TODO
 - Allow users to update their Facebook statuses once they have authenticated
   with Facebook Connect (no need for them to use the Facebook app if they
   don't want to).
-- Re-design the whole thing to support multiple instances of StatusNet
+- Import a user's Facebook updates into StatusNet
diff --git a/plugins/Facebook/facebookadminpanel.php b/plugins/Facebook/facebookadminpanel.php
new file mode 100644 (file)
index 0000000..ae1c730
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Facebook integration administration panel
+ *
+ * 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  Settings
+ * @package   StatusNet
+ * @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);
+}
+
+/**
+ * Administer global Facebook integration settings
+ *
+ * @category Admin
+ * @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 FacebookadminpanelAction extends AdminPanelAction
+{
+    /**
+     * Returns the page title
+     *
+     * @return string page title
+     */
+
+    function title()
+    {
+        return _m('Facebook');
+    }
+
+    /**
+     * Instructions for using this form.
+     *
+     * @return string instructions
+     */
+
+    function getInstructions()
+    {
+        return _m('Facebook integration settings');
+    }
+
+    /**
+     * Show the Facebook admin panel form
+     *
+     * @return void
+     */
+
+    function showForm()
+    {
+        $form = new FacebookAdminPanelForm($this);
+        $form->show();
+        return;
+    }
+
+    /**
+     * Save settings from the form
+     *
+     * @return void
+     */
+
+    function saveSettings()
+    {
+        static $settings = array(
+            'facebook'     => array('apikey', 'secret'),
+        );
+
+        $values = array();
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                $values[$section][$setting]
+                    = $this->trimmed($setting);
+            }
+        }
+
+        // This throws an exception on validation errors
+
+        $this->validate($values);
+
+        // assert(all values are valid);
+
+        $config = new Config();
+
+        $config->query('BEGIN');
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                Config::save($section, $setting, $values[$section][$setting]);
+            }
+        }
+
+        $config->query('COMMIT');
+
+        return;
+    }
+
+    function validate(&$values)
+    {
+        // Validate consumer key and secret (can't be too long)
+
+        if (mb_strlen($values['facebook']['apikey']) > 255) {
+            $this->clientError(
+                _m("Invalid Facebook API key. Max length is 255 characters.")
+            );
+        }
+
+        if (mb_strlen($values['facebook']['secret']) > 255) {
+            $this->clientError(
+                _m("Invalid Facebook API secret. Max length is 255 characters.")
+            );
+        }
+    }
+}
+
+class FacebookAdminPanelForm extends AdminForm
+{
+    /**
+     * ID of the form
+     *
+     * @return int ID of the form
+     */
+
+    function id()
+    {
+        return 'facebookadminpanel';
+    }
+
+    /**
+     * class of the form
+     *
+     * @return string class of the form
+     */
+
+    function formClass()
+    {
+        return 'form_settings';
+    }
+
+    /**
+     * Action of the form
+     *
+     * @return string URL of the action
+     */
+
+    function action()
+    {
+        return common_local_url('facebookadminpanel');
+    }
+
+    /**
+     * Data elements of the form
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->elementStart(
+            'fieldset',
+            array('id' => 'settings_facebook-application')
+        );
+        $this->out->element('legend', null, _m('Facebook application settings'));
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->li();
+        $this->input(
+            'apikey',
+            _m('API key'),
+            _m('API key provided by Facebook'),
+            'facebook'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'secret',
+             _m('Secret'),
+            _m('API secret provided by Facebook'),
+            'facebook'
+        );
+        $this->unli();
+
+        $this->out->elementEnd('ul');
+        $this->out->elementEnd('fieldset');
+    }
+
+    /**
+     * Action elements
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit('submit', _('Save'), 'submit', null, _('Save Facebook settings'));
+    }
+}
index 5b313c8c5367d2d2b9c162e120e713aa537d608f..4bc00248c95478f5727a5c71620fe47d845eb4b4 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:38-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -59,63 +59,31 @@ msgstr ""
 msgid "Lost or forgotten password?"
 msgstr ""
 
-#: facebookaction.php:386 facebookhome.php:248
+#: facebookaction.php:330 facebookhome.php:248
 msgid "Pagination"
 msgstr ""
 
-#: facebookaction.php:395 facebookhome.php:257
+#: facebookaction.php:339 facebookhome.php:257
 msgid "After"
 msgstr ""
 
-#: facebookaction.php:403 facebookhome.php:265
+#: facebookaction.php:347 facebookhome.php:265
 msgid "Before"
 msgstr ""
 
-#: facebookaction.php:421
+#: facebookaction.php:365
 msgid "No notice content!"
 msgstr ""
 
-#: facebookaction.php:427
+#: facebookaction.php:371
 #, php-format
 msgid "That's too long. Max notice size is %d chars."
 msgstr ""
 
-#: facebookaction.php:523
+#: facebookaction.php:430
 msgid "Notices"
 msgstr ""
 
-#: facebookutil.php:280
-#, php-format
-msgid "Your %1$s Facebook application access has been disabled."
-msgstr ""
-
-#: facebookutil.php:283
-#, php-format
-msgid ""
-"Hi, %1$s. We're sorry to inform you that we are unable to update your "
-"Facebook status from %2$s, and have disabled the Facebook application for "
-"your account. This may be because you have removed the Facebook "
-"application's authorization, or have deleted your Facebook account.  You can "
-"re-enable the Facebook application and automatic status updating by re-"
-"installing the %2$s Facebook application.\n"
-"\n"
-"Regards,\n"
-"\n"
-"%2$s"
-msgstr ""
-
-#: FBConnectLogin.php:33
-msgid "Already logged in."
-msgstr ""
-
-#: FBConnectLogin.php:41
-msgid "Login with your Facebook Account"
-msgstr ""
-
-#: FBConnectLogin.php:55
-msgid "Facebook Login"
-msgstr ""
-
 #: facebookhome.php:111
 msgid "Server error - couldn't get user!"
 msgstr ""
@@ -149,50 +117,6 @@ msgstr ""
 msgid "Skip"
 msgstr ""
 
-#: facebooksettings.php:74
-msgid "There was a problem saving your sync preferences!"
-msgstr ""
-
-#: facebooksettings.php:76
-msgid "Sync preferences saved."
-msgstr ""
-
-#: facebooksettings.php:99
-msgid "Automatically update my Facebook status with my notices."
-msgstr ""
-
-#: facebooksettings.php:106
-msgid "Send \"@\" replies to Facebook."
-msgstr ""
-
-#: facebooksettings.php:115
-msgid "Prefix"
-msgstr ""
-
-#: facebooksettings.php:117
-msgid "A string to prefix notices with."
-msgstr ""
-
-#: facebooksettings.php:123
-msgid "Save"
-msgstr ""
-
-#: facebooksettings.php:133
-#, php-format
-msgid ""
-"If you would like %s to automatically update your Facebook status with your "
-"latest notice, you need to give it permission."
-msgstr ""
-
-#: facebooksettings.php:146
-#, php-format
-msgid "Allow %s to update my Facebook status"
-msgstr ""
-
-#: facebooksettings.php:156
-msgid "Sync preferences"
-msgstr ""
-
 #: facebookinvite.php:72
 #, php-format
 msgid "Thanks for inviting your friends to use %s"
@@ -221,61 +145,85 @@ msgstr ""
 msgid "Send invitations"
 msgstr ""
 
-#: facebookremove.php:58
-msgid "Couldn't remove Facebook user."
+#: FacebookPlugin.php:413 FacebookPlugin.php:433
+msgid "Facebook"
 msgstr ""
 
-#: FBConnectSettings.php:56 FacebookPlugin.php:430
+#: FacebookPlugin.php:414
+msgid "Login or register using Facebook"
+msgstr ""
+
+#: FacebookPlugin.php:434 FBConnectSettings.php:56
 msgid "Facebook Connect Settings"
 msgstr ""
 
-#: FBConnectSettings.php:67
-msgid "Manage how your account connects to Facebook"
+#: FacebookPlugin.php:533
+msgid ""
+"The Facebook plugin allows you to integrate your StatusNet instance with <a "
+"href=\"http://facebook.com/\">Facebook</a> and Facebook Connect."
 msgstr ""
 
-#: FBConnectSettings.php:92
-msgid "There is no Facebook user connected to this account."
+#: facebookremove.php:58
+msgid "Couldn't remove Facebook user."
 msgstr ""
 
-#: FBConnectSettings.php:100
-msgid "Connected Facebook user"
+#: facebooksettings.php:74
+msgid "There was a problem saving your sync preferences!"
 msgstr ""
 
-#: FBConnectSettings.php:119
-msgid "Disconnect my account from Facebook"
+#: facebooksettings.php:76
+msgid "Sync preferences saved."
 msgstr ""
 
-#: FBConnectSettings.php:124
-msgid ""
-"Disconnecting your Faceboook would make it impossible to log in! Please "
+#: facebooksettings.php:99
+msgid "Automatically update my Facebook status with my notices."
 msgstr ""
 
-#: FBConnectSettings.php:128
-msgid "set a password"
+#: facebooksettings.php:106
+msgid "Send \"@\" replies to Facebook."
 msgstr ""
 
-#: FBConnectSettings.php:130
-msgid " first."
+#: facebooksettings.php:115
+msgid "Prefix"
 msgstr ""
 
-#: FBConnectSettings.php:142
-msgid "Disconnect"
+#: facebooksettings.php:117
+msgid "A string to prefix notices with."
 msgstr ""
 
-#: FBConnectSettings.php:164 FBConnectAuth.php:90
-msgid "There was a problem with your session token. Try again, please."
+#: facebooksettings.php:123
+msgid "Save"
 msgstr ""
 
-#: FBConnectSettings.php:178
-msgid "Couldn't delete link to Facebook."
+#: facebooksettings.php:133
+#, php-format
+msgid ""
+"If you would like %s to automatically update your Facebook status with your "
+"latest notice, you need to give it permission."
 msgstr ""
 
-#: FBConnectSettings.php:194
-msgid "You have disconnected from Facebook."
+#: facebooksettings.php:146
+#, php-format
+msgid "Allow %s to update my Facebook status"
 msgstr ""
 
-#: FBConnectSettings.php:197
-msgid "Not sure what you're trying to do."
+#: facebooksettings.php:156
+msgid "Sync preferences"
+msgstr ""
+
+#: facebookutil.php:285
+#, php-format
+msgid ""
+"Hi, %1$s. We're sorry to inform you that we are unable to update your "
+"Facebook status from %2$s, and have disabled the Facebook application for "
+"your account. This may be because you have removed the Facebook "
+"application's authorization, or have deleted your Facebook account.  You can "
+"re-enable the Facebook application and automatic status updating by re-"
+"installing the %2$s Facebook application.\n"
+"\n"
+"Regards,\n"
+"\n"
+"%2$s"
 msgstr ""
 
 #: FBConnectAuth.php:51
@@ -286,6 +234,10 @@ msgstr ""
 msgid "There is already a local user linked with this Facebook."
 msgstr ""
 
+#: FBConnectAuth.php:90 FBConnectSettings.php:164
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
 #: FBConnectAuth.php:95
 msgid "You can't register if you don't agree to the license."
 msgstr ""
@@ -385,10 +337,59 @@ msgstr ""
 msgid "Invalid username or password."
 msgstr ""
 
-#: FacebookPlugin.php:409 FacebookPlugin.php:429
-msgid "Facebook"
+#: FBConnectLogin.php:33
+msgid "Already logged in."
 msgstr ""
 
-#: FacebookPlugin.php:410
-msgid "Login or register using Facebook"
+#: FBConnectLogin.php:41
+msgid "Login with your Facebook Account"
+msgstr ""
+
+#: FBConnectLogin.php:55
+msgid "Facebook Login"
+msgstr ""
+
+#: FBConnectSettings.php:67
+msgid "Manage how your account connects to Facebook"
+msgstr ""
+
+#: FBConnectSettings.php:92
+msgid "There is no Facebook user connected to this account."
+msgstr ""
+
+#: FBConnectSettings.php:100
+msgid "Connected Facebook user"
+msgstr ""
+
+#: FBConnectSettings.php:119
+msgid "Disconnect my account from Facebook"
+msgstr ""
+
+#: FBConnectSettings.php:124
+msgid ""
+"Disconnecting your Faceboook would make it impossible to log in! Please "
+msgstr ""
+
+#: FBConnectSettings.php:128
+msgid "set a password"
+msgstr ""
+
+#: FBConnectSettings.php:130
+msgid " first."
+msgstr ""
+
+#: FBConnectSettings.php:142
+msgid "Disconnect"
+msgstr ""
+
+#: FBConnectSettings.php:178
+msgid "Couldn't delete link to Facebook."
+msgstr ""
+
+#: FBConnectSettings.php:194
+msgid "You have disconnected from Facebook."
+msgstr ""
+
+#: FBConnectSettings.php:197
+msgid "Not sure what you're trying to do."
 msgstr ""
index 1df62b6661aa43bfe92d226c1a1ca98c409d3a8d..d7275b9290816c43d0cae0daa8fb1f99a48b8bbb 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-11 16:27-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -59,3 +59,9 @@ msgstr ""
 #: GravatarPlugin.php:177
 msgid "Gravatar removed."
 msgstr ""
+
+#: GravatarPlugin.php:196
+msgid ""
+"The Gravatar plugin allows users to use their <a href=\"http://www.gravatar."
+"com/\">Gravatar</a> with StatusNet."
+msgstr ""
index 768f0fe7f6ea9353015d7a1102e8c4a92f3c189b..e0fd615ddaab89f959fbc93ad83f65c93f4d03e8 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---//
 
@@ -163,15 +189,14 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
         $entry = $this->ldap_get_user($username, $this->attributes);
         if(!$entry){
             //this really shouldn't happen
-            return $username;
+            $nickname = $username;
         }else{
             $nickname = $entry->getValue($this->attributes['nickname'],'single');
-            if($nickname){
-                return $nickname;
-            }else{
-                return $username;
+            if(!$nickname){
+                $nickname = $username;
             }
         }
+        return common_nicknamize($nickname);
     }
     
     //---utility functions---//
@@ -199,8 +224,7 @@ 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;
+            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..19aff42b8bb57a8a4e4c17677d6bc508ec3d3256 100644 (file)
@@ -167,7 +167,7 @@ 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());
+            throw new Exception('Could not connect to LDAP server: '.$err->getMessage());
             return false;
         }
         if($config == null) $this->default_ldap=$ldap;
@@ -185,6 +185,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
index c1c50bf5065ed6da9217a04061197fac307a483e..1dd5dbbcc921514b31e57ea60630117d8e94704c 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:38-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -34,15 +34,21 @@ msgstr ""
 msgid "User has no profile."
 msgstr ""
 
-#: usermap.php:71
-#, php-format
-msgid "%s map, page %d"
-msgstr ""
-
-#: MapstractionPlugin.php:180
+#: MapstractionPlugin.php:182
 msgid "Map"
 msgstr ""
 
-#: MapstractionPlugin.php:191
+#: MapstractionPlugin.php:193
 msgid "Full size"
 msgstr ""
+
+#: MapstractionPlugin.php:205
+msgid ""
+"Show maps of users' and friends' notices with <a href=\"http://www."
+"mapstraction.com/\">Mapstraction</a> JavaScript library."
+msgstr ""
+
+#: usermap.php:71
+#, php-format
+msgid "%s map, page %d"
+msgstr ""
index a33dfc7360a82e1ffd40be0df97019e402f46b65..b809c1b8e2e11d086af84e63eefd247966ce073b 100644 (file)
@@ -142,8 +142,6 @@ class MapAction extends OwnerDesignAction
         // of refactoring from within a plugin, so I'm just abusing
         // the ApiAction method. Don't do this unless you're me!
 
-        require_once(INSTALLDIR.'/lib/api.php');
-
         $act = new ApiAction('/dev/null');
 
         $arr = $act->twitterStatusArray($notice, true);
index cd2531fa727a8f3b7d4d2fd41ed645a8f3d4dc7d..f788639aed7383d7b7fe1ca2ec9042c2cc257f07 100644 (file)
@@ -312,8 +312,6 @@ class MobileProfilePlugin extends WAP20Plugin
             $connect = 'imsettings';
         } else if (common_config('sms', 'enabled')) {
             $connect = 'smssettings';
-        } else if (common_config('twitter', 'enabled')) {
-            $connect = 'twittersettings';
         }
 
         $action->elementStart('ul', array('id' => 'site_nav_global_primary'));
index 3686c0226d1398b471f314a072c59ad87fbe30a1..b69430ea78a74d890c90bc19ebfa38ea3fd8fa6e 100644 (file)
@@ -1,17 +1,7 @@
 <?php
-/*
-StatusNet Plugin: 0.9
-Plugin Name: FeedSub
-Plugin URI: http://status.net/wiki/Feed_subscription
-Description: FeedSub allows subscribing to real-time updates from external feeds supporting PubHubSubbub protocol.
-Version: 0.1
-Author: Brion Vibber <brion@status.net>
-Author URI: http://status.net/
-*/
-
 /*
  * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2009, StatusNet, Inc.
+ * Copyright (C) 2009-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
@@ -28,16 +18,13 @@ Author URI: http://status.net/
  */
 
 /**
- * @package FeedSubPlugin
+ * @package OStatusPlugin
  * @maintainer Brion Vibber <brion@status.net>
  */
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
-define('FEEDSUB_SERVICE', 100); // fixme -- avoid hardcoding these?
-
-// We bundle the XML_Parse_Feed library...
-set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib');
+set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/');
 
 class FeedSubException extends Exception
 {
@@ -56,8 +43,8 @@ class OStatusPlugin extends Plugin
         // Discovery actions
         $m->connect('.well-known/host-meta',
                     array('action' => 'hostmeta'));
-        $m->connect('main/webfinger',
-                    array('action' => 'webfinger'));
+        $m->connect('main/xrd',
+                    array('action' => 'xrd'));
         $m->connect('main/ostatus',
                     array('action' => 'ostatusinit'));
         $m->connect('main/ostatus?nickname=:nickname',
@@ -73,15 +60,13 @@ class OStatusPlugin extends Plugin
         $m->connect('main/push/callback/:feed',
                     array('action' => 'pushcallback'),
                     array('feed' => '[0-9]+'));
-        $m->connect('settings/feedsub',
-                    array('action' => 'feedsubsettings'));
 
         // Salmon endpoint
         $m->connect('main/salmon/user/:id',
-                    array('action' => 'salmon'),
+                    array('action' => 'usersalmon'),
                     array('id' => '[0-9]+'));
         $m->connect('main/salmon/group/:id',
-                    array('action' => 'salmongroup'),
+                    array('action' => 'groupsalmon'),
                     array('id' => '[0-9]+'));
         return true;
     }
@@ -93,9 +78,18 @@ class OStatusPlugin extends Plugin
      */
     function onEndInitializeQueueManager(QueueManager $qm)
     {
-        $qm->connect('hubverify', 'HubVerifyQueueHandler');
-        $qm->connect('hubdistrib', 'HubDistribQueueHandler');
+        // Prepare outgoing distributions after notice save.
+        $qm->connect('ostatus', 'OStatusQueueHandler');
+
+        // Outgoing from our internal PuSH hub
+        $qm->connect('hubconf', 'HubConfQueueHandler');
         $qm->connect('hubout', 'HubOutQueueHandler');
+
+        // Outgoing Salmon replies (when we don't need a return value)
+        $qm->connect('salmon', 'SalmonQueueHandler');
+
+        // Incoming from a foreign PuSH hub
+        $qm->connect('pushin', 'PushInQueueHandler');
         return true;
     }
 
@@ -104,29 +98,48 @@ class OStatusPlugin extends Plugin
      */
     function onStartEnqueueNotice($notice, &$transports)
     {
-        $transports[] = 'hubdistrib';
+        $transports[] = 'ostatus';
         return true;
     }
 
+    /**
+     * Add a link header for LRDD Discovery
+     */
+    function onStartShowHTML($action)
+    {
+        if ($action instanceof ShowstreamAction) {
+            $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server');
+            $url = common_local_url('xrd');
+            $url.= '?uri='. $acct;
+            
+            header('Link: <'.$url.'>; rel="'. Discovery::LRDD_REL.'"; type="application/xrd+xml"');
+        }
+    }
+    
     /**
      * Set up a PuSH hub link to our internal link for canonical timeline
      * Atom feeds for users and groups.
      */
-    function onStartApiAtom(AtomNoticeFeed $feed)
+    function onStartApiAtom($feed)
     {
         $id = null;
 
         if ($feed instanceof AtomUserNoticeFeed) {
-            $salmonAction = 'salmon';
-            $id = $feed->getUser()->id;
+            $salmonAction = 'usersalmon';
+            $user = $feed->getUser();
+            $id   = $user->id;
+            $profile = $user->getProfile();
+            $feed->setActivitySubject($profile->asActivityNoun('subject'));
         } else if ($feed instanceof AtomGroupNoticeFeed) {
-            $salmonAction = 'salmongroup';
-            $id = $feed->getGroup()->id;
+            $salmonAction = 'groupsalmon';
+            $group = $feed->getGroup();
+            $id = $group->id;
+            $feed->setActivitySubject($group->asActivitySubject());
         } else {
-            return;
+            return true;
         }
 
-       if (!empty($id)) {
+        if (!empty($id)) {
             $hub = common_config('ostatus', 'hub');
             if (empty($hub)) {
                 // Updates will be handled through our internal PuSH hub.
@@ -136,25 +149,9 @@ class OStatusPlugin extends Plugin
 
             // Also, we'll add in the salmon link
             $salmon = common_local_url($salmonAction, array('id' => $id));
-            $feed->addLink($salmon, array('rel' => 'salmon'));
+            $feed->addLink($salmon, array('rel' => Salmon::NS_REPLIES));
+            $feed->addLink($salmon, array('rel' => Salmon::NS_MENTIONS));
         }
-    }
-
-    /**
-     * Add the feed settings page to the Connect Settings menu
-     *
-     * @param Action &$action The calling page
-     *
-     * @return boolean hook return
-     */
-    function onEndConnectSettingsNav(&$action)
-    {
-        $action_name = $action->trimmed('action');
-
-        $action->menuItem(common_local_url('feedsubsettings'),
-                          _m('Feeds'),
-                          _m('Feed subscription options'),
-                          $action_name === 'feedsubsettings');
 
         return true;
     }
@@ -171,6 +168,12 @@ class OStatusPlugin extends Plugin
     {
         $base = dirname(__FILE__);
         $lower = strtolower($cls);
+        $map = array('activityverb' => 'activity',
+                     'activityobject' => 'activity',
+                     'activityutils' => 'activity');
+        if (isset($map[$lower])) {
+            $lower = $map[$lower];
+        }
         $files = array("$base/classes/$cls.php",
                        "$base/lib/$lower.php");
         if (substr($lower, -6) == 'action') {
@@ -213,60 +216,88 @@ class OStatusPlugin extends Plugin
      * @fixme push webfinger lookup & sending to a background queue
      * @fixme also detect short-form name for remote subscribees where not ambiguous
      */
+
     function onEndNoticeSave($notice)
     {
-        $count = preg_match_all('/(\w+\.)*\w+@(\w+\.)*\w+(\w+\-\w+)*\.\w+/', $notice->content, $matches);
-        if ($count) {
-            foreach ($matches[0] as $webfinger) {
-
-                // FIXME: look up locally first
-
-                // Check to see if we've got an actual webfinger
-                $w = new Webfinger;
+    }
 
-                $endpoint_uri = '';
+    /**
+     * Find any explicit remote mentions. Accepted forms:
+     *   Webfinger: @user@example.com
+     *   Profile link: @example.com/mublog/user
+     * @param Profile $sender (os user?)
+     * @param string $text input markup text
+     * @param array &$mention in/out param: set of found mentions
+     * @return boolean hook return value
+     */
 
-                $result = $w->lookup($webfinger);
-                if (empty($result)) {
-                    continue;
+    function onEndFindMentions($sender, $text, &$mentions)
+    {
+        preg_match_all('!(?:^|\s+)
+                        @(                                # Webfinger:
+                          (?:\w+\.)*\w+                   #   user
+                          @                               #   @
+                          (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ #   domain
+                         |                                # Profile:
+                          (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ #   domain
+                          (?:/\w+)+                       #   /path1(/path2...)
+                         )!x',
+                       $text,
+                       $wmatches,
+                       PREG_OFFSET_CAPTURE);
+
+        foreach ($wmatches[1] as $wmatch) {
+            $target = $wmatch[0];
+            $oprofile = null;
+
+            if (strpos($target, '/') === false) {
+                $this->log(LOG_INFO, "Checking Webfinger for address '$target'");
+                try {
+                    $oprofile = Ostatus_profile::ensureWebfinger($target);
+                } catch (Exception $e) {
+                    $this->log(LOG_ERR, "Webfinger check failed: " . $e->getMessage());
                 }
-
-                foreach ($result->links as $link) {
-                    if ($link['rel'] == 'salmon') {
-                        $endpoint_uri = $link['href'];
+            } else {
+                $schemes = array('https', 'http');
+                foreach ($schemes as $scheme) {
+                    $url = "$scheme://$target";
+                    $this->log(LOG_INFO, "Checking profile address '$url'");
+                    try {
+                        $oprofile = Ostatus_profile::ensureProfile($url);
+                        if ($oprofile) {
+                            continue;
+                        }
+                    } catch (Exception $e) {
+                        $this->log(LOG_ERR, "Profile check failed: " . $e->getMessage());
                     }
                 }
+            }
 
-                if (empty($endpoint_uri)) {
-                    continue;
-                }
+            if (empty($oprofile)) {
+                $this->log(LOG_INFO, "No Ostatus_profile found for address '$target'");
+            } else {
 
-                // FIXME: this needs to go out in a queue handler
+                $this->log(LOG_INFO, "Ostatus_profile found for address '$target'");
 
-                $xml = '<?xml version="1.0" encoding="UTF-8" ?>';
-                $xml .= $notice->asAtomEntry();
+                if ($oprofile->isGroup()) {
+                    continue;
+                }
+                $profile = $oprofile->localProfile();
 
-                $salmon = new Salmon();
-                $salmon->post($endpoint_uri, $xml);
+                $pos = $wmatch[1];
+                foreach ($mentions as $i => $other) {
+                    // If we share a common prefix with a local user, override it!
+                    if ($other['position'] == $pos) {
+                        unset($mentions[$i]);
+                    }
+                }
+                $mentions[] = array('mentioned' => array($profile),
+                                    'text' => $target,
+                                    'position' => $pos,
+                                    'url' => $profile->profileurl);
             }
         }
-    }
 
-    /**
-     * Garbage collect unused feeds on unsubscribe
-     */
-    function onEndUnsubscribe($user, $other)
-    {
-        $profile = Ostatus_profile::staticGet('profile_id', $other->id);
-        if ($feed) {
-            $sub = new Subscription();
-            $sub->subscribed = $other->id;
-            $sub->limit(1);
-            if (!$sub->find(true)) {
-                common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi");
-                $profile->unsubscribe();
-            }
-        }
         return true;
     }
 
@@ -276,7 +307,10 @@ class OStatusPlugin extends Plugin
     function onCheckSchema() {
         $schema = Schema::get();
         $schema->ensureTable('ostatus_profile', Ostatus_profile::schemaDef());
+        $schema->ensureTable('ostatus_source', Ostatus_source::schemaDef());
+        $schema->ensureTable('feedsub', FeedSub::schemaDef());
         $schema->ensureTable('hubsub', HubSub::schemaDef());
+        $schema->ensureTable('magicsig', Magicsig::schemaDef());
         return true;
     }
 
@@ -290,16 +324,459 @@ class OStatusPlugin extends Plugin
         return true;
     }
 
+    /**
+     * Override the "from ostatus" bit in notice lists to link to the
+     * original post and show the domain it came from.
+     *
+     * @param Notice in $notice
+     * @param string out &$name
+     * @param string out &$url
+     * @param string out &$title
+     * @return mixed hook return code
+     */
     function onStartNoticeSourceLink($notice, &$name, &$url, &$title)
     {
         if ($notice->source == 'ostatus') {
-            $bits = parse_url($notice->uri);
-            $domain = $bits['host'];
+            if ($notice->url) {
+                $bits = parse_url($notice->url);
+                $domain = $bits['host'];
+                if (substr($domain, 0, 4) == 'www.') {
+                    $name = substr($domain, 4);
+                } else {
+                    $name = $domain;
+                }
+
+                $url = $notice->url;
+                $title = sprintf(_m("Sent from %s via OStatus"), $domain);
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Send incoming PuSH feeds for OStatus endpoints in for processing.
+     *
+     * @param FeedSub $feedsub
+     * @param DOMDocument $feed
+     * @return mixed hook return code
+     */
+    function onStartFeedSubReceive($feedsub, $feed)
+    {
+        $oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri);
+        if ($oprofile) {
+            $oprofile->processFeed($feed, 'push');
+        } else {
+            common_log(LOG_DEBUG, "No ostatus profile for incoming feed $feedsub->uri");
+        }
+    }
+
+    /**
+     * When about to subscribe to a remote user, start a server-to-server
+     * PuSH subscription if needed. If we can't establish that, abort.
+     *
+     * @fixme If something else aborts later, we could end up with a stray
+     *        PuSH subscription. This is relatively harmless, though.
+     *
+     * @param Profile $subscriber
+     * @param Profile $other
+     *
+     * @return hook return code
+     *
+     * @throws Exception
+     */
+    function onStartSubscribe($subscriber, $other)
+    {
+        $user = User::staticGet('id', $subscriber->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $other->id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        if (!$oprofile->subscribe()) {
+            throw new Exception(_m('Could not set up remote subscription.'));
+        }
+    }
+
+    /**
+     * Having established a remote subscription, send a notification to the
+     * remote OStatus profile's endpoint.
+     *
+     * @param Profile $subscriber
+     * @param Profile $other
+     *
+     * @return hook return code
+     *
+     * @throws Exception
+     */
+    function onEndSubscribe($subscriber, $other)
+    {
+        $user = User::staticGet('id', $subscriber->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $other->id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        $act = new Activity();
+
+        $act->verb = ActivityVerb::FOLLOW;
+
+        $act->id   = TagURI::mint('follow:%d:%d:%s',
+                                  $subscriber->id,
+                                  $other->id,
+                                  common_date_iso8601(time()));
+
+        $act->time    = time();
+        $act->title   = _("Follow");
+        $act->content = sprintf(_("%s is now following %s."),
+                               $subscriber->getBestName(),
+                               $other->getBestName());
+
+        $act->actor   = ActivityObject::fromProfile($subscriber);
+        $act->object  = ActivityObject::fromProfile($other);
+
+        $oprofile->notifyActivity($act, $subscriber);
+
+        return true;
+    }
+
+    /**
+     * Notify remote server and garbage collect unused feeds on unsubscribe.
+     * @fixme send these operations to background queues
+     *
+     * @param User $user
+     * @param Profile $other
+     * @return hook return value
+     */
+    function onEndUnsubscribe($profile, $other)
+    {
+        $user = User::staticGet('id', $profile->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $other->id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        // Drop the PuSH subscription if there are no other subscribers.
+        $oprofile->garbageCollect();
+
+        $act = new Activity();
+
+        $act->verb = ActivityVerb::UNFOLLOW;
 
-            $name = $domain;
-            $url = $notice->uri;
-            $title = sprintf(_m("Sent from %s via OStatus"), $domain);
+        $act->id   = TagURI::mint('unfollow:%d:%d:%s',
+                                  $profile->id,
+                                  $other->id,
+                                  common_date_iso8601(time()));
+
+        $act->time    = time();
+        $act->title   = _("Unfollow");
+        $act->content = sprintf(_("%s stopped following %s."),
+                               $profile->getBestName(),
+                               $other->getBestName());
+
+        $act->actor   = ActivityObject::fromProfile($profile);
+        $act->object  = ActivityObject::fromProfile($other);
+
+        $oprofile->notifyActivity($act, $profile);
+
+        return true;
+    }
+
+    /**
+     * When one of our local users tries to join a remote group,
+     * notify the remote server. If the notification is rejected,
+     * deny the join.
+     *
+     * @param User_group $group
+     * @param User $user
+     *
+     * @return mixed hook return value
+     */
+
+    function onStartJoinGroup($group, $user)
+    {
+        $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+        if ($oprofile) {
+            if (!$oprofile->subscribe()) {
+                throw new Exception(_m('Could not set up remote group membership.'));
+            }
+
+            $member = Profile::staticGet($user->id);
+
+            $act = new Activity();
+            $act->id = TagURI::mint('join:%d:%d:%s',
+                                    $member->id,
+                                    $group->id,
+                                    common_date_iso8601(time()));
+
+            $act->actor = ActivityObject::fromProfile($member);
+            $act->verb = ActivityVerb::JOIN;
+            $act->object = $oprofile->asActivityObject();
+
+            $act->time = time();
+            $act->title = _m("Join");
+            $act->content = sprintf(_m("%s has joined group %s."),
+                                    $member->getBestName(),
+                                    $oprofile->getBestName());
+
+            if ($oprofile->notifyActivity($act, $member)) {
+                return true;
+            } else {
+                $oprofile->garbageCollect();
+                throw new Exception(_m("Failed joining remote group."));
+            }
+        }
+    }
+
+    /**
+     * When one of our local users leaves a remote group, notify the remote
+     * server.
+     *
+     * @fixme Might be good to schedule a resend of the leave notification
+     * if it failed due to a transitory error. We've canceled the local
+     * membership already anyway, but if the remote server comes back up
+     * it'll be left with a stray membership record.
+     *
+     * @param User_group $group
+     * @param User $user
+     *
+     * @return mixed hook return value
+     */
+
+    function onEndLeaveGroup($group, $user)
+    {
+        $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+        if ($oprofile) {
+            // Drop the PuSH subscription if there are no other subscribers.
+            $oprofile->garbageCollect();
+
+
+            $member = Profile::staticGet($user->id);
+
+            $act = new Activity();
+            $act->id = TagURI::mint('leave:%d:%d:%s',
+                                    $member->id,
+                                    $group->id,
+                                    common_date_iso8601(time()));
+
+            $act->actor = ActivityObject::fromProfile($member);
+            $act->verb = ActivityVerb::LEAVE;
+            $act->object = $oprofile->asActivityObject();
+
+            $act->time = time();
+            $act->title = _m("Leave");
+            $act->content = sprintf(_m("%s has left group %s."),
+                                    $member->getBestName(),
+                                    $oprofile->getBestName());
+
+            $oprofile->notifyActivity($act, $member);
+        }
+    }
+
+    /**
+     * Notify remote users when their notices get favorited.
+     *
+     * @param Profile or User $profile of local user doing the faving
+     * @param Notice $notice being favored
+     * @return hook return value
+     */
+
+    function onEndFavorNotice(Profile $profile, Notice $notice)
+    {
+        $user = User::staticGet('id', $profile->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        $act = new Activity();
+
+        $act->verb = ActivityVerb::FAVORITE;
+        $act->id   = TagURI::mint('favor:%d:%d:%s',
+                                  $profile->id,
+                                  $notice->id,
+                                  common_date_iso8601(time()));
+
+        $act->time    = time();
+        $act->title   = _("Favor");
+        $act->content = sprintf(_("%s marked notice %s as a favorite."),
+                               $profile->getBestName(),
+                               $notice->uri);
+
+        $act->actor   = ActivityObject::fromProfile($profile);
+        $act->object  = ActivityObject::fromNotice($notice);
+
+        $oprofile->notifyActivity($act, $profile);
+
+        return true;
+    }
+
+    /**
+     * Notify remote users when their notices get de-favorited.
+     *
+     * @param Profile $profile Profile person doing the de-faving
+     * @param Notice  $notice  Notice being favored
+     *
+     * @return hook return value
+     */
+
+    function onEndDisfavorNotice(Profile $profile, Notice $notice)
+    {
+        $user = User::staticGet('id', $profile->id);
+
+        if (empty($user)) {
+            return true;
+        }
+
+        $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id);
+
+        if (empty($oprofile)) {
+            return true;
+        }
+
+        $act = new Activity();
+
+        $act->verb = ActivityVerb::UNFAVORITE;
+        $act->id   = TagURI::mint('disfavor:%d:%d:%s',
+                                  $profile->id,
+                                  $notice->id,
+                                  common_date_iso8601(time()));
+        $act->time    = time();
+        $act->title   = _("Disfavor");
+        $act->content = sprintf(_("%s marked notice %s as no longer a favorite."),
+                               $profile->getBestName(),
+                               $notice->uri);
+
+        $act->actor   = ActivityObject::fromProfile($profile);
+        $act->object  = ActivityObject::fromNotice($notice);
+
+        $oprofile->notifyActivity($act, $profile);
+
+        return true;
+    }
+
+    function onStartGetProfileUri($profile, &$uri)
+    {
+        $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id);
+        if (!empty($oprofile)) {
+            $uri = $oprofile->uri;
+            return false;
+        }
+        return true;
+    }
+
+    function onStartUserGroupHomeUrl($group, &$url)
+    {
+        return $this->onStartUserGroupPermalink($group, $url);
+    }
+
+    function onStartUserGroupPermalink($group, &$url)
+    {
+        $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+        if ($oprofile) {
+            // @fixme this should probably be in the user_group table
+            // @fixme this uri not guaranteed to be a profile page
+            $url = $oprofile->uri;
             return false;
         }
     }
+
+    function onStartShowSubscriptionsContent($action)
+    {
+        $this->showEntityRemoteSubscribe($action);
+
+        return true;
+    }
+
+    function onStartShowAllContent($action)
+    {
+        $this->showEntityRemoteSubscribe($action);
+
+        return true;
+    }
+
+    function showEntityRemoteSubscribe($action)
+    {
+        $user = common_current_user();
+        if ($user && ($user->id == $action->profile->id)) {
+            $action->elementStart('div', 'entity_actions');
+            $action->elementStart('p', array('id' => 'entity_remote_subscribe',
+                                             'class' => 'entity_subscribe'));
+            $action->element('a', array('href' => common_local_url('ostatussub'),
+                                        'class' => 'entity_remote_subscribe')
+                                , _m('Subscribe to remote user'));
+            $action->elementEnd('p');
+            $action->elementEnd('div');
+        }
+    }
+
+    /**
+     * Ping remote profiles with updates to this profile.
+     * Salmon pings are queued for background processing.
+     */
+    function onEndBroadcastProfile(Profile $profile)
+    {
+        $user = User::staticGet('id', $profile->id);
+
+        // Find foreign accounts I'm subscribed to that support Salmon pings.
+        //
+        // @fixme we could run updates through the PuSH feed too,
+        // in which case we can skip Salmon pings to folks who
+        // are also subscribed to me.
+        $sql = "SELECT * FROM ostatus_profile " .
+               "WHERE profile_id IN " .
+               "(SELECT subscribed FROM subscription WHERE subscriber=%d) " .
+               "OR group_id IN " .
+               "(SELECT group_id FROM group_member WHERE profile_id=%d)";
+        $oprofile = new Ostatus_profile();
+        $oprofile->query(sprintf($sql, $profile->id, $profile->id));
+
+        if ($oprofile->N == 0) {
+            common_log(LOG_DEBUG, "No OStatus remote subscribees for $profile->nickname");
+            return true;
+        }
+
+        $act = new Activity();
+
+        $act->verb = ActivityVerb::UPDATE_PROFILE;
+        $act->id   = TagURI::mint('update-profile:%d:%s',
+                                  $profile->id,
+                                  common_date_iso8601(time()));
+        $act->time    = time();
+        $act->title   = _m("Profile update");
+        $act->content = sprintf(_m("%s has updated their profile page."),
+                               $profile->getBestName());
+
+        $act->actor   = ActivityObject::fromProfile($profile);
+        $act->object  = $act->actor;
+
+        while ($oprofile->fetch()) {
+            $oprofile->notifyDeferred($act, $profile);
+        }
+
+        return true;
+    }
 }
index cbf3adbb9c095d9c422c6fa8472e117f160044e1..3a98b7b256b131067896838c819ce07c97529e7f 100644 (file)
@@ -2,23 +2,33 @@ Plugin to support importing updates from external RSS and Atom feeds into your t
 
 Uses PubSubHubbub for push feed updates; currently non-PuSH feeds cannot be subscribed.
 
+Configuration options available:
+
+$config['ostatus']['hub']
+    (default internal hub)
+    Set to URL of an external PuSH hub to use it instead of our internal hub.
+
+$config['ostatus']['hub_retries']
+    (default 0)
+    Number of times to retry a PuSH send to consumers if using internal hub
+
+
+For testing, shouldn't be used in production:
+
+$config['ostatus']['skip_signatures']
+    (default use signatures)
+    Disable generation and validation of Salmon magicenv signatures
+
+$config['feedsub']['nohub']
+    (default require hub)
+    Allow low-level feed subscription setup for feeds without hubs.
+    Not actually usable at this stage, OStatus will check for hubs too
+    and we have no polling backend.
+
+
 Todo:
-* set feed icon avatar for actual profiles as well as for preview
-* use channel image and/or favicon for avatar?
-* garbage-collect subscriptions that are no longer being used
-* administrative way to kill feeds?
-* functional l10n
-* clean up subscription form look and workflow
-* use ajax for test/preview in subscription form
-* rssCloud support? (Does anything use it that doesn't support PuSH as well?)
-* possibly a polling daemon to support non-PuSH feeds?
-* likely problems with multiple feeds from the same site, such as category feeds on a blog
-  (currently each feed would publish a separate notice on a separate profile, but pointing to the same post URI.)
-  (could use the local URI I guess, but that's so icky!)
-* problems with Atom feeds that list <link rel="alternate" href="..."/> but don't have the type
-  (such as http://atomgen.appspot.com/feed/5 demo feed); currently it's not recognized and we end up with the feed's master URI
-* make it easier to see what you're subscribed to and unsub from things
-* saner treatment of fullname/nickname?
+* fully functional l10n
+* redo non-OStatus feed support
+** rssCloud support?
+** possibly a polling daemon to support non-PuSH feeds?
 * make use of tags/categories from feeds
-* update feed profile data when it changes
-* XML_Feed_Parser has major problems with category and link tags; consider replacing?
diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php
deleted file mode 100644 (file)
index 6933c9b..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @package FeedSubPlugin
- * @maintainer Brion Vibber <brion@status.net>
- */
-
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
-
-class FeedSubSettingsAction extends ConnectSettingsAction
-{
-    protected $feedurl;
-    protected $preview;
-    protected $munger;
-
-    /**
-     * Title of the page
-     *
-     * @return string Title of the page
-     */
-
-    function title()
-    {
-        return _m('Feed subscriptions');
-    }
-
-    /**
-     * Instructions for use
-     *
-     * @return instructions for use
-     */
-
-    function getInstructions()
-    {
-        return _m('You can subscribe to feeds from other sites; ' .
-                  'updates will appear in your personal timeline.');
-    }
-
-    /**
-     * Content area of the page
-     *
-     * Shows a form for associating a Twitter account with this
-     * StatusNet account. Also lets the user set preferences.
-     *
-     * @return void
-     */
-
-    function showContent()
-    {
-        $user = common_current_user();
-
-        $profile = $user->getProfile();
-
-        $fuser = null;
-
-        $flink = Foreign_link::getByUserID($user->id, FEEDSUB_SERVICE);
-
-        if (!empty($flink)) {
-            $fuser = $flink->getForeignUser();
-        }
-
-        $this->elementStart('form', array('method' => 'post',
-                                          'id' => 'form_settings_feedsub',
-                                          'class' => 'form_settings',
-                                          'action' =>
-                                          common_local_url('feedsubsettings')));
-
-        $this->hidden('token', common_session_token());
-
-        $this->elementStart('fieldset', array('id' => 'settings_feeds'));
-
-        $this->elementStart('ul', 'form_data');
-        $this->elementStart('li', array('id' => 'settings_twitter_login_button'));
-        $this->input('feedurl', _('Feed URL'), $this->feedurl, _('Enter the URL of a PubSubHubbub-enabled feed'));
-        $this->elementEnd('li');
-        $this->elementEnd('ul');
-
-        if ($this->preview) {
-            $this->submit('subscribe', _m('Subscribe'));
-        } else {
-            $this->submit('validate', _m('Continue'));
-        }
-
-        $this->elementEnd('fieldset');
-
-        $this->elementEnd('form');
-
-        if ($this->preview) {
-            $this->previewFeed();
-        }
-    }
-
-    /**
-     * Handle posts to this form
-     *
-     * Based on the button that was pressed, muxes out to other functions
-     * to do the actual task requested.
-     *
-     * All sub-functions reload the form with a message -- success or failure.
-     *
-     * @return void
-     */
-
-    function handlePost()
-    {
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            $this->showForm(_('There was a problem with your session token. '.
-                              'Try again, please.'));
-            return;
-        }
-
-        if ($this->arg('validate')) {
-            $this->validateAndPreview();
-        } else if ($this->arg('subscribe')) {
-            $this->saveFeed();
-        } else {
-            $this->showForm(_('Unexpected form submission.'));
-        }
-    }
-
-    /**
-     * Set up and add a feed
-     *
-     * @return boolean true if feed successfully read
-     * Sends you back to input form if not.
-     */
-    function validateFeed()
-    {
-        $feedurl = trim($this->arg('feedurl'));
-        
-        if ($feedurl == '') {
-            $this->showForm(_m('Empty feed URL!'));
-            return;
-        }
-        $this->feedurl = $feedurl;
-        
-        // Get the canonical feed URI and check it
-        try {
-            $discover = new FeedDiscovery();
-            $uri = $discover->discoverFromURL($feedurl);
-        } catch (FeedSubBadURLException $e) {
-            $this->showForm(_m('Invalid URL or could not reach server.'));
-            return false;
-        } catch (FeedSubBadResponseException $e) {
-            $this->showForm(_m('Cannot read feed; server returned error.'));
-            return false;
-        } catch (FeedSubEmptyException $e) {
-            $this->showForm(_m('Cannot read feed; server returned an empty page.'));
-            return false;
-        } catch (FeedSubBadHTMLException $e) {
-            $this->showForm(_m('Bad HTML, could not find feed link.'));
-            return false;
-        } catch (FeedSubNoFeedException $e) {
-            $this->showForm(_m('Could not find a feed linked from this URL.'));
-            return false;
-        } catch (FeedSubUnrecognizedTypeException $e) {
-            $this->showForm(_m('Not a recognized feed type.'));
-            return false;
-        } catch (FeedSubException $e) {
-            // Any new ones we forgot about
-            $this->showForm(_m('Bad feed URL.'));
-            return false;
-        }
-        
-        $this->munger = $discover->feedMunger();
-        $this->profile = $this->munger->ostatusProfile();
-
-        if ($this->profile->huburi == '' && !common_config('feedsub', 'nohub')) {
-            $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.'));
-            return false;
-        }
-        
-        return true;
-    }
-
-    function saveFeed()
-    {
-        if ($this->validateFeed()) {
-            $this->preview = true;
-            $this->profile = Ostatus_profile::ensureProfile($this->munger);
-            if (!$this->profile) {
-                throw new ServerException("Feed profile was not saved properly.");
-            }
-
-            // If not already in use, subscribe to updates via the hub
-            if ($this->profile->sub_start) {
-                common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->profile->feeduri} last subbed {$this->profile->sub_start}");
-            } else {
-                $ok = $this->profile->subscribe();
-                common_log(LOG_INFO, __METHOD__ . ": sub was $ok");
-                if (!$ok) {
-                    $this->showForm(_m('Feed subscription failed! Bad response from hub.'));
-                    return;
-                }
-            }
-
-            // And subscribe the current user to the local profile
-            $user = common_current_user();
-
-            if ($this->profile->isGroup()) {
-                $group = $this->profile->localGroup();
-                if ($user->isMember($group)) {
-                    $this->showForm(_m('Already a member!'));
-                } elseif (Group_member::join($this->profile->group_id, $user->id)) {
-                    $this->showForm(_m('Joined remote group!'));
-                } else {
-                    $this->showForm(_m('Remote group join failed!'));
-                }
-            } else {
-                $local = $this->profile->localProfile();
-                if ($user->isSubscribed($local)) {
-                    $this->showForm(_m('Already subscribed!'));
-                } elseif ($user->subscribeTo($local)) {
-                    $this->showForm(_m('Feed subscribed!'));
-                } else {
-                    $this->showForm(_m('Feed subscription failed!'));
-                }
-            }
-        }
-    }
-
-    function validateAndPreview()
-    {
-        if ($this->validateFeed()) {
-            $this->preview = true;
-            $this->showForm(_m('Previewing feed:'));
-        }
-    }
-
-    function previewFeed()
-    {
-        $profile = $this->munger->ostatusProfile();
-        $notice = $this->munger->notice(0, true); // preview
-
-        if ($notice) {
-            $this->element('b', null, 'Preview of latest post from this feed:');
-
-            $item = new NoticeList($notice, $this);
-            $item->show();
-        } else {
-            $this->element('b', null, 'No posts in this feed yet.');
-        }
-    }
-
-    function showScripts()
-    {
-        parent::showScripts();
-        $this->autofocus('feedurl');
-    }
-}
diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php
new file mode 100644 (file)
index 0000000..29377b5
--- /dev/null
@@ -0,0 +1,188 @@
+<?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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @author James Walker <james@status.net>
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class GroupsalmonAction extends SalmonAction
+{
+    var $group = null;
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $id = $this->trimmed('id');
+
+        if (!$id) {
+            $this->clientError(_('No ID.'));
+        }
+
+        $this->group = User_group::staticGet('id', $id);
+
+        if (empty($this->group)) {
+            $this->clientError(_('No such group.'));
+        }
+
+        $oprofile = Ostatus_profile::staticGet('group_id', $id);
+        if ($oprofile) {
+            $this->clientError(_m("Can't accept remote posts for a remote group."));
+        }
+
+        return true;
+    }
+
+    /**
+     * We've gotten a post event on the Salmon backchannel, probably a reply.
+     */
+
+    function handlePost()
+    {
+        switch ($this->act->object->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.");
+        }
+
+        // Notice must be to the attention of this group
+
+        $context = $this->act->context;
+
+        if (empty($context->attention)) {
+            throw new ClientException("Not to the attention of anyone.");
+        } else {
+            $uri = common_local_url('groupbyid', array('id' => $this->group->id));
+            if (!in_array($uri, $context->attention)) {
+                throw new ClientException("Not to the attention of this group.");
+            }
+        }
+
+        $profile = $this->ensureProfile();
+        $this->saveNotice();
+    }
+
+    /**
+     * We've gotten a follow/subscribe notification from a remote user.
+     * Save a subscription relationship for them.
+     */
+
+    /**
+     * Postel's law: consider a "follow" notification as a "join".
+     */
+    function handleFollow()
+    {
+        $this->handleJoin();
+    }
+
+    /**
+     * Postel's law: consider an "unfollow" notification as a "leave".
+     */
+    function handleUnfollow()
+    {
+        $this->handleLeave();
+    }
+
+    /**
+     * A remote user joined our group.
+     * @fixme move permission checks and event call into common code,
+     *        currently we're doing the main logic in joingroup action
+     *        and so have to repeat it here.
+     */
+
+    function handleJoin()
+    {
+        $oprofile = $this->ensureProfile();
+        if (!$oprofile) {
+            $this->clientError(_m("Can't read profile to set up group membership."));
+        }
+        if ($oprofile->isGroup()) {
+            $this->clientError(_m("Groups can't join groups."));
+        }
+
+        common_log(LOG_INFO, "Remote profile {$oprofile->uri} joining local group {$this->group->nickname}");
+        $profile = $oprofile->localProfile();
+
+        if ($profile->isMember($this->group)) {
+            // Already a member; we'll take it silently to aid in resolving
+            // inconsistencies on the other side.
+            return true;
+        }
+
+        if (Group_block::isBlocked($this->group, $profile)) {
+            $this->clientError(_('You have been blocked from that group by the admin.'), 403);
+            return false;
+        }
+
+        try {
+            // @fixme that event currently passes a user from main UI
+            // Event should probably move into Group_member::join
+            // and take a Profile object.
+            //
+            //if (Event::handle('StartJoinGroup', array($this->group, $profile))) {
+                Group_member::join($this->group->id, $profile->id);
+                //Event::handle('EndJoinGroup', array($this->group, $profile));
+            //}
+        } catch (Exception $e) {
+            $this->serverError(sprintf(_m('Could not join remote user %1$s to group %2$s.'),
+                                       $oprofile->uri, $this->group->nickname));
+        }
+    }
+
+    /**
+     * A remote user left our group.
+     */
+
+    function handleLeave()
+    {
+        $oprofile = $this->ensureProfile();
+        if (!$oprofile) {
+            $this->clientError(_m("Can't read profile to cancel group membership."));
+        }
+        if ($oprofile->isGroup()) {
+            $this->clientError(_m("Groups can't join groups."));
+        }
+
+        common_log(LOG_INFO, "Remote profile {$oprofile->uri} leaving local group {$this->group->nickname}");
+        $profile = $oprofile->localProfile();
+
+        try {
+            // @fixme event needs to be refactored as above
+            //if (Event::handle('StartLeaveGroup', array($this->group, $profile))) {
+                Group_member::leave($this->group->id, $profile->id);
+                //Event::handle('EndLeaveGroup', array($this->group, $profile));
+            //}
+        } catch (Exception $e) {
+            $this->serverError(sprintf(_m('Could not remove remote user %1$s from group %2$s.'),
+                                       $oprofile->uri, $this->group->nickname));
+            return;
+        }
+    }
+
+}
index 850b8a0fe89d47bab373327abab797db13dbc5b9..3d00b98ae0d359687380fbdbe5cf4c27e1466244 100644 (file)
@@ -31,12 +31,18 @@ class HostMetaAction extends Action
     {
         parent::handle();
 
-        $w = new Webfinger();
-
-
         $domain = common_config('site', 'server');
-        $url = common_local_url('webfinger');
+        $url = common_local_url('xrd');
         $url.= '?uri={uri}';
-        print $w->getHostMeta($domain, $url);
+
+        $xrd = new XRD();
+        
+        $xrd = new XRD();
+        $xrd->host = $domain;
+        $xrd->links[] = array('rel' => Discovery::LRDD_REL,
+                              'template' => $url,
+                              'title' => array('Resource Descriptor'));
+
+        print $xrd->toXML();
     }
 }
index d21774420dd4c984d7a894bffe707663ade6cf13..8ba8dcdcc7514ae18dd84fcd02f9f9e51fce7260 100644 (file)
@@ -29,7 +29,7 @@ class OStatusInitAction extends Action
 {
 
     var $nickname;
-    var $acct;
+    var $profile;
     var $err;
 
     function prepare($args)
@@ -37,12 +37,15 @@ class OStatusInitAction extends Action
         parent::prepare($args);
 
         if (common_logged_in()) {
-            $this->clientError(_('You can use the local subscription!'));
+            $this->clientError(_m('You can use the local subscription!'));
             return false;
         }
 
-        $this->nickname    = $this->trimmed('nickname');
-        $this->acct = $this->trimmed('acct');
+        // Local user the remote wants to subscribe to
+        $this->nickname = $this->trimmed('nickname');
+        
+        // Webfinger or profile URL of the remote user
+        $this->profile = $this->trimmed('profile');
 
         return true;
     }
@@ -55,7 +58,7 @@ class OStatusInitAction extends Action
             /* Use a session token for CSRF protection. */
             $token = $this->trimmed('token');
             if (!$token || $token != common_session_token()) {
-                $this->showForm(_('There was a problem with your session token. '.
+                $this->showForm(_m('There was a problem with your session token. '.
                                   'Try again, please.'));
                 return;
             }
@@ -73,7 +76,7 @@ class OStatusInitAction extends Action
             $this->xw->startDocument('1.0', 'UTF-8');
             $this->elementStart('html');
             $this->elementStart('head');
-            $this->element('title', null, _('Subscribe to user'));
+            $this->element('title', null, _m('Subscribe to user'));
             $this->elementEnd('head');
             $this->elementStart('body');
             $this->showContent();
@@ -91,50 +94,81 @@ class OStatusInitAction extends Action
                                           'class' => 'form_settings',
                                           'action' => common_local_url('ostatusinit')));
         $this->elementStart('fieldset');
-        $this->element('legend', null,  sprintf(_('Subscribe to %s'), $this->nickname));
+        $this->element('legend', null,  sprintf(_m('Subscribe to %s'), $this->nickname));
         $this->hidden('token', common_session_token());
 
         $this->elementStart('ul', 'form_data');
         $this->elementStart('li', array('id' => 'ostatus_nickname'));
-        $this->input('nickname', _('User nickname'), $this->nickname,
-                     _('Nickname of the user you want to follow'));
+        $this->input('nickname', _m('User nickname'), $this->nickname,
+                     _m('Nickname of the user you want to follow'));
         $this->elementEnd('li');
         $this->elementStart('li', array('id' => 'ostatus_profile'));
-        $this->input('acct', _('Profile Account'), $this->acct,
-                     _('Your account id (i.e. user@identi.ca)'));
+        $this->input('profile', _m('Profile Account'), $this->profile,
+                     _m('Your account id (i.e. user@identi.ca)'));
         $this->elementEnd('li');
         $this->elementEnd('ul');
-        $this->submit('submit', _('Subscribe'));
+        $this->submit('submit', _m('Subscribe'));
         $this->elementEnd('fieldset');
         $this->elementEnd('form');
     }
 
     function ostatusConnect()
     {
-      $w = new Webfinger;
+        $opts = array('allowed_schemes' => array('http', 'https', 'acct'));
+        if (Validate::uri($this->profile, $opts)) {
+            $bits = parse_url($this->profile);
+            if ($bits['scheme'] == 'acct') {
+                $this->connectWebfinger($bits['path']);
+            } else {
+                $this->connectProfile($this->profile);
+            }
+        } elseif (strpos($this->profile, '@') !== false) {
+            $this->connectWebfinger($this->profile);
+        } else {
+            $this->clientError(_m("Must provide a remote profile."));
+        }
+    }
 
-      $result = $w->lookup($this->acct);
-      foreach ($result->links as $link) {
-          if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') {
-              // We found a URL - let's redirect!
+    function connectWebfinger($acct)
+    {
+        $disco = new Discovery;
 
-              $user = User::staticGet('nickname', $this->nickname);
+        $result = $disco->lookup($acct);
+        if (!$result) {
+            $this->clientError(_m("Couldn't look up OStatus account profile."));
+        }
+        foreach ($result->links as $link) {
+            if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') {
+                // We found a URL - let's redirect!
 
-              $feed_url = common_local_url('ApiTimelineUser',
-                                           array('id' => $user->id,
-                                                 'format' => 'atom'));
-              $url = $w->applyTemplate($link['template'], $feed_url);
+                $user = User::staticGet('nickname', $this->nickname);
+                $target_profile = common_local_url('userbyid', array('id' => $user->id));
 
-              common_redirect($url, 303);
-          }
+                $url = Discovery::applyTemplate($link['template'], $target_profile);
+                common_log(LOG_INFO, "Sending remote subscriber $acct to $url");
+                common_redirect($url, 303);
+            }
 
-      }
-      
+        }
+        $this->clientError(_m("Couldn't confirm remote profile address."));
     }
-    
+
+    function connectProfile($subscriber_profile)
+    {
+        $user = User::staticGet('nickname', $this->nickname);
+        $target_profile = common_local_url('userbyid', array('id' => $user->id));
+
+        // @fixme hack hack! We should look up the remote sub URL from XRDS
+        $suburl = preg_replace('!^(.*)/(.*?)$!', '$1/main/ostatussub', $subscriber_profile);
+        $suburl .= '?profile=' . urlencode($target_profile);
+
+        common_log(LOG_INFO, "Sending remote subscriber $subscriber_profile to $suburl");
+        common_redirect($suburl, 303);
+    }
+
     function title()
     {
-      return _('OStatus Connect');  
+      return _m('OStatus Connect');  
     }
   
 }
index 23912250163f0330585ff737bb6bc2c893aa46b5..e318701a24f7e84b71cdde5bae2ce3b626a046f4 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2010, StatusNet, Inc.
+ * Copyright (C) 2009, StatusNet, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
 
 /**
  * @package OStatusPlugin
- * @maintainer James Walker <james@status.net>
+ * @maintainer Brion Vibber <brion@status.net>
  */
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
+/**
+ * Key UI methods:
+ *
+ *  showInputForm() - form asking for a remote profile account or URL
+ *                    We end up back here on errors
+ *
+ *  showPreviewForm() - surrounding form for preview-and-confirm
+ *    previewUser() - display profile for a remote user
+ *    previewGroup() - display profile for a remote group
+ *
+ *  successUser() - redirects to subscriptions page on subscribe
+ *  successGroup() - redirects to groups page on join
+ */
 class OStatusSubAction extends Action
 {
+    protected $profile_uri; // provided acct: or URI of remote entity
+    protected $oprofile; // Ostatus_profile of remote entity, if valid
 
-    protected $feedurl;
-    
-    function title()
-    {
-        return _m("OStatus Subscribe");
-    }
-
-    function handle($args)
-    {
-        if ($this->validateFeed()) {
-            $this->showForm();
-        }
-
-        return true;
-
-    }
-
-    function showForm($err = null)
-    {
-        $this->err = $err;
-        $this->showPage();
-    }
-
-
-    function showContent()
+    /**
+     * Show the initial form, when we haven't yet been given a valid
+     * remote profile.
+     */
+    function showInputForm()
     {
         $user = common_current_user();
 
         $profile = $user->getProfile();
 
-        $fuser = null;
-
-        $flink = Foreign_link::getByUserID($user->id, FEEDSUB_SERVICE);
-
-        if (!empty($flink)) {
-            $fuser = $flink->getForeignUser();
-        }
-
         $this->elementStart('form', array('method' => 'post',
-                                          'id' => 'form_settings_feedsub',
+                                          'id' => 'form_ostatus_sub',
                                           'class' => 'form_settings',
                                           'action' =>
-                                          common_local_url('feedsubsettings')));
+                                          common_local_url('ostatussub')));
 
         $this->hidden('token', common_session_token());
 
@@ -77,150 +64,440 @@ class OStatusSubAction extends Action
 
         $this->elementStart('ul', 'form_data');
         $this->elementStart('li');
-        $this->input('feedurl', _('Feed URL'), $this->feedurl, _('Enter the URL of a PubSubHubbub-enabled feed'));
+        $this->input('profile',
+                     _m('Address or profile URL'),
+                     $this->profile_uri,
+                     _m('Enter the profile URL of a PubSubHubbub-enabled feed'));
         $this->elementEnd('li');
         $this->elementEnd('ul');
 
-        $this->submit('subscribe', _m('Subscribe'));
+        $this->submit('validate', _m('Continue'));
 
         $this->elementEnd('fieldset');
 
         $this->elementEnd('form');
-
-        $this->previewFeed();
     }
 
     /**
-     * Handle posts to this form
-     *
-     * Based on the button that was pressed, muxes out to other functions
-     * to do the actual task requested.
-     *
-     * All sub-functions reload the form with a message -- success or failure.
+     * Show the preview-and-confirm form. We've got a valid remote
+     * profile and are ready to poke it!
      *
-     * @return void
+     * This controls the wrapper form; actual profile display will
+     * be in previewUser() or previewGroup() depending on the type.
      */
-
-    function handlePost()
+    function showPreviewForm()
     {
-        // CSRF protection
-        $token = $this->trimmed('token');
-        if (!$token || $token != common_session_token()) {
-            $this->showForm(_('There was a problem with your session token. '.
-                              'Try again, please.'));
+        if ($this->oprofile->isGroup()) {
+            $ok = $this->previewGroup();
+        } else {
+            $ok = $this->previewUser();
+        }
+        if (!$ok) {
+            // @fixme maybe provide a cancel button or link back?
             return;
         }
 
-        if ($this->arg('subscribe')) {
-            $this->saveFeed();
+        $this->elementStart('div', 'entity_actions');
+        $this->elementStart('ul');
+        $this->elementStart('li', 'entity_subscribe');
+        $this->elementStart('form', array('method' => 'post',
+                                          'id' => 'form_ostatus_sub',
+                                          'class' => 'form_remote_authorize',
+                                          'action' =>
+                                          common_local_url('ostatussub')));
+        $this->elementStart('fieldset');
+        $this->hidden('token', common_session_token());
+        $this->hidden('profile', $this->profile_uri);
+        if ($this->oprofile->isGroup()) {
+            $this->submit('submit', _m('Join'), 'submit', null,
+                         _m('Join this group'));
         } else {
-            $this->showForm(_('Unexpected form submission.'));
+            $this->submit('submit', _m('Confirm'), 'submit', null,
+                         _m('Subscribe to this user'));
         }
+        $this->elementEnd('fieldset');
+        $this->elementEnd('form');
+        $this->elementEnd('li');
+        $this->elementEnd('ul');
+        $this->elementEnd('div');
+    }
+
+    /**
+     * Show a preview for a remote user's profile
+     * @return boolean true if we're ok to try subscribing
+     */
+    function previewUser()
+    {
+        $oprofile = $this->oprofile;
+        $profile = $oprofile->localProfile();
+
+        $cur = common_current_user();
+        if ($cur->isSubscribed($profile)) {
+            $this->element('div', array('class' => 'error'),
+                           _m("You are already subscribed to this user."));
+            $ok = false;
+        } else {
+            $ok = true;
+        }
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        $avatarUrl = $avatar ? $avatar->displayUrl() : false;
+
+        $this->showEntity($profile,
+                          $profile->profileurl,
+                          $avatarUrl,
+                          $profile->bio);
+        return $ok;
+    }
+
+    /**
+     * Show a preview for a remote group's profile
+     * @return boolean true if we're ok to try joining
+     */
+    function previewGroup()
+    {
+        $oprofile = $this->oprofile;
+        $group = $oprofile->localGroup();
+
+        $cur = common_current_user();
+        if ($cur->isMember($group)) {
+            $this->element('div', array('class' => 'error'),
+                           _m("You are already a member of this group."));
+            $ok = false;
+        } else {
+            $ok = true;
+        }
+
+        $this->showEntity($group,
+                          $group->getProfileUrl(),
+                          $group->homepage_logo,
+                          $group->description);
+        return $ok;
+    }
+
+
+    function showEntity($entity, $profile, $avatar, $note)
+    {
+        $nickname = $entity->nickname;
+        $fullname = $entity->fullname;
+        $homepage = $entity->homepage;
+        $location = $entity->location;
+        
+        if (!$avatar) {
+            $avatar = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
+        }
+
+        $this->elementStart('div', 'entity_profile vcard');
+        $this->elementStart('dl', 'entity_depiction');
+        $this->element('dt', null, _('Photo'));
+        $this->elementStart('dd');
+        $this->element('img', array('src' => $avatar,
+                                    'class' => 'photo avatar',
+                                    'width' => AVATAR_PROFILE_SIZE,
+                                    'height' => AVATAR_PROFILE_SIZE,
+                                    'alt' => $nickname));
+        $this->elementEnd('dd');
+        $this->elementEnd('dl');
+
+        $this->elementStart('dl', 'entity_nickname');
+        $this->element('dt', null, _('Nickname'));
+        $this->elementStart('dd');
+        $hasFN = ($fullname !== '') ? 'nickname' : 'fn nickname';
+        $this->elementStart('a', array('href' => $profile,
+                                       'class' => 'url '.$hasFN));
+        $this->raw($nickname);
+        $this->elementEnd('a');
+        $this->elementEnd('dd');
+        $this->elementEnd('dl');
+
+        if (!is_null($fullname)) {
+            $this->elementStart('dl', 'entity_fn');
+            $this->elementStart('dd');
+            $this->elementStart('span', 'fn');
+            $this->raw($fullname);
+            $this->elementEnd('span');
+            $this->elementEnd('dd');
+            $this->elementEnd('dl');
+        }
+        if (!is_null($location)) {
+            $this->elementStart('dl', 'entity_location');
+            $this->element('dt', null, _('Location'));
+            $this->elementStart('dd', 'label');
+            $this->raw($location);
+            $this->elementEnd('dd');
+            $this->elementEnd('dl');
+        }
+
+        if (!is_null($homepage)) {
+            $this->elementStart('dl', 'entity_url');
+            $this->element('dt', null, _('URL'));
+            $this->elementStart('dd');
+            $this->elementStart('a', array('href' => $homepage,
+                                                'class' => 'url'));
+            $this->raw($homepage);
+            $this->elementEnd('a');
+            $this->elementEnd('dd');
+            $this->elementEnd('dl');
+        }
+
+        if (!is_null($note)) {
+            $this->elementStart('dl', 'entity_note');
+            $this->element('dt', null, _('Note'));
+            $this->elementStart('dd', 'note');
+            $this->raw($note);
+            $this->elementEnd('dd');
+            $this->elementEnd('dl');
+        }
+        $this->elementEnd('div');
+    }
+
+    /**
+     * Redirect on successful remote user subscription
+     */
+    function successUser()
+    {
+        $cur = common_current_user();
+        $url = common_local_url('subscriptions', array('nickname' => $cur->nickname));
+        common_redirect($url, 303);
+    }
+
+    /**
+     * Redirect on successful remote group join
+     */
+    function successGroup()
+    {
+        $cur = common_current_user();
+        $url = common_local_url('usergroups', array('nickname' => $cur->nickname));
+        common_redirect($url, 303);
     }
 
-    
     /**
-     * Set up and add a feed
+     * Pull data for a remote profile and check if it's valid.
+     * Fills out error UI string in $this->error
+     * Fills out $this->oprofile on success.
      *
-     * @return boolean true if feed successfully read
-     * Sends you back to input form if not.
+     * @return boolean
      */
     function validateFeed()
     {
-        $feedurl = $this->trimmed('feed');
-        
-        if ($feedurl == '') {
-            $this->showForm(_m('Empty feed URL!'));
+        $profile_uri = trim($this->arg('profile'));
+
+        if ($profile_uri == '') {
+            $this->showForm(_m('Empty remote profile URL!'));
             return;
         }
-        $this->feedurl = $feedurl;
-        
-        // Get the canonical feed URI and check it
+        $this->profile_uri = $profile_uri;
+
         try {
-            $discover = new FeedDiscovery();
-            $uri = $discover->discoverFromURL($feedurl);
+            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);
+            } else {
+                $this->error = _m("Invalid address format.");
+                return false;
+            }
+            return true;
         } catch (FeedSubBadURLException $e) {
-            $this->showForm(_m('Invalid URL or could not reach server.'));
-            return false;
+            $this->error = _m('Invalid URL or could not reach server.');
         } catch (FeedSubBadResponseException $e) {
-            $this->showForm(_m('Cannot read feed; server returned error.'));
-            return false;
+            $this->error = _m('Cannot read feed; server returned error.');
         } catch (FeedSubEmptyException $e) {
-            $this->showForm(_m('Cannot read feed; server returned an empty page.'));
-            return false;
+            $this->error = _m('Cannot read feed; server returned an empty page.');
         } catch (FeedSubBadHTMLException $e) {
-            $this->showForm(_m('Bad HTML, could not find feed link.'));
-            return false;
+            $this->error = _m('Bad HTML, could not find feed link.');
         } catch (FeedSubNoFeedException $e) {
-            $this->showForm(_m('Could not find a feed linked from this URL.'));
-            return false;
+            $this->error = _m('Could not find a feed linked from this URL.');
         } catch (FeedSubUnrecognizedTypeException $e) {
-            $this->showForm(_m('Not a recognized feed type.'));
-            return false;
+            $this->error = _m('Not a recognized feed type.');
         } catch (FeedSubException $e) {
             // Any new ones we forgot about
-            $this->showForm(_m('Bad feed URL.'));
-            return false;
+            $this->error = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage());
         }
-        
-        $this->munger = $discover->feedMunger();
-        $this->profile = $this->munger->ostatusProfile();
 
-        if ($this->profile->huburi == '') {
-            $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.'));
-            return false;
-        }
-        
-        return true;
+        return false;
     }
 
+    /**
+     * Attempt to finalize subscription.
+     * validateFeed must have been run first.
+     *
+     * Calls showForm on failure or successUser/successGroup on success.
+     */
     function saveFeed()
     {
-        if ($this->validateFeed()) {
-            $this->preview = true;
-            $this->profile = Ostatus_profile::ensureProfile($this->munger);
+        // And subscribe the current user to the local profile
+        $user = common_current_user();
 
-            // If not already in use, subscribe to updates via the hub
-            if ($this->profile->sub_start) {
-                common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->profile->feeduri} last subbed {$this->profile->sub_start}");
-            } else {
-                $ok = $this->profile->subscribe();
-                common_log(LOG_INFO, __METHOD__ . ": sub was $ok");
-                if (!$ok) {
-                    $this->showForm(_m('Feed subscription failed! Bad response from hub.'));
-                    return;
+        if ($this->oprofile->isGroup()) {
+            $group = $this->oprofile->localGroup();
+            if ($user->isMember($group)) {
+                // TRANS: OStatus remote group subscription dialog error.
+                $this->showForm(_m('Already a member!'));
+                return;
+            }
+            if (Event::handle('StartJoinGroup', array($group, $user))) {
+                $ok = Group_member::join($this->oprofile->group_id, $user->id);
+                if ($ok) {
+                    Event::handle('EndJoinGroup', array($group, $user));
+                    $this->successGroup();
+                } else {
+                    // TRANS: OStatus remote group subscription dialog error.
+                    $this->showForm(_m('Remote group join failed!'));
                 }
+            } else {
+                // TRANS: OStatus remote group subscription dialog error.
+                $this->showForm(_m('Remote group join aborted!'));
             }
-            
-            // And subscribe the current user to the local profile
-            $user = common_current_user();
-            $profile = $this->profile->getProfile();
-            
-            if ($user->isSubscribed($profile)) {
+        } else {
+            $local = $this->oprofile->localProfile();
+            if ($user->isSubscribed($local)) {
+                // TRANS: OStatus remote subscription dialog error.
                 $this->showForm(_m('Already subscribed!'));
-            } elseif ($user->subscribeTo($profile)) {
-                $this->showForm(_m('Feed subscribed!'));
+            } elseif ($this->oprofile->subscribeLocalToRemote($user)) {
+                $this->successUser();
             } else {
-                $this->showForm(_m('Feed subscription failed!'));
+                // TRANS: OStatus remote subscription dialog error.
+                $this->showForm(_m('Remote subscription failed!'));
+            }
+        }
+    }
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if (!common_logged_in()) {
+            // XXX: selfURL() didn't work. :<
+            common_set_returnto($_SERVER['REQUEST_URI']);
+            if (Event::handle('RedirectToLogin', array($this, null))) {
+                common_redirect(common_local_url('login'), 303);
+            }
+            return false;
+        }
+
+        $this->profile_uri = $this->arg('profile');
+
+        return true;
+    }
+
+    /**
+     * Handle the submission.
+     */
+    function handle($args)
+    {
+        parent::handle($args);
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->handlePost();
+        } else {
+            if ($this->arg('profile')) {
+                $this->validateFeed();
             }
+            $this->showForm();
         }
     }
 
-    
-    function previewFeed()
+
+    /**
+     * Handle posts to this form
+     *
+     * @return void
+     */
+
+    function handlePost()
     {
-        $profile = $this->munger->ostatusProfile();
-        $notice = $this->munger->notice(0, true); // preview
+        // CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->showForm(_('There was a problem with your session token. '.
+                              'Try again, please.'));
+            return;
+        }
 
-        if ($notice) {
-            $this->element('b', null, 'Preview of latest post from this feed:');
+        if ($this->validateFeed()) {
+            if ($this->arg('submit')) {
+                $this->saveFeed();
+                return;
+            }
+        }
+        $this->showForm();
+    }
 
-            $item = new NoticeList($notice, $this);
-            $item->show();
+    /**
+     * Show the appropriate form based on our input state.
+     */
+    function showForm($err=null)
+    {
+        if ($err) {
+            $this->error = $err;
+        }
+        if ($this->boolean('ajax')) {
+            header('Content-Type: text/xml;charset=utf-8');
+            $this->xw->startDocument('1.0', 'UTF-8');
+            $this->elementStart('html');
+            $this->elementStart('head');
+            $this->element('title', null, _m('Subscribe to user'));
+            $this->elementEnd('head');
+            $this->elementStart('body');
+            $this->showContent();
+            $this->elementEnd('body');
+            $this->elementEnd('html');
         } else {
-            $this->element('b', null, 'No posts in this feed yet.');
+            $this->showPage();
+        }
+    }
+
+    /**
+     * Title of the page
+     *
+     * @return string Title of the page
+     */
+
+    function title()
+    {
+        // TRANS: Page title for OStatus remote subscription form
+        return _m('Authorize subscription');
+    }
+
+    /**
+     * Instructions for use
+     *
+     * @return instructions for use
+     */
+
+    function getInstructions()
+    {
+        return _m('You can subscribe to users from other supported sites. Paste their address or profile URI below:');
+    }
+
+    function showPageNotice()
+    {
+        if (!empty($this->error)) {
+            $this->element('p', 'error', $this->error);
         }
     }
 
+    /**
+     * Content area of the page
+     *
+     * Shows a form for associating a remote OStatus account with this
+     * StatusNet account.
+     *
+     * @return void
+     */
+
+    function showContent()
+    {
+        if ($this->oprofile) {
+            $this->showPreviewForm();
+        } else {
+            $this->showInputForm();
+        }
+    }
 
+    function showScripts()
+    {
+        parent::showScripts();
+        $this->autofocus('feedurl');
+    }
 }
index 388c8f9c3dad2976f2232b8ef772f5dbc6d32e31..9a2067b8ca0725e5b8ffa201add9bc4fedf4ba03 100644 (file)
@@ -29,6 +29,7 @@ class PushCallbackAction extends Action
 {
     function handle()
     {
+        StatusNet::setApi(true); // Minimize error messages to aid in debugging
         parent::handle();
         if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             $this->handlePost();
@@ -48,9 +49,9 @@ class PushCallbackAction extends Action
             throw new ServerException('Empty or invalid feed id', 400);
         }
 
-        $profile = Ostatus_profile::staticGet('id', $feedid);
-        if (!$profile) {
-            throw new ServerException('Unknown OStatus/PuSH feed id ' . $feedid, 400);
+        $feedsub = FeedSub::staticGet('id', $feedid);
+        if (!$feedsub) {
+            throw new ServerException('Unknown PuSH feed id ' . $feedid, 400);
         }
 
         $hmac = '';
@@ -60,13 +61,18 @@ class PushCallbackAction extends Action
 
         $post = file_get_contents('php://input');
 
-        // @fixme Queue this to a background process; we should return
+        // Queue this to a background process; we should return
         // as quickly as possible from a distribution POST.
-        $profile->postUpdates($post, $hmac);
+        // If queues are disabled this'll process immediately.
+        $data = array('feedsub_id' => $feedsub->id,
+                      'post' => $post,
+                      'hmac' => $hmac);
+        $qm = QueueManager::get();
+        $qm->enqueue($data, 'pushin');
     }
     
     /**
-     * Handler for GET verification requests from the hub
+     * Handler for GET verification requests from the hub.
      */
     function handleGet()
     {
@@ -75,35 +81,41 @@ class PushCallbackAction extends Action
         $challenge = $this->arg('hub_challenge');
         $lease_seconds = $this->arg('hub_lease_seconds');
         $verify_token = $this->arg('hub_verify_token');
-        
+
         if ($mode != 'subscribe' && $mode != 'unsubscribe') {
-            common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with mode \"$mode\"");
-            throw new ServerException("Bogus hub callback: bad mode", 404);
+            throw new ClientException("Bad hub.mode $mode", 404);
         }
-        
-        $profile = Ostatus_profile::staticGet('feeduri', $topic);
-        if (!$profile) {
-            common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic");
-            throw new ServerException("Bogus hub callback: unknown feed", 404);
+
+        $feedsub = FeedSub::staticGet('uri', $topic);
+        if (!$feedsub) {
+            throw new ClientException("Bad hub.topic feed $topic", 404);
         }
 
-        if ($profile->verify_token !== $verify_token) {
-            common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic");
-            throw new ServerError("Bogus hub callback: bad token", 404);
+        if ($feedsub->verify_token !== $verify_token) {
+            throw new ClientException("Bad hub.verify_token $token for $topic", 404);
         }
 
-        if ($mode != $profile->sub_state) {
-            common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$profile->sub_state}\"");
-            throw new ServerException("Bogus hub callback: mode doesn't match subscription state.", 404);
+        if ($mode == 'subscribe') {
+            // We may get re-sub requests legitimately.
+            if ($feedsub->sub_state != 'subscribe' && $feedsub->sub_state != 'active') {
+                throw new ClientException("Unexpected subscribe request for $topic.", 404);
+            }
+        } else {
+            if ($feedsub->sub_state != 'unsubscribe') {
+                throw new ClientException("Unexpected unsubscribe request for $topic.", 404);
+            }
         }
 
-        // OK!
         if ($mode == 'subscribe') {
-            common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
-            $profile->confirmSubscribe($lease_seconds);
+            if ($feedsub->sub_state == 'active') {
+                common_log(LOG_INFO, __METHOD__ . ': sub update confirmed');
+            } else {
+                common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
+            }
+            $feedsub->confirmSubscribe($lease_seconds);
         } else {
             common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic");
-            $profile->confirmUnsubscribe();
+            $feedsub->confirmUnsubscribe();
         }
         print $challenge;
     }
index 13ec09d52871634b3bb864742bc038994923b564..842d65e7d29d9eac29518249560aa98c3e37a7e7 100644 (file)
@@ -59,99 +59,121 @@ class PushHubAction extends Action
         $mode = $this->trimmed('hub.mode');
         switch ($mode) {
         case "subscribe":
-            $this->subscribe();
-            break;
         case "unsubscribe":
-            $this->unsubscribe();
+            $this->subunsub($mode);
             break;
         case "publish":
-            throw new ServerException("Publishing outside feeds not supported.", 400);
+            throw new ClientException("Publishing outside feeds not supported.", 400);
         default:
-            throw new ServerException("Unrecognized mode '$mode'.", 400);
+            throw new ClientException("Unrecognized mode '$mode'.", 400);
         }
     }
 
     /**
-     * Process a PuSH feed subscription request.
+     * Process a request for a new or modified PuSH feed subscription.
+     * If asynchronous verification is requested, updates won't be saved immediately.
      *
      * HTTP return codes:
      *   202 Accepted - request saved and awaiting verification
      *   204 No Content - already subscribed
-     *   403 Forbidden - rejecting this (not specifically spec'd)
+     *   400 Bad Request - rejecting this (not specifically spec'd)
      */
-    function subscribe()
+    function subunsub($mode)
     {
-        $feed = $this->argUrl('hub.topic');
         $callback = $this->argUrl('hub.callback');
 
-        common_log(LOG_DEBUG, __METHOD__ . ": checking sub'd to $feed $callback");
-        if ($this->getSub($feed, $callback)) {
-            // Already subscribed; return 204 per spec.
-            header('HTTP/1.1 204 No Content');
-            common_log(LOG_DEBUG, __METHOD__ . ': already subscribed');
-            return;
+        $topic = $this->argUrl('hub.topic');
+        if (!$this->recognizedFeed($topic)) {
+            throw new ClientException("Unsupported hub.topic $topic; this hub only serves local user and group Atom feeds.");
         }
 
-        common_log(LOG_DEBUG, __METHOD__ . ': setting up');
-        $sub = new HubSub();
-        $sub->topic = $feed;
-        $sub->callback = $callback;
-        $sub->verify_token = $this->arg('hub.verify_token', null);
-        $sub->secret = $this->arg('hub.secret', null);
-        if (strlen($sub->secret) > 200) {
-            throw new ClientException("hub.secret must be no longer than 200 chars", 400);
+        $verify = $this->arg('hub.verify'); // @fixme may be multiple
+        if ($verify != 'sync' && $verify != 'async') {
+            throw new ClientException("Invalid hub.verify $verify; must be sync or async.");
         }
-        $sub->setLease(intval($this->arg('hub.lease_seconds')));
 
-        // @fixme check for feeds we don't manage
-        // @fixme check the verification mode, might want a return immediately?
+        $lease = $this->arg('hub.lease_seconds', null);
+        if ($mode == 'subscribe' && $lease != '' && !preg_match('/^\d+$/', $lease)) {
+            throw new ClientException("Invalid hub.lease $lease; must be empty or positive integer.");
+        }
 
-        common_log(LOG_DEBUG, __METHOD__ . ': inserting');
-        $ok = $sub->insert();
-        
-        if (!$ok) {
-            throw new ServerException("Failed to save subscription record", 500);
+        $token = $this->arg('hub.verify_token', null);
+
+        $secret = $this->arg('hub.secret', null);
+        if ($secret != '' && strlen($secret) >= 200) {
+            throw new ClientException("Invalid hub.secret $secret; must be under 200 bytes.");
         }
 
-        // @fixme check errors ;)
+        $sub = HubSub::staticGet($topic, $callback);
+        if (!$sub) {
+            // Creating a new one!
+            $sub = new HubSub();
+            $sub->topic = $topic;
+            $sub->callback = $callback;
+        }
+        if ($mode == 'subscribe') {
+            if ($secret) {
+                $sub->secret = $secret;
+            }
+            if ($lease) {
+                $sub->setLease(intval($lease));
+            }
+        }
 
-        $data = array('sub' => $sub, 'mode' => 'subscribe');
-        $qm = QueueManager::get();
-        $qm->enqueue($data, 'hubverify');
-        
-        header('HTTP/1.1 202 Accepted');
-        common_log(LOG_DEBUG, __METHOD__ . ': done');
+        if (!common_config('queue', 'enabled')) {
+            // Won't be able to background it.
+            $verify = 'sync';
+        }
+        if ($verify == 'async') {
+            $sub->scheduleVerify($mode, $token);
+            header('HTTP/1.1 202 Accepted');
+        } else {
+            $sub->verify($mode, $token);
+            header('HTTP/1.1 204 No Content');
+        }
     }
 
     /**
-     * Process a PuSH feed unsubscription request.
+     * Check whether the given URL represents one of our canonical
+     * user or group Atom feeds.
      *
-     * HTTP return codes:
-     *   202 Accepted - request saved and awaiting verification
-     *   204 No Content - already subscribed
-     *   400 Bad Request - invalid params or rejected feed
+     * @param string $feed URL
+     * @return boolean true if it matches
      */
-    function unsubscribe()
+    function recognizedFeed($feed)
     {
-        $feed = $this->argUrl('hub.topic');
-        $callback = $this->argUrl('hub.callback');
-        $sub = $this->getSub($feed, $callback);
-        
-        if ($sub) {
-            if ($sub->verify('unsubscribe')) {
-                $sub->delete();
-                common_log(LOG_INFO, "PuSH unsubscribed $feed for $callback");
-            } else {
-                throw new ServerException("Failed PuSH unsubscription: verification failed! $feed for $callback");
+        $matches = array();
+        if (preg_match('!/(\d+)\.atom$!', $feed, $matches)) {
+            $id = $matches[1];
+            $params = array('id' => $id, 'format' => 'atom');
+            $userFeed = common_local_url('ApiTimelineUser', $params);
+            $groupFeed = common_local_url('ApiTimelineGroup', $params);
+
+            if ($feed == $userFeed) {
+                $user = User::staticGet('id', $id);
+                if (!$user) {
+                    throw new ClientException("Invalid hub.topic $feed; user doesn't exist.");
+                } else {
+                    return true;
+                }
             }
-        } else {
-            throw new ServerException("Failed PuSH unsubscription: not subscribed! $feed for $callback");
+            if ($feed == $groupFeed) {
+                $user = User_group::staticGet('id', $id);
+                if (!$user) {
+                    throw new ClientException("Invalid hub.topic $feed; group doesn't exist.");
+                } else {
+                    return true;
+                }
+            }
+            common_log(LOG_DEBUG, "Not a user or group feed? $feed $userFeed $groupFeed");
         }
+        common_log(LOG_DEBUG, "LOST $feed");
+        return false;
     }
 
     /**
      * Grab and validate a URL from POST parameters.
-     * @throws ServerException for malformed or non-http/https URLs
+     * @throws ClientException for malformed or non-http/https URLs
      */
     protected function argUrl($arg)
     {
@@ -161,7 +183,7 @@ class PushHubAction extends Action
         if (Validate::uri($url, $params)) {
             return $url;
         } else {
-            throw new ServerException("Invalid URL passed for $arg: '$url'", 400);
+            throw new ClientException("Invalid URL passed for $arg: '$url'");
         }
     }
 
diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php
deleted file mode 100644 (file)
index c79d09c..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?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/>.
- */
-
-/**
- * @package OStatusPlugin
- * @author James Walker <james@status.net>
- */
-
-if (!defined('STATUSNET')) {
-    exit(1);
-}
-
-class SalmonAction extends Action
-{
-    var $user     = null;
-    var $xml      = null;
-    var $activity = null;
-
-    function prepare($args)
-    {
-        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-            $this->clientError(_('This method requires a POST.'));
-        }
-
-        if ($_SERVER['CONTENT_TYPE'] != 'application/atom+xml') {
-            $this->clientError(_('Salmon requires application/atom+xml'));
-        }
-
-        $id = $this->trimmed('id');
-
-        if (!$id) {
-            $this->clientError(_('No ID.'));
-        }
-
-        $this->user = User::staticGet($id);
-
-        if (empty($this->user)) {
-            $this->clientError(_('No such user.'));
-        }
-
-        $xml = file_get_contents('php://input');
-
-        $dom = DOMDocument::loadXML($xml);
-
-        // XXX: check that document element is Atom entry
-        // XXX: check the signature
-
-        $this->act = new Activity($dom->documentElement);
-    }
-
-    function handle($args)
-    {
-        common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id);
-
-        // TODO : Insert new $xml -> notice code
-
-        switch ($this->act->verb)
-        {
-        case Activity::POST:
-        case Activity::SHARE:
-        case Activity::FAVORITE:
-        case Activity::FOLLOW:
-        }
-    }
-}
diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php
new file mode 100644 (file)
index 0000000..c8a16e0
--- /dev/null
@@ -0,0 +1,212 @@
+<?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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @author James Walker <james@status.net>
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class UsersalmonAction extends SalmonAction
+{
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $id = $this->trimmed('id');
+
+        if (!$id) {
+            $this->clientError(_('No ID.'));
+        }
+
+        $this->user = User::staticGet('id', $id);
+
+        if (empty($this->user)) {
+            $this->clientError(_('No such user.'));
+        }
+
+        return true;
+    }
+
+    /**
+     * We've gotten a post event on the Salmon backchannel, probably a reply.
+     *
+     * @todo validate if we need to handle this post, then call into
+     * ostatus_profile's general incoming-post handling.
+     */
+    function handlePost()
+    {
+        common_log(LOG_INFO, "Received post of '{$this->act->object->id}' from '{$this->act->actor->id}'");
+
+        switch ($this->act->object->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.");
+        }
+
+        // Notice must either be a) in reply to a notice by this user
+        // or b) to the attention of this user
+
+        $context = $this->act->context;
+
+        if (!empty($context->replyToID)) {
+            $notice = Notice::staticGet('uri', $context->replyToID);
+            if (empty($notice)) {
+                throw new ClientException("In reply to unknown notice");
+            }
+            if ($notice->profile_id != $this->user->id) {
+                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)) {
+                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!");
+            }
+        } else {
+            throw new ClientException("Not to anyone in reply to anything!");
+        }
+
+        $existing = Notice::staticGet('uri', $this->act->object->id);
+
+        if (!empty($existing)) {
+            common_log(LOG_ERR, "Not saving notice '{$existing->uri}'; already exists.");
+            return;
+        }
+
+        $this->saveNotice();
+    }
+
+    /**
+     * We've gotten a follow/subscribe notification from a remote user.
+     * Save a subscription relationship for them.
+     */
+
+    function handleFollow()
+    {
+        $oprofile = $this->ensureProfile();
+        if ($oprofile) {
+            common_log(LOG_INFO, "Setting up subscription from remote {$oprofile->uri} to local {$this->user->nickname}");
+            Subscription::start($oprofile->localProfile(),
+                                $this->user->getProfile());
+        } else {
+            common_log(LOG_INFO, "Can't set up subscription from remote; missing profile.");
+        }
+    }
+
+    /**
+     * We've gotten an unfollow/unsubscribe notification from a remote user.
+     * Check if we have a subscription relationship for them and kill it.
+     *
+     * @fixme probably catch exceptions on fail?
+     */
+    function handleUnfollow()
+    {
+        $oprofile = $this->ensureProfile();
+        if ($oprofile) {
+            common_log(LOG_INFO, "Canceling subscription from remote {$oprofile->uri} to local {$this->user->nickname}");
+            Subscription::cancel($oprofile->localProfile(), $this->user->getProfile());
+        } else {
+            common_log(LOG_ERR, "Can't cancel subscription from remote, didn't find the profile");
+        }
+    }
+
+    /**
+     * Remote user likes one of our posts.
+     * Confirm the post is ours, and save a local favorite event.
+     */
+
+    function handleFavorite()
+    {
+        $notice = $this->getNotice($this->act->object);
+        $profile = $this->ensureProfile()->localProfile();
+
+        $old = Fave::pkeyGet(array('user_id' => $profile->id,
+                                   'notice_id' => $notice->id));
+
+        if (!empty($old)) {
+            throw new ClientException("We already know that's a fave!");
+        }
+
+        if (!Fave::addNew($profile, $notice)) {
+            throw new ClientException("Could not save new favorite.");
+        }
+    }
+
+    /**
+     * Remote user doesn't like one of our posts after all!
+     * Confirm the post is ours, and save a local favorite event.
+     */
+    function handleUnfavorite()
+    {
+        $notice = $this->getNotice($this->act->object);
+        $profile = $this->ensureProfile()->localProfile();
+
+        $fave = Fave::pkeyGet(array('user_id' => $profile->id,
+                                   'notice_id' => $notice->id));
+        if (empty($fave)) {
+            throw new ClientException("Notice wasn't favorited!");
+        }
+
+        $fave->delete();
+    }
+
+    /**
+     * @param ActivityObject $object
+     * @return Notice
+     * @throws ClientException on invalid input
+     */
+    function getNotice($object)
+    {
+        if (!$object) {
+            throw new ClientException("Can't favorite/unfavorite without an object.");
+        }
+
+        switch ($object->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 object for liking/faving.");
+        }
+
+        $notice = Notice::staticGet('uri', $object->id);
+
+        if (empty($notice)) {
+            throw new ClientException("Notice with ID $object->id unknown.");
+        }
+
+        if ($notice->profile_id != $this->user->id) {
+            throw new ClientException("Notice with ID $object->id not posted by $this->user->id.");
+        }
+
+        return $notice;
+    }
+
+}
diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php
deleted file mode 100644 (file)
index 75ba166..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?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/>.
- */
-
-/**
- * @package OStatusPlugin
- * @maintainer James Walker <james@status.net>
- */
-
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
-
-class WebfingerAction extends Action
-{
-
-    public $uri;
-
-    function prepare($args)
-    {
-        parent::prepare($args);
-
-        $this->uri = $this->trimmed('uri');
-
-        return true;
-    }
-        
-    function handle()
-    {
-        $acct = Webfinger::normalize($this->uri);
-
-        $xrd = new XRD();
-
-        list($nick, $domain) = explode('@', urldecode($acct));
-        $nick = common_canonical_nickname($nick);
-
-        $this->user = User::staticGet('nickname', $nick);
-        if (!$this->user) {
-            $this->clientError(_('No such user.'), 404);
-            return false;
-        }
-
-        $xrd->subject = $this->uri;
-        $xrd->alias[] = common_profile_url($nick);
-        $xrd->links[] = array('rel' => 'http://webfinger.net/rel/profile-page',
-                              'type' => 'text/html',
-                              'href' => common_profile_url($nick));
-
-        $salmon_url = common_local_url('salmon',
-                                       array('id' => $this->user->id));
-
-        $xrd->links[] = array('rel' => 'salmon',
-                              'href' => $salmon_url);
-        
-        // TODO - finalize where the redirect should go on the publisher
-        $url = common_local_url('ostatussub') . '?feed={uri}';
-        $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe',
-                              'template' => $url );
-
-        header('Content-type: text/xml');
-        print $xrd->toXML();
-    }
-
-}
diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php
new file mode 100644 (file)
index 0000000..f574b60
--- /dev/null
@@ -0,0 +1,113 @@
+<?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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @maintainer James Walker <james@status.net>
+ */
+
+if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+
+class XrdAction extends Action
+{
+
+    public $uri;
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        $this->uri = $this->trimmed('uri');
+
+        return true;
+    }
+
+    function handle()
+    {
+        $acct = Discovery::normalize($this->uri);
+
+        $xrd = new XRD();
+
+        list($nick, $domain) = explode('@', substr(urldecode($acct), 5));
+        $nick = common_canonical_nickname($nick);
+
+        $this->user = User::staticGet('nickname', $nick);
+        if (!$this->user) {
+            $this->clientError(_('No such user.'), 404);
+            return false;
+        }
+
+        $xrd->subject = $this->uri;
+        $xrd->alias[] = common_profile_url($nick);
+        $xrd->links[] = array('rel' => Discovery::PROFILEPAGE,
+                              'type' => 'text/html',
+                              'href' => common_profile_url($nick));
+
+        $xrd->links[] = array('rel' => Discovery::UPDATESFROM,
+                              'href' => common_local_url('ApiTimelineUser',
+                                                         array('id' => $this->user->id,
+                                                               'format' => 'atom')),
+                              'type' => 'application/atom+xml');
+
+        // hCard
+        $xrd->links[] = array('rel' => Discovery::HCARD,
+                              'type' => 'text/html',
+                              'href' => common_local_url('hcard', array('nickname' => $nick)));
+
+        // XFN
+        $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11',
+                              'type' => 'text/html',
+                              'href' => common_profile_url($nick));
+        // FOAF
+        $xrd->links[] = array('rel' => 'describedby',
+                              'type' => 'application/rdf+xml',
+                              'href' => common_local_url('foaf',
+                                                         array('nickname' => $nick)));
+
+        // Salmon
+        $salmon_url = common_local_url('usersalmon',
+                                       array('id' => $this->user->id));
+
+        $xrd->links[] = array('rel' => Salmon::NS_REPLIES,
+                              'href' => $salmon_url);
+
+        $xrd->links[] = array('rel' => Salmon::NS_MENTIONS,
+                              'href' => $salmon_url);
+
+        // Get this user's keypair
+        $magickey = Magicsig::staticGet('user_id', $this->user->id);
+        if (!$magickey) {
+            // No keypair yet, let's generate one.
+            $magickey = new Magicsig();
+            $magickey->generate($this->user->id);
+        }
+
+        $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL,
+                              '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}';
+        $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe',
+                              'template' => $url );
+
+        header('Content-type: text/xml');
+        print $xrd->toXML();
+    }
+
+}
diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php
new file mode 100644 (file)
index 0000000..b848b6b
--- /dev/null
@@ -0,0 +1,452 @@
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009-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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @maintainer Brion Vibber <brion@status.net>
+ */
+
+/*
+PuSH subscription flow:
+
+    $profile->subscribe()
+        generate random verification token
+            save to verify_token
+        sends a sub request to the hub...
+
+    main/push/callback
+        hub sends confirmation back to us via GET
+        We verify the request, then echo back the challenge.
+        On our end, we save the time we subscribed and the lease expiration
+
+    main/push/callback
+        hub sends us updates via POST
+
+*/
+
+class FeedDBException extends FeedSubException
+{
+    public $obj;
+
+    function __construct($obj)
+    {
+        parent::__construct('Database insert failure');
+        $this->obj = $obj;
+    }
+}
+
+/**
+ * FeedSub handles low-level PubHubSubbub (PuSH) subscriptions.
+ * Higher-level behavior building OStatus stuff on top is handled
+ * under Ostatus_profile.
+ */
+class FeedSub extends Memcached_DataObject
+{
+    public $__table = 'feedsub';
+
+    public $id;
+    public $feeduri;
+
+    // PuSH subscription data
+    public $huburi;
+    public $secret;
+    public $verify_token;
+    public $sub_state; // subscribe, active, unsubscribe, inactive
+    public $sub_start;
+    public $sub_end;
+    public $last_update;
+
+    public $created;
+    public $modified;
+
+    public /*static*/ function staticGet($k, $v=null)
+    {
+        return parent::staticGet(__CLASS__, $k, $v);
+    }
+
+    /**
+     * return table definition for DB_DataObject
+     *
+     * DB_DataObject needs to know something about the table to manipulate
+     * instances. This method provides all the DB_DataObject needs to know.
+     *
+     * @return array array of column definitions
+     */
+
+    function table()
+    {
+        return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
+                     'uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+                     'huburi' =>  DB_DATAOBJECT_STR,
+                     'secret' => DB_DATAOBJECT_STR,
+                     'verify_token' => DB_DATAOBJECT_STR,
+                     'sub_state' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+                     'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
+                     'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
+                     'last_update' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
+                     'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
+                     'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
+    }
+
+    static function schemaDef()
+    {
+        return array(new ColumnDef('id', 'integer',
+                                   /*size*/ null,
+                                   /*nullable*/ false,
+                                   /*key*/ 'PRI',
+                                   /*default*/ '0',
+                                   /*extra*/ null,
+                                   /*auto_increment*/ true),
+                     new ColumnDef('uri', 'varchar',
+                                   255, false, 'UNI'),
+                     new ColumnDef('huburi', 'text',
+                                   null, true),
+                     new ColumnDef('verify_token', 'text',
+                                   null, true),
+                     new ColumnDef('secret', 'text',
+                                   null, true),
+                     new ColumnDef('sub_state', "enum('subscribe','active','unsubscribe','inactive')",
+                                   null, false),
+                     new ColumnDef('sub_start', 'datetime',
+                                   null, true),
+                     new ColumnDef('sub_end', 'datetime',
+                                   null, true),
+                     new ColumnDef('last_update', 'datetime',
+                                   null, false),
+                     new ColumnDef('created', 'datetime',
+                                   null, false),
+                     new ColumnDef('modified', 'datetime',
+                                   null, false));
+    }
+
+    /**
+     * return key definitions for DB_DataObject
+     *
+     * DB_DataObject needs to know about keys that the table has; this function
+     * defines them.
+     *
+     * @return array key definitions
+     */
+
+    function keys()
+    {
+        return array_keys($this->keyTypes());
+    }
+
+    /**
+     * return key definitions for Memcached_DataObject
+     *
+     * Our caching system uses the same key definitions, but uses a different
+     * method to get them.
+     *
+     * @return array key definitions
+     */
+
+    function keyTypes()
+    {
+        return array('id' => 'K', 'uri' => 'U');
+    }
+
+    function sequenceKey()
+    {
+        return array('id', true, false);
+    }
+
+    /**
+     * Fetch the StatusNet-side profile for this feed
+     * @return Profile
+     */
+    public function localProfile()
+    {
+        if ($this->profile_id) {
+            return Profile::staticGet('id', $this->profile_id);
+        }
+        return null;
+    }
+
+    /**
+     * Fetch the StatusNet-side profile for this feed
+     * @return Profile
+     */
+    public function localGroup()
+    {
+        if ($this->group_id) {
+            return User_group::staticGet('id', $this->group_id);
+        }
+        return null;
+    }
+
+    /**
+     * @param string $feeduri
+     * @return FeedSub
+     * @throws FeedSubException if feed is invalid or lacks PuSH setup
+     */
+    public static function ensureFeed($feeduri)
+    {
+        $current = self::staticGet('uri', $feeduri);
+        if ($current) {
+            return $current;
+        }
+
+        $discover = new FeedDiscovery();
+        $discover->discoverFromFeedURL($feeduri);
+
+        $huburi = $discover->getAtomLink('hub');
+        if (!$huburi) {
+            throw new FeedSubNoHubException();
+        }
+
+        $feedsub = new FeedSub();
+        $feedsub->uri = $feeduri;
+        $feedsub->huburi = $huburi;
+        $feedsub->sub_state = 'inactive';
+
+        $feedsub->created = common_sql_now();
+        $feedsub->modified = common_sql_now();
+
+        $result = $feedsub->insert();
+        if (empty($result)) {
+            throw new FeedDBException($feedsub);
+        }
+
+        return $feedsub;
+    }
+
+    /**
+     * Send a subscription request to the hub for this feed.
+     * The hub will later send us a confirmation POST to /main/push/callback.
+     *
+     * @return bool true on success, false on failure
+     * @throws ServerException if feed state is not valid
+     */
+    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");
+        }
+        if (empty($this->huburi)) {
+            if (common_config('feedsub', 'nohub')) {
+                // Fake it! We're just testing remote feeds w/o hubs.
+                return true;
+            } else {
+                throw new ServerException("Attempting to start PuSH subscription for feed with no hub");
+            }
+        }
+
+        return $this->doSubscribe('subscribe');
+    }
+
+    /**
+     * Send a PuSH unsubscription request to the hub for this feed.
+     * The hub will later send us a confirmation POST to /main/push/callback.
+     *
+     * @return bool true on success, false on failure
+     * @throws ServerException if feed state is not valid
+     */
+    public function unsubscribe() {
+        if ($this->sub_state != 'active') {
+            throw new ServerException("Attempting to end PuSH subscription to feed in state $this->sub_state");
+        }
+        if (empty($this->huburi)) {
+            if (common_config('feedsub', 'nohub')) {
+                // Fake it! We're just testing remote feeds w/o hubs.
+                return true;
+            } else {
+                throw new ServerException("Attempting to end PuSH subscription for feed with no hub");
+            }
+        }
+
+        return $this->doSubscribe('unsubscribe');
+    }
+
+    protected function doSubscribe($mode)
+    {
+        $orig = clone($this);
+        $this->verify_token = common_good_rand(16);
+        if ($mode == 'subscribe') {
+            $this->secret = common_good_rand(32);
+        }
+        $this->sub_state = $mode;
+        $this->update($orig);
+        unset($orig);
+
+        try {
+            $callback = common_local_url('pushcallback', array('feed' => $this->id));
+            $headers = array('Content-Type: application/x-www-form-urlencoded');
+            $post = array('hub.mode' => $mode,
+                          'hub.callback' => $callback,
+                          'hub.verify' => 'sync',
+                          'hub.verify_token' => $this->verify_token,
+                          'hub.secret' => $this->secret,
+                          'hub.topic' => $this->uri);
+            $client = new HTTPClient();
+            $response = $client->post($this->huburi, $headers, $post);
+            $status = $response->getStatus();
+            if ($status == 202) {
+                common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback');
+                return true;
+            } else if ($status == 204) {
+                common_log(LOG_INFO, __METHOD__ . ': sub req ok and verified');
+                return true;
+            } else if ($status >= 200 && $status < 300) {
+                common_log(LOG_ERR, __METHOD__ . ": sub req returned unexpected HTTP $status: " . $response->getBody());
+                return false;
+            } else {
+                common_log(LOG_ERR, __METHOD__ . ": sub req failed with HTTP $status: " . $response->getBody());
+                return false;
+            }
+        } catch (Exception $e) {
+            // wtf!
+            common_log(LOG_ERR, __METHOD__ . ": error \"{$e->getMessage()}\" hitting hub $this->huburi subscribing to $this->uri");
+
+            $orig = clone($this);
+            $this->verify_token = '';
+            $this->sub_state = 'inactive';
+            $this->update($orig);
+            unset($orig);
+
+            return false;
+        }
+    }
+
+    /**
+     * Save PuSH subscription confirmation.
+     * Sets approximate lease start and end times and finalizes state.
+     *
+     * @param int $lease_seconds provided hub.lease_seconds parameter, if given
+     */
+    public function confirmSubscribe($lease_seconds=0)
+    {
+        $original = clone($this);
+
+        $this->sub_state = 'active';
+        $this->sub_start = common_sql_date(time());
+        if ($lease_seconds > 0) {
+            $this->sub_end = common_sql_date(time() + $lease_seconds);
+        } else {
+            $this->sub_end = null;
+        }
+        $this->modified = common_sql_now();
+
+        return $this->update($original);
+    }
+
+    /**
+     * Save PuSH unsubscription confirmation.
+     * Wipes active PuSH sub info and resets state.
+     */
+    public function confirmUnsubscribe()
+    {
+        $original = clone($this);
+
+        // @fixme these should all be null, but DB_DataObject doesn't save null values...?????
+        $this->verify_token = '';
+        $this->secret = '';
+        $this->sub_state = '';
+        $this->sub_start = '';
+        $this->sub_end = '';
+        $this->modified = common_sql_now();
+
+        return $this->update($original);
+    }
+
+    /**
+     * Accept updates from a PuSH feed. If validated, this object and the
+     * feed (as a DOMDocument) will be passed to the StartFeedSubHandleFeed
+     * and EndFeedSubHandleFeed events for processing.
+     *
+     * Not guaranteed to be running in an immediate POST context; may be run
+     * from a queue handler.
+     *
+     * Side effects: the feedsub record's lastupdate field will be updated
+     * to the current time (not published time) if we got a legit update.
+     *
+     * @param string $post source of Atom or RSS feed
+     * @param string $hmac X-Hub-Signature header, if present
+     */
+    public function receive($post, $hmac)
+    {
+        common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->uri\"! $hmac $post");
+
+        if ($this->sub_state != 'active') {
+            common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH for inactive feed $this->uri (in state '$this->sub_state')");
+            return;
+        }
+
+        if ($post === '') {
+            common_log(LOG_ERR, __METHOD__ . ": ignoring empty post");
+            return;
+        }
+
+        if (!$this->validatePushSig($post, $hmac)) {
+            // Per spec we silently drop input with a bad sig,
+            // while reporting receipt to the server.
+            return;
+        }
+
+        $feed = new DOMDocument();
+        if (!$feed->loadXML($post)) {
+            // @fixme might help to include the err message
+            common_log(LOG_ERR, __METHOD__ . ": ignoring invalid XML");
+            return;
+        }
+
+        $orig = clone($this);
+        $this->last_update = common_sql_now();
+        $this->update($orig);
+
+        Event::handle('StartFeedSubReceive', array($this, $feed));
+        Event::handle('EndFeedSubReceive', array($this, $feed));
+    }
+
+    /**
+     * Validate the given Atom chunk and HMAC signature against our
+     * shared secret that was set up at subscription time.
+     *
+     * If we don't have a shared secret, there should be no signature.
+     * If we we do, our the calculated HMAC should match theirs.
+     *
+     * @param string $post raw XML source as POSTed to us
+     * @param string $hmac X-Hub-Signature HTTP header value, or empty
+     * @return boolean true for a match
+     */
+    protected function validatePushSig($post, $hmac)
+    {
+        if ($this->secret) {
+            if (preg_match('/^sha1=([0-9a-fA-F]{40})$/', $hmac, $matches)) {
+                $their_hmac = strtolower($matches[1]);
+                $our_hmac = hash_hmac('sha1', $post, $this->secret);
+                if ($their_hmac === $our_hmac) {
+                    return true;
+                }
+                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bad SHA-1 HMAC: got $their_hmac, expected $our_hmac");
+            } else {
+                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bogus HMAC '$hmac'");
+            }
+        } else {
+            if (empty($hmac)) {
+                return true;
+            } else {
+                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with unexpected HMAC '$hmac'");
+            }
+        }
+        return false;
+    }
+
+}
index 7071ee5b4f82e9933973b7a3afc705ef58934233..3120a70f9fb39dd978c14482c59b79ed90abbbc4 100644 (file)
@@ -30,12 +30,11 @@ class HubSub extends Memcached_DataObject
     public $topic;
     public $callback;
     public $secret;
-    public $verify_token;
-    public $challenge;
     public $lease;
     public $sub_start;
     public $sub_end;
     public $created;
+    public $modified;
 
     public /*static*/ function staticGet($topic, $callback)
     {
@@ -62,12 +61,11 @@ class HubSub extends Memcached_DataObject
                      'topic' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
                      'callback' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
                      'secret' => DB_DATAOBJECT_STR,
-                     'verify_token' => DB_DATAOBJECT_STR,
-                     'challenge' => DB_DATAOBJECT_STR,
                      'lease' =>  DB_DATAOBJECT_INT,
                      'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
                      'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
-                     'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
+                     'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
+                     'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
     }
 
     static function schemaDef()
@@ -84,10 +82,6 @@ class HubSub extends Memcached_DataObject
                                    255, false),
                      new ColumnDef('secret', 'text',
                                    null, true),
-                     new ColumnDef('verify_token', 'text',
-                                   null, true),
-                     new ColumnDef('challenge', 'varchar',
-                                   32, true),
                      new ColumnDef('lease', 'int',
                                    null, true),
                      new ColumnDef('sub_start', 'datetime',
@@ -95,6 +89,8 @@ class HubSub extends Memcached_DataObject
                      new ColumnDef('sub_end', 'datetime',
                                    null, true),
                      new ColumnDef('created', 'datetime',
+                                   null, false),
+                     new ColumnDef('modified', 'datetime',
                                    null, false));
     }
 
@@ -103,7 +99,7 @@ class HubSub extends Memcached_DataObject
         return array_keys($this->keyTypes());
     }
 
-    function sequenceKeys()
+    function sequenceKey()
     {
         return array(false, false, false);
     }
@@ -152,83 +148,131 @@ class HubSub extends Memcached_DataObject
     }
 
     /**
-     * Send a verification ping to subscriber
+     * Schedule a future verification ping to the subscriber.
+     * If queues are disabled, will be immediate.
+     *
      * @param string $mode 'subscribe' or 'unsubscribe'
+     * @param string $token hub.verify_token value, if provided by client
      */
-    function verify($mode)
+    function scheduleVerify($mode, $token=null, $retries=null)
     {
-        assert($mode == 'subscribe' || $mode == 'unsubscribe');
+        if ($retries === null) {
+            $retries = intval(common_config('ostatus', 'hub_retries'));
+        }
+        $data = array('sub' => clone($this),
+                      'mode' => $mode,
+                      'token' => $token,
+                      'retries' => $retries);
+        $qm = QueueManager::get();
+        $qm->enqueue($data, 'hubconf');
+    }
 
-        // Is this needed? data object fun...
-        $clone = clone($this);
-        $clone->challenge = common_good_rand(16);
-        $clone->update($this);
-        $this->challenge = $clone->challenge;
-        unset($clone);
+    /**
+     * Send a verification ping to subscriber, and if confirmed apply the changes.
+     * This may create, update, or delete the database record.
+     *
+     * @param string $mode 'subscribe' or 'unsubscribe'
+     * @param string $token hub.verify_token value, if provided by client
+     * @throws ClientException on failure
+     */
+    function verify($mode, $token=null)
+    {
+        assert($mode == 'subscribe' || $mode == 'unsubscribe');
 
+        $challenge = common_good_rand(32);
         $params = array('hub.mode' => $mode,
                         'hub.topic' => $this->topic,
-                        'hub.challenge' => $this->challenge);
+                        'hub.challenge' => $challenge);
         if ($mode == 'subscribe') {
             $params['hub.lease_seconds'] = $this->lease;
         }
-        if ($this->verify_token) {
-            $params['hub.verify_token'] = $this->verify_token;
+        if ($token !== null) {
+            $params['hub.verify_token'] = $token;
         }
-        $url = $this->callback . '?' . http_build_query($params, '', '&'); // @fixme ugly urls
 
-        try {
-            $request = new HTTPClient();
-            $response = $request->get($url);
-            $status = $response->getStatus();
-
-            if ($status >= 200 && $status < 300) {
-                $fail = false;
-            } else {
-                // @fixme how can we schedule a second attempt?
-                // Or should we?
-                $fail = "Returned HTTP $status";
-            }
-        } catch (Exception $e) {
-            $fail = $e->getMessage();
+        // Any existing query string parameters must be preserved
+        $url = $this->callback;
+        if (strpos('?', $url) !== false) {
+            $url .= '&';
+        } else {
+            $url .= '?';
         }
-        if ($fail) {
-            // @fixme how can we schedule a second attempt?
-            // or save a fail count?
-            // Or should we?
-            common_log(LOG_ERR, "Failed to verify $mode for $this->topic at $this->callback: $fail");
-            return false;
+        $url .= http_build_query($params, '', '&');
+
+        $request = new HTTPClient();
+        $response = $request->get($url);
+        $status = $response->getStatus();
+
+        if ($status >= 200 && $status < 300) {
+            common_log(LOG_INFO, "Verified $mode of $this->callback:$this->topic");
         } else {
-            if ($mode == 'subscribe') {
-                // Establish or renew the subscription!
-                // This seems unnecessary... dataobject fun!
-                $clone = clone($this);
-                $clone->challenge = null;
-                $clone->setLease($this->lease);
-                $clone->update($this);
-                unset($clone);
+            throw new ClientException("Hub subscriber verification returned HTTP $status");
+        }
 
-                $this->challenge = null;
-                $this->setLease($this->lease);
-                common_log(LOG_ERR, "Verified $mode of $this->callback:$this->topic for $this->lease seconds");
-            } else if ($mode == 'unsubscribe') {
-                common_log(LOG_ERR, "Verified $mode of $this->callback:$this->topic");
-                $this->delete();
+        $old = HubSub::staticGet($this->topic, $this->callback);
+        if ($mode == 'subscribe') {
+            if ($old) {
+                $this->update($old);
+            } else {
+                $ok = $this->insert();
+            }
+        } else if ($mode == 'unsubscribe') {
+            if ($old) {
+                $old->delete();
+            } else {
+                // That's ok, we're already unsubscribed.
             }
-            return true;
         }
     }
 
     /**
      * Insert wrapper; transparently set the hash key from topic and callback columns.
-     * @return boolean success
+     * @return mixed success
      */
     function insert()
     {
         $this->hashkey = self::hashkey($this->topic, $this->callback);
+        $this->created = common_sql_now();
+        $this->modified = common_sql_now();
         return parent::insert();
     }
 
+    /**
+     * Update wrapper; transparently update modified column.
+     * @return boolean success
+     */
+    function update($old=null)
+    {
+        $this->modified = common_sql_now();
+        return parent::update($old);
+    }
+
+    /**
+     * Schedule delivery of a 'fat ping' to the subscriber's callback
+     * endpoint. If queues are disabled, this will run immediately.
+     *
+     * @param string $atom well-formed Atom feed
+     * @param int $retries optional count of retries if POST fails; defaults to hub_retries from config or 0 if unset
+     */
+    function distribute($atom, $retries=null)
+    {
+        if ($retries === null) {
+            $retries = intval(common_config('ostatus', 'hub_retries'));
+        }
+
+        // We dare not clone() as when the clone is discarded it'll
+        // destroy the result data for the parent query.
+        // @fixme use clone() again when it's safe to copy an
+        // individual item from a multi-item query again.
+        $sub = HubSub::staticGet($this->topic, $this->callback);
+        $data = array('sub' => $sub,
+                      'atom' => $atom,
+                      'retries' => $retries);
+        common_log(LOG_INFO, "Queuing PuSH: $this->topic to $this->callback");
+        $qm = QueueManager::get();
+        $qm->enqueue($data, 'hubout');
+    }
+
     /**
      * Send a 'fat ping' to the subscriber's callback endpoint
      * containing the given Atom feed chunk.
@@ -237,6 +281,7 @@ class HubSub extends Memcached_DataObject
      * a higher level; don't just shove in a complete feed!
      *
      * @param string $atom well-formed Atom feed
+     * @throws Exception (HTTP or general)
      */
     function push($atom)
     {
@@ -248,24 +293,18 @@ class HubSub extends Memcached_DataObject
             $hmac = '(none)';
         }
         common_log(LOG_INFO, "About to push feed to $this->callback for $this->topic, HMAC $hmac");
-        try {
-            $request = new HTTPClient();
-            $request->setBody($atom);
-            $response = $request->post($this->callback, $headers);
 
-            if ($response->isOk()) {
-                return true;
-            }
-            common_log(LOG_ERR, "Error sending PuSH content " .
-                                "to $this->callback for $this->topic: " .
-                                $response->getStatus());
-            return false;
+        $request = new HTTPClient();
+        $request->setBody($atom);
+        $response = $request->post($this->callback, $headers);
 
-        } catch (Exception $e) {
-            common_log(LOG_ERR, "Error sending PuSH content " .
-                                "to $this->callback for $this->topic: " .
-                                $e->getMessage());
-            return false;
+        if ($response->isOk()) {
+            return true;
+        } else {
+            throw new Exception("Callback returned status: " .
+                                $response->getStatus() .
+                                "; body: " .
+                                trim($response->getBody()));
         }
     }
 }
diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php
new file mode 100644 (file)
index 0000000..5a46aee
--- /dev/null
@@ -0,0 +1,233 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * A sample module to show best practices for StatusNet plugins
+ *
+ * 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/>.
+ *
+ * @package   StatusNet
+ * @author    James Walker <james@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+require_once 'Crypt/RSA.php';
+
+class Magicsig extends Memcached_DataObject
+{
+
+    const PUBLICKEYREL = 'magic-public-key';
+    
+    public $__table = 'magicsig';
+
+    public $user_id;
+    public $keypair;
+    public $alg;
+    
+    private $_rsa;
+
+    public function __construct($alg = 'RSA-SHA256')
+    {
+        $this->alg = $alg;
+    }
+    
+    public /*static*/ function staticGet($k, $v=null)
+    {
+        $obj =  parent::staticGet(__CLASS__, $k, $v);
+        if (!empty($obj)) {
+            return Magicsig::fromString($obj->keypair);
+        }
+
+        return $obj;
+    }
+
+
+    function table()
+    {
+        return array(
+            'user_id' => DB_DATAOBJECT_INT,
+            'keypair' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+            'alg'     => DB_DATAOBJECT_STR
+        );
+    }
+
+    static function schemaDef()
+    {
+        return array(new ColumnDef('user_id', 'integer',
+                                   null, true, 'PRI'),
+                     new ColumnDef('keypair', 'varchar',
+                                   255, false),
+                     new ColumnDef('alg', 'varchar',
+                                   64, false));
+    }
+
+
+    function keys()
+    {
+        return array_keys($this->keyTypes());
+    }
+
+    function keyTypes()
+    {
+        return array('user_id' => 'K');
+    }
+
+    function sequenceKey() {
+        return array(false, false, false);
+    }
+
+    function insert()
+    {
+        $this->keypair = $this->toString();
+
+        return parent::insert();
+    }
+
+    public function generate($user_id, $key_length = 512)
+    {
+        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
+
+        $keypair = new Crypt_RSA_KeyPair($key_length);
+        $params['public_key'] = $keypair->getPublicKey();
+        $params['private_key'] = $keypair->getPrivateKey();
+
+        $this->_rsa = new Crypt_RSA($params);
+        PEAR::popErrorHandling();
+
+        $this->user_id = $user_id;
+        $this->insert();
+    }
+
+
+    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());
+        $private_exp = '';
+        if ($full_pair && $private_key->getExponent()) {
+            $private_exp = '.' . base64_url_encode($private_key->getExponent());
+        }
+
+        return 'RSA.' . $mod . '.' . $exp . $private_exp; 
+    }
+    
+    public static function fromString($text)
+    {
+        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
+
+        $magic_sig = new Magicsig();
+        
+        // remove whitespace
+        $text = preg_replace('/\s+/', '', $text);
+
+        // parse components
+        if (!preg_match('/RSA\.([^\.]+)\.([^\.]+)(.([^\.]+))?/', $text, $matches)) {
+            return false;
+        }
+        
+        $mod = base64_url_decode($matches[1]);
+        $exp = base64_url_decode($matches[2]);
+        if (!empty($matches[4])) {
+            $private_exp = base64_url_decode($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;
+        }
+        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->_rsa = new Crypt_RSA($params);
+        PEAR::popErrorHandling();
+
+        return $magic_sig;
+    }
+
+    public function getName()
+    {
+        return $this->alg;
+    }
+
+    public function getHash()
+    {
+        switch ($this->alg) {
+
+        case 'RSA-SHA256':
+            return 'magicsig_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;
+    }
+
+    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;
+    }
+        
+}
+
+// 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), '+/', '-_');
+}
+
+function base64_url_decode($input)
+{
+    return base64_decode(strtr($input, '-_', '+/'));
+}
\ No newline at end of file
index be01cdfe196236fb859e6feabe5f21260dc049b6..a33e95d932c02f7faea0c4f7ee3f56eb9ac788d6 100644 (file)
  */
 
 /**
- * @package FeedSubPlugin
+ * @package OStatusPlugin
  * @maintainer Brion Vibber <brion@status.net>
  */
 
-/*
-PuSH subscription flow:
-
-    $profile->subscribe()
-        generate random verification token
-            save to verify_token
-        sends a sub request to the hub...
-
-    main/push/callback
-        hub sends confirmation back to us via GET
-        We verify the request, then echo back the challenge.
-        On our end, we save the time we subscribed and the lease expiration
-
-    main/push/callback
-        hub sends us updates via POST
-
-*/
-
-class FeedDBException extends FeedSubException
-{
-    public $obj;
-
-    function __construct($obj)
-    {
-        parent::__construct('Database insert failure');
-        $this->obj = $obj;
-    }
-}
-
 class Ostatus_profile extends Memcached_DataObject
 {
     public $__table = 'ostatus_profile';
 
-    public $id;
+    public $uri;
+
     public $profile_id;
     public $group_id;
 
     public $feeduri;
-    public $homeuri;
-
-    // PuSH subscription data
-    public $huburi;
-    public $secret;
-    public $verify_token;
-    public $sub_state; // subscribe, active, unsubscribe
-    public $sub_start;
-    public $sub_end;
-
     public $salmonuri;
+    public $avatar; // remote URL of the last avatar we saved
 
     public $created;
-    public $lastupdate;
+    public $modified;
 
     public /*static*/ function staticGet($k, $v=null)
     {
@@ -91,56 +54,33 @@ class Ostatus_profile extends Memcached_DataObject
 
     function table()
     {
-        return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
+        return array('uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
                      'profile_id' => DB_DATAOBJECT_INT,
                      'group_id' => DB_DATAOBJECT_INT,
-                     'feeduri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
-                     'homeuri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
-                     'huburi' =>  DB_DATAOBJECT_STR,
-                     'secret' => DB_DATAOBJECT_STR,
-                     'verify_token' => DB_DATAOBJECT_STR,
-                     'sub_state' => DB_DATAOBJECT_STR,
-                     'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
-                     'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
+                     'feeduri' => DB_DATAOBJECT_STR,
                      'salmonuri' =>  DB_DATAOBJECT_STR,
+                     'avatar' =>  DB_DATAOBJECT_STR,
                      'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
-                     'lastupdate' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
+                     'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
     }
 
     static function schemaDef()
     {
-        return array(new ColumnDef('id', 'integer',
-                                   /*size*/ null,
-                                   /*nullable*/ false,
-                                   /*key*/ 'PRI',
-                                   /*default*/ '0',
-                                   /*extra*/ null,
-                                   /*auto_increment*/ true),
+        return array(new ColumnDef('uri', 'varchar',
+                                   255, false, 'PRI'),
                      new ColumnDef('profile_id', 'integer',
                                    null, true, 'UNI'),
                      new ColumnDef('group_id', 'integer',
                                    null, true, 'UNI'),
                      new ColumnDef('feeduri', 'varchar',
-                                   255, false, 'UNI'),
-                     new ColumnDef('homeuri', 'varchar',
-                                   255, false),
-                     new ColumnDef('huburi', 'text',
-                                   null, true),
-                     new ColumnDef('verify_token', 'varchar',
-                                   32, true),
-                     new ColumnDef('secret', 'varchar',
-                                   64, true),
-                     new ColumnDef('sub_state', "enum('subscribe','active','unsubscribe')",
-                                   null, true),
-                     new ColumnDef('sub_start', 'datetime',
-                                   null, true),
-                     new ColumnDef('sub_end', 'datetime',
-                                   null, true),
+                                   255, true, 'UNI'),
                      new ColumnDef('salmonuri', 'text',
                                    null, true),
+                     new ColumnDef('avatar', 'text',
+                                   null, true),
                      new ColumnDef('created', 'datetime',
                                    null, false),
-                     new ColumnDef('lastupdate', 'datetime',
+                     new ColumnDef('modified', 'datetime',
                                    null, false));
     }
 
@@ -169,12 +109,12 @@ class Ostatus_profile extends Memcached_DataObject
 
     function keyTypes()
     {
-        return array('id' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U');
+        return array('uri' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U');
     }
 
     function sequenceKey()
     {
-        return array('id', true, false);
+        return array(false, false, false);
     }
 
     /**
@@ -202,97 +142,17 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
-     * @param FeedMunger $munger
-     * @param boolean $isGroup is this a group record?
-     * @return Ostatus_profile
-     */
-    public static function ensureProfile($munger)
-    {
-        $profile = $munger->ostatusProfile();
-
-        $current = self::staticGet('feeduri', $profile->feeduri);
-        if ($current) {
-            // @fixme we should probably update info as necessary
-            return $current;
-        }
-
-        $profile->query('BEGIN');
-
-        try {
-            $local = $munger->profile();
-
-            if ($profile->isGroup()) {
-                $group = new User_group();
-                $group->nickname = $local->nickname . '@remote'; // @fixme
-                $group->fullname = $local->fullname;
-                $group->homepage = $local->homepage;
-                $group->location = $local->location;
-                $group->created = $local->created;
-                $group->insert();
-                if (empty($result)) {
-                    throw new FeedDBException($group);
-                }
-                $profile->group_id = $group->id;
-            } else {
-                $result = $local->insert();
-                if (empty($result)) {
-                    throw new FeedDBException($local);
-                }
-                $profile->profile_id = $local->id;
-            }
-
-            $profile->created = common_sql_now();
-            $profile->lastupdate = common_sql_now();
-            $result = $profile->insert();
-            if (empty($result)) {
-                throw new FeedDBException($profile);
-            }
-
-            $profile->query('COMMIT');
-        } catch (FeedDBException $e) {
-            common_log_db_error($e->obj, 'INSERT', __FILE__);
-            $profile->query('ROLLBACK');
-            return false;
-        }
-
-        $avatar = $munger->getAvatar();
-        if ($avatar) {
-            try {
-                $profile->updateAvatar($avatar);
-            } catch (Exception $e) {
-                common_log(LOG_ERR, "Exception setting OStatus avatar: " .
-                                    $e->getMessage());
-            }
-        }
-
-        return $profile;
-    }
-
-    /**
-     * Download and update given avatar image
-     * @param string $url
-     * @throws Exception in various failure cases
+     * Returns an ActivityObject describing this remote user or group profile.
+     * Can then be used to generate Atom chunks.
+     *
+     * @return ActivityObject
      */
-    public function updateAvatar($url)
+    function asActivityObject()
     {
-        // @fixme this should be better encapsulated
-        // ripped from oauthstore.php (for old OMB client)
-        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
-        copy($url, $temp_filename);
-        
-        // @fixme should we be using different ids?
-        $imagefile = new ImageFile($this->id, $temp_filename);
-        $filename = Avatar::filename($this->id,
-                                     image_type_to_extension($imagefile->type),
-                                     null,
-                                     common_timestamp());
-        rename($temp_filename, Avatar::path($filename));
         if ($this->isGroup()) {
-            $group = $this->localGroup();
-            $group->setOriginal($filename);
+            return ActivityObject::fromGroup($this->localGroup());
         } else {
-            $profile = $this->localProfile();
-            $profile->setOriginal($filename);
+            return ActivityObject::fromProfile($this->localProfile());
         }
     }
 
@@ -302,71 +162,82 @@ class Ostatus_profile extends Memcached_DataObject
      *
      * Assumes that 'activity' namespace has been previously defined.
      *
+     * @fixme replace with wrappers on asActivityObject when it's got everything.
+     *
      * @param string $element one of 'actor', 'subject', 'object', 'target'
      * @return string
      */
     function asActivityNoun($element)
     {
-        $xs = new XMLStringer(true);
-
-        $avatarHref = Avatar::defaultImage(AVATAR_PROFILE_SIZE);
-        $avatarType = 'image/png';
         if ($this->isGroup()) {
-            $type = 'http://activitystrea.ms/schema/1.0/group';
-            $self = $this->localGroup();
-
-            // @fixme put a standard getAvatar() interface on groups too
-            if ($self->homepage_logo) {
-                $avatarHref = $self->homepage_logo;
-                $map = array('png' => 'image/png',
-                             'jpg' => 'image/jpeg',
-                             'jpeg' => 'image/jpeg',
-                             'gif' => 'image/gif');
-                $extension = pathinfo(parse_url($avatarHref, PHP_URL_PATH), PATHINFO_EXTENSION);
-                if (isset($map[$extension])) {
-                    $avatarType = $map[$extension];
-                }
-            }
+            $noun = ActivityObject::fromGroup($this->localGroup());
+            return $noun->asString('activity:' . $element);
         } else {
-            $type = 'http://activitystrea.ms/schema/1.0/person';
-            $self = $this->localProfile();
-            $avatar = $self->getAvatar(AVATAR_PROFILE_SIZE);
-            if ($avatar) {
-                $avatarHref = $avatar->
-                $avatarType = $avatar->mediatype;
-            }
+            $noun = ActivityObject::fromProfile($this->localProfile());
+            return $noun->asString('activity:' . $element);
         }
-        $xs->elementStart('activity:' . $element);
-        $xs->element(
-            'activity:object-type',
-            null,
-            $type
-        );
-        $xs->element(
-            'id',
-            null,
-            $this->homeuri); // ?
-        $xs->element('title', null, $self->getBestName());
+    }
 
-        $xs->element(
-            'link', array(
-                'type' => $avatarType,
-                'href' => $avatarHref
-            ),
-            ''
-        );
+    /**
+     * @return boolean true if this is a remote group
+     */
+    function isGroup()
+    {
+        if ($this->profile_id && !$this->group_id) {
+            return false;
+        } else if ($this->group_id && !$this->profile_id) {
+            return true;
+        } else if ($this->group_id && $this->profile_id) {
+            throw new ServerException("Invalid ostatus_profile state: both group and profile IDs set for $this->uri");
+        } else {
+            throw new ServerException("Invalid ostatus_profile state: both group and profile IDs empty for $this->uri");
+        }
+    }
 
-        $xs->elementEnd('activity:' . $element);
+    /**
+     * 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");
+        }
 
-        return $xs->getString();
+        if ($this->subscribe()) {
+            if ($user->subscribeTo($this->localProfile())) {
+                $this->notify($user->getProfile(), ActivityVerb::FOLLOW, $this);
+                return true;
+            }
+        }
+        return false;
     }
 
     /**
-     * Damn dirty hack!
+     * 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
      */
-    function isGroup()
+    public function subscribeRemoteToLocal(User $user)
     {
-        return (strpos($this->feeduri, '/groups/') !== false);
+        if ($this->isGroup()) {
+            throw new ServerException("Remote groups can't subscribe to local users");
+        }
+
+        Subscription::start($this->localProfile(), $user->getProfile());
+
+        return true;
     }
 
     /**
@@ -376,21 +247,16 @@ class Ostatus_profile extends Memcached_DataObject
      * @return bool true on success, false on failure
      * @throws ServerException if feed state is not valid
      */
-    public function subscribe($mode='subscribe')
+    public function subscribe()
     {
-        if ($this->sub_state != '') {
-            throw new ServerException("Attempting to start PuSH subscription to feed in state $this->sub_state");
-        }
-        if (empty($this->huburi)) {
-            if (common_config('feedsub', 'nohub')) {
-                // Fake it! We're just testing remote feeds w/o hubs.
-                return true;
-            } else {
-                throw new ServerException("Attempting to start PuSH subscription for feed with no hub");
-            }
+        $feedsub = FeedSub::ensureFeed($this->feeduri);
+        if ($feedsub->sub_state == 'active' || $feedsub->sub_state == 'subscribe') {
+            return true;
+        } else if ($feedsub->sub_state == '' || $feedsub->sub_state == 'inactive') {
+            return $feedsub->subscribe();
+        } else if ('unsubscribe') {
+            throw new FeedSubException("Unsub is pending, can't subscribe...");
         }
-
-        return $this->doSubscribe('subscribe');
     }
 
     /**
@@ -401,196 +267,160 @@ class Ostatus_profile extends Memcached_DataObject
      * @throws ServerException if feed state is not valid
      */
     public function unsubscribe() {
-        if ($this->sub_state != 'active') {
-            throw new ServerException("Attempting to end PuSH subscription to feed in state $this->sub_state");
-        }
-        if (empty($this->huburi)) {
-            if (common_config('feedsub', 'nohub')) {
-                // Fake it! We're just testing remote feeds w/o hubs.
-                return true;
-            } else {
-                throw new ServerException("Attempting to end PuSH subscription for feed with no hub");
-            }
-        }
-
-        return $this->doSubscribe('unsubscribe');
-    }
-
-    protected function doSubscribe($mode)
-    {
-        $orig = clone($this);
-        $this->verify_token = common_good_rand(16);
-        if ($mode == 'subscribe') {
-            $this->secret = common_good_rand(32);
+        $feedsub = FeedSub::staticGet('uri', $this->feeduri);
+        if (!$feedsub) {
+            return true;
         }
-        $this->sub_state = $mode;
-        $this->update($orig);
-        unset($orig);
-
-        try {
-            $callback = common_local_url('pushcallback', array('feed' => $this->id));
-            $headers = array('Content-Type: application/x-www-form-urlencoded');
-            $post = array('hub.mode' => $mode,
-                          'hub.callback' => $callback,
-                          'hub.verify' => 'async',
-                          'hub.verify_token' => $this->verify_token,
-                          'hub.secret' => $this->secret,
-                          //'hub.lease_seconds' => 0,
-                          'hub.topic' => $this->feeduri);
-            $client = new HTTPClient();
-            $response = $client->post($this->huburi, $headers, $post);
-            $status = $response->getStatus();
-            if ($status == 202) {
-                common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback');
-                return true;
-            } else if ($status == 204) {
-                common_log(LOG_INFO, __METHOD__ . ': sub req ok and verified');
-                return true;
-            } else if ($status >= 200 && $status < 300) {
-                common_log(LOG_ERR, __METHOD__ . ": sub req returned unexpected HTTP $status: " . $response->getBody());
-                return false;
-            } else {
-                common_log(LOG_ERR, __METHOD__ . ": sub req failed with HTTP $status: " . $response->getBody());
-                return false;
-            }
-        } catch (Exception $e) {
-            // wtf!
-            common_log(LOG_ERR, __METHOD__ . ": error \"{$e->getMessage()}\" hitting hub $this->huburi subscribing to $this->feeduri");
-
-            $orig = clone($this);
-            $this->verify_token = null;
-            $this->sub_state = null;
-            $this->update($orig);
-            unset($orig);
-
-            return false;
+        if ($feedsub->sub_state == 'active') {
+            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...");
         }
     }
 
     /**
-     * Save PuSH subscription confirmation.
-     * Sets approximate lease start and end times and finalizes state.
+     * Check if this remote profile has any active local subscriptions, and
+     * if not drop the PuSH subscription feed.
      *
-     * @param int $lease_seconds provided hub.lease_seconds parameter, if given
+     * @return boolean
      */
-    public function confirmSubscribe($lease_seconds=0)
+    public function garbageCollect()
     {
-        $original = clone($this);
-
-        $this->sub_state = 'active';
-        $this->sub_start = common_sql_date(time());
-        if ($lease_seconds > 0) {
-            $this->sub_end = common_sql_date(time() + $lease_seconds);
+        if ($this->isGroup()) {
+            $members = $this->localGroup()->getMembers(0, 1);
+            $count = $members->N;
         } else {
-            $this->sub_end = null;
+            $count = $this->localProfile()->subscriberCount();
+        }
+        if ($count == 0) {
+            common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $this->feeduri");
+            $this->unsubscribe();
+            return true;
+        } else {
+            return false;
         }
-        $this->lastupdate = common_sql_date();
-
-        return $this->update($original);
-    }
-
-    /**
-     * Save PuSH unsubscription confirmation.
-     * Wipes active PuSH sub info and resets state.
-     */
-    public function confirmUnsubscribe()
-    {
-        $original = clone($this);
-
-        $this->verify_token = null;
-        $this->secret = null;
-        $this->sub_state = null;
-        $this->sub_start = null;
-        $this->sub_end = null;
-        $this->lastupdate = common_sql_date();
-
-        return $this->update($original);
     }
 
     /**
      * Send an Activity Streams notification to the remote Salmon endpoint,
      * if so configured.
      *
-     * @param Profile $actor
-     * @param $verb eg Activity::SUBSCRIBE or Activity::JOIN
-     * @param $object object of the action; if null, the remote entity itself is assumed
+     * @param Profile $actor  Actor who did the activity
+     * @param string  $verb   Activity::SUBSCRIBE or Activity::JOIN
+     * @param Object  $object object of the action; must define asActivityNoun($tag)
      */
-    public function notify(Profile $actor, $verb, $object=null)
+    public function notify($actor, $verb, $object=null)
     {
+        if (!($actor instanceof Profile)) {
+            $type = gettype($actor);
+            if ($type == 'object') {
+                $type = get_class($actor);
+            }
+            throw new ServerException("Invalid actor passed to " . __METHOD__ . ": " . $type);
+        }
         if ($object == null) {
             $object = $this;
         }
         if ($this->salmonuri) {
-            $text = 'update'; // @fixme
-            $id = 'tag:' . common_config('site', 'server') .
-                ':' . $verb .
-                ':' . $actor->id .
-                ':' . time(); // @fixme
-
-            $entry = new Atom10Entry();
-            $entry->elementStart('entry');
+
+            $text = 'update';
+            $id = TagURI::mint('%s:%s:%s',
+                               $verb,
+                               $actor->getURI(),
+                               common_date_iso8601(time()));
+
+            // @fixme consolidate all these NS settings somewhere
+            $attributes = array('xmlns' => Activity::ATOM,
+                                'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/',
+                                'xmlns:thr' => 'http://purl.org/syndication/thread/1.0',
+                                'xmlns:georss' => 'http://www.georss.org/georss',
+                                'xmlns:ostatus' => 'http://ostatus.org/schema/1.0',
+                                'xmlns:poco' => 'http://portablecontacts.net/spec/1.0',
+                                'xmlns:media' => 'http://purl.org/syndication/atommedia');
+
+            $entry = new XMLStringer();
+            $entry->elementStart('entry', $attributes);
             $entry->element('id', null, $id);
             $entry->element('title', null, $text);
             $entry->element('summary', null, $text);
-            $entry->element('published', null, common_date_w3dtf());
+            $entry->element('published', null, common_date_w3dtf(common_sql_now()));
 
             $entry->element('activity:verb', null, $verb);
-            $entry->raw($profile->asAtomAuthor());
-            $entry->raw($profile->asActivityActor());
+            $entry->raw($actor->asAtomAuthor());
+            $entry->raw($actor->asActivityActor());
             $entry->raw($object->asActivityNoun('object'));
-            $entry->elmentEnd('entry');
+            $entry->elementEnd('entry');
 
-            $feed = $this->atomFeed($actor);
-            $feed->initFeed();
-            $feed->addEntry($entry);
-            $feed->renderEntries();
-            $feed->endFeed();
-
-            $xml = $feed->getString();
-            common_log(LOG_INFO, "Posting to Salmon endpoint $salmon: $xml");
+            $xml = $entry->getString();
+            common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml");
 
             $salmon = new Salmon(); // ?
-            $salmon->post($this->salmonuri, $xml);
+            return $salmon->post($this->salmonuri, $xml, $actor);
         }
+        return false;
     }
 
-    function getBestName()
+    /**
+     * Send a Salmon notification ping immediately, and confirm that we got
+     * an acceptable response from the remote site.
+     *
+     * @param mixed $entry XML string, Notice, or Activity
+     * @return boolean success
+     */
+    public function notifyActivity($entry, $actor)
     {
-        if ($this->isGroup()) {
-            return $this->localGroup()->getBestName();
-        } else {
-            return $this->localProfile()->getBestName();
+        if ($this->salmonuri) {
+            $salmon = new Salmon();
+            return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry), $actor);
         }
+
+        return false;
     }
 
-    function atomFeed($actor)
+    /**
+     * Queue a Salmon notification for later. If queues are disabled we'll
+     * send immediately but won't get the return value.
+     *
+     * @param mixed $entry XML string, Notice, or Activity
+     * @return boolean success
+     */
+    public function notifyDeferred($entry, $actor)
     {
-        $feed = new Atom10Feed();
-        // @fixme should these be set up somewhere else?
-        $feed->addNamespace('activity', 'http://activitystrea.ms/spec/1.0/');
-        $feed->addNamesapce('thr', 'http://purl.org/syndication/thread/1.0');
-        $feed->addNamespace('georss', 'http://www.georss.org/georss');
-        $feed->addNamespace('ostatus', 'http://ostatus.org/schema/1.0');
-
-        $taguribase = common_config('integration', 'taguri');
-        $feed->setId("tag:{$taguribase}:UserTimeline:{$actor->id}"); // ???
+        if ($this->salmonuri) {
+            $data = array('salmonuri' => $this->salmonuri,
+                          'entry' => $this->notifyPrepXml($entry),
+                          'actor' => $actor->id);
 
-        $feed->setTitle($actor->getBestName() . ' timeline'); // @fixme
-        $feed->setUpdated(time());
-        $feed->setPublished(time());
+            $qm = QueueManager::get();
+            return $qm->enqueue($data, 'salmon');
+        }
 
-        $feed->addLink(common_url('ApiTimelineUser',
-                                  array('id' => $actor->id,
-                                        'type' => 'atom')),
-                       array('rel' => 'self',
-                             'type' => 'application/atom+xml'));
+        return false;
+    }
 
-        $feed->addLink(common_url('userbyid',
-                                  array('id' => $actor->id)),
-                       array('rel' => 'alternate',
-                             'type' => 'text/html'));
+    protected function notifyPrepXml($entry)
+    {
+        $preamble = '<?xml version="1.0" encoding="UTF-8" ?' . '>';
+        if (is_string($entry)) {
+            return $entry;
+        } else if ($entry instanceof Activity) {
+            return $preamble . $entry->asString(true);
+        } else if ($entry instanceof Notice) {
+            return $preamble . $entry->asAtomEntry(true, true);
+        } else {
+            throw new ServerException("Invalid type passed to Ostatus_profile::notify; must be XML string or Activity entry");
+        }
+    }
 
-        return $feed;
+    function getBestName()
+    {
+        if ($this->isGroup()) {
+            return $this->localGroup()->getBestName();
+        } else {
+            return $this->localProfile()->getBestName();
+        }
     }
 
     /**
@@ -598,36 +428,10 @@ class Ostatus_profile extends Memcached_DataObject
      * Currently assumes that all items in the feed are new,
      * coming from a PuSH hub.
      *
-     * @param string $post source of Atom or RSS feed
-     * @param string $hmac X-Hub-Signature header, if present
+     * @param DOMDocument $feed
      */
-    public function postUpdates($post, $hmac)
+    public function processFeed($feed, $source)
     {
-        common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->feeduri\"! $hmac $post");
-
-        if ($this->sub_state != 'active') {
-            common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH for inactive feed $this->feeduri (in state '$this->sub_state')");
-            return;
-        }
-
-        if ($post === '') {
-            common_log(LOG_ERR, __METHOD__ . ": ignoring empty post");
-            return;
-        }
-
-        if (!$this->validatePushSig($post, $hmac)) {
-            // Per spec we silently drop input with a bad sig,
-            // while reporting receipt to the server.
-            return;
-        }
-
-        $feed = new DOMDocument();
-        if (!$feed->loadXML($post)) {
-            // @fixme might help to include the err message
-            common_log(LOG_ERR, __METHOD__ . ": ignoring invalid XML");
-            return;
-        }
-
         $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
         if ($entries->length == 0) {
             common_log(LOG_ERR, __METHOD__ . ": no entries in feed update, ignoring");
@@ -636,42 +440,8 @@ class Ostatus_profile extends Memcached_DataObject
 
         for ($i = 0; $i < $entries->length; $i++) {
             $entry = $entries->item($i);
-            $this->processEntry($entry, $feed);
-        }
-    }
-
-    /**
-     * Validate the given Atom chunk and HMAC signature against our
-     * shared secret that was set up at subscription time.
-     *
-     * If we don't have a shared secret, there should be no signature.
-     * If we we do, our the calculated HMAC should match theirs.
-     *
-     * @param string $post raw XML source as POSTed to us
-     * @param string $hmac X-Hub-Signature HTTP header value, or empty
-     * @return boolean true for a match
-     */
-    protected function validatePushSig($post, $hmac)
-    {
-        if ($this->secret) {
-            if (preg_match('/^sha1=([0-9a-fA-F]{40})$/', $hmac, $matches)) {
-                $their_hmac = strtolower($matches[1]);
-                $our_hmac = hash_hmac('sha1', $post, $this->secret);
-                if ($their_hmac === $our_hmac) {
-                    return true;
-                }
-                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bad SHA-1 HMAC: got $their_hmac, expected $our_hmac");
-            } else {
-                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bogus HMAC '$hmac'");
-            }
-        } else {
-            if (empty($hmac)) {
-                return true;
-            } else {
-                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with unexpected HMAC '$hmac'");
-            }
+            $this->processEntry($entry, $feed, $source);
         }
-        return false;
     }
 
     /**
@@ -680,15 +450,12 @@ class Ostatus_profile extends Memcached_DataObject
      * @param DOMElement $entry
      * @param DOMElement $feed for context
      */
-    protected function processEntry($entry, $feed)
+    public function processEntry($entry, $feed, $source)
     {
         $activity = new Activity($entry, $feed);
 
-        $debug = var_export($activity, true);
-        common_log(LOG_DEBUG, $debug);
-
         if ($activity->verb == ActivityVerb::POST) {
-            $this->processPost($activity);
+            $this->processPost($activity, $source);
         } else {
             common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb");
         }
@@ -697,102 +464,397 @@ class Ostatus_profile extends Memcached_DataObject
     /**
      * Process an incoming post activity from this remote feed.
      * @param Activity $activity
+     * @param string $method 'push' or 'salmon'
+     * @return mixed saved Notice or false
+     * @fixme break up this function, it's getting nasty long
      */
-    protected function processPost($activity)
+    public function processPost($activity, $method)
     {
         if ($this->isGroup()) {
+            // A group feed will contain posts from multiple authors.
             // @fixme validate these profiles in some way!
-            $oprofile = $this->ensureActorProfile($activity);
+            $oprofile = self::ensureActorProfile($activity);
+            if ($oprofile->isGroup()) {
+                // Groups can't post notices in StatusNet.
+                common_log(LOG_WARNING, "OStatus: skipping post with group listed as author: $oprofile->uri in feed from $this->uri");
+                return false;
+            }
         } else {
-            $actorUri = $this->getActorProfileURI($activity);
-            if ($actorUri == $this->homeuri) {
-                // @fixme check if profile info has changed and update it
+            // 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);
             } else {
-                // @fixme drop or reject the messages once we've got the canonical profile URI recorded sanely
-                common_log(LOG_INFO, "OStatus: Warning: non-group post with unexpected author: $actorUri expected $this->homeuri");
-                //return;
+                common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri");
+                return false;
             }
             $oprofile = $this;
         }
 
+        // 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;
+        $dupe = Notice::staticGet('uri', $sourceUri);
+        if ($dupe) {
+            common_log(LOG_INFO, "OStatus: ignoring duplicate post: $sourceUri");
+            return false;
+        }
+
+        // We'll also want to save a web link to the original notice, if provided.
+        $sourceUrl = null;
         if ($activity->object->link) {
-            $sourceUri = $activity->object->link;
+            $sourceUrl = $activity->object->link;
+        } else if ($activity->link) {
+            $sourceUrl = $activity->link;
         } else if (preg_match('!^https?://!', $activity->object->id)) {
-            $sourceUri = $activity->object->id;
-        } else {
-            common_log(LOG_INFO, "OStatus: ignoring post with no source link: id $activity->object->id");
-            return;
+            $sourceUrl = $activity->object->id;
         }
 
-        $dupe = Notice::staticGet('uri', $sourceUri);
-        if ($dupe) {
-            common_log(LOG_INFO, "OStatus: ignoring duplicate post: $noticeLink");
-            return;
+        // Get (safe!) HTML and text versions of the content
+        $rendered = $this->purify($activity->object->content);
+        $content = html_entity_decode(strip_tags($rendered));
+
+        $shortened = common_shorten_links($content);
+
+        // If it's too long, try using the summary, and make the
+        // HTML an attachment.
+
+        $attachment = null;
+
+        if (Notice::contentTooLong($shortened)) {
+            $attachment = $this->saveHTMLFile($activity->object->title, $rendered);
+            $summary = $activity->object->summary;
+            if (empty($summary)) {
+                $summary = $content;
+            }
+            $shortSummary = common_shorten_links($summary);
+            if (Notice::contentTooLong($shortSummary)) {
+                $url = common_shorten_url(common_local_url('attachment',
+                                                           array('attachment' => $attachment->id)));
+                $shortSummary = substr($shortSummary,
+                                       0,
+                                       Notice::maxContent() - (mb_strlen($url) + 2));
+                $shortSummary .= '… ' . $url;
+                $content = $shortSummary;
+                $rendered = common_render_text($content);
+            }
+        }
+
+        $options = array('is_local' => Notice::REMOTE_OMB,
+                        'url' => $sourceUrl,
+                        'uri' => $sourceUri,
+                        'rendered' => $rendered,
+                        'replies' => array(),
+                        'groups' => array(),
+                        'tags' => array());
+
+        // Check for optional attributes...
+
+        if (!empty($activity->time)) {
+            $options['created'] = common_sql_date($activity->time);
         }
 
-        // @fixme sanitize and save HTML content if available
-        $content = $activity->object->title;
+        if ($activity->context) {
+            // Any individual or group attn: targets?
+            $replies = $activity->context->attention;
+            $options['groups'] = $this->filterReplies($oprofile, $replies);
+            $options['replies'] = $replies;
+
+            // Maintain direct reply associations
+            // @fixme what about conversation ID?
+            if (!empty($activity->context->replyToID)) {
+                $orig = Notice::staticGet('uri',
+                                          $activity->context->replyToID);
+                if (!empty($orig)) {
+                    $options['reply_to'] = $orig->id;
+                }
+            }
 
-        $params = array('is_local' => Notice::REMOTE_OMB,
-                        'uri' => $sourceUri);
+            $location = $activity->context->location;
+            if ($location) {
+                $options['lat'] = $location->lat;
+                $options['lon'] = $location->lon;
+                if ($location->location_id) {
+                    $options['location_ns'] = $location->location_ns;
+                    $options['location_id'] = $location->location_id;
+                }
+            }
+        }
 
-        $location = $this->getEntryLocation($activity->entry);
-        if ($location) {
-            $params['lat'] = $location->lat;
-            $params['lon'] = $location->lon;
-            if ($location->location_id) {
-                $params['location_ns'] = $location->location_ns;
-                $params['location_id'] = $location->location_id;
+        // Atom categories <-> hashtags
+        foreach ($activity->categories as $cat) {
+            if ($cat->term) {
+                $term = common_canonical_tag($cat->term);
+                if ($term) {
+                    $options['tags'][] = $term;
+                }
             }
         }
 
-        // @fixme save detailed ostatus source info
-        // @fixme ensure that groups get handled correctly
+        try {
+            $saved = Notice::saveNew($oprofile->profile_id,
+                                     $content,
+                                     'ostatus',
+                                     $options);
+            if ($saved) {
+                Ostatus_source::saveNew($saved, $this, $method);
+                if (!empty($attachment)) {
+                    File_to_post::processNew($attachment->id, $saved->id);
+                }
+            }
+        } catch (Exception $e) {
+            common_log(LOG_ERR, "OStatus save of remote message $sourceUri failed: " . $e->getMessage());
+            throw $e;
+        }
+        common_log(LOG_INFO, "OStatus saved remote message $sourceUri as notice id $saved->id");
+        return $saved;
+    }
 
-        $saved = Notice::saveNew($oprofile->localProfile()->id,
-                                 $content,
-                                 'ostatus',
-                                 $params);
+    /**
+     * Clean up HTML
+     */
+    protected function purify($html)
+    {
+        require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php';
+        $config = array('safe' => 1);
+        return htmLawed($html, $config);
     }
 
     /**
-     * Parse location given as a GeoRSS-simple point, if provided.
-     * http://www.georss.org/simple
-     *
-     * @param feed item $entry
-     * @return mixed Location or false
+     * Filters a list of recipient ID URIs to just those for local delivery.
+     * @param Ostatus_profile local profile of sender
+     * @param array in/out &$attention_uris set of URIs, will be pruned on output
+     * @return array of group IDs
      */
-    function getLocation($dom)
-    {
-        $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point');
-        
-        for ($i = 0; $i < $points->length; $i++) {
-            $point = $points->item(0)->textContent;
-            $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");
-                    return Location::fromLatLon($lat, $lon);
+    protected function filterReplies($sender, &$attention_uris)
+    {
+        common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', $attention_uris));
+        $groups = array();
+        $replies = array();
+        foreach ($attention_uris as $recipient) {
+            // Is the recipient a local user?
+            $user = User::staticGet('uri', $recipient);
+            if ($user) {
+                // @fixme sender verification, spam etc?
+                $replies[] = $recipient;
+                continue;
+            }
+
+            // Is the recipient a remote group?
+            $oprofile = Ostatus_profile::staticGet('uri', $recipient);
+            if ($oprofile) {
+                if ($oprofile->isGroup()) {
+                    // Deliver to local members of this remote group.
+                    // @fixme sender verification?
+                    $groups[] = $oprofile->group_id;
+                } else {
+                    common_log(LOG_DEBUG, "Skipping reply to remote profile $recipient");
                 }
+                continue;
             }
-            common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
-        }
 
-        return false;
+            // Is the recipient a local group?
+            // @fixme we need a uri on user_group
+            // $group = User_group::staticGet('uri', $recipient);
+            $template = common_local_url('groupbyid', array('id' => '31337'));
+            $template = preg_quote($template, '/');
+            $template = str_replace('31337', '(\d+)', $template);
+            if (preg_match("/$template/", $recipient, $matches)) {
+                $id = $matches[1];
+                $group = User_group::staticGet('id', $id);
+                if ($group) {
+                    // Deliver to all members of this local group if allowed.
+                    $profile = $sender->localProfile();
+                    if ($profile->isMember($group)) {
+                        $groups[] = $group->id;
+                    } else {
+                        common_log(LOG_DEBUG, "Skipping reply to local group $group->nickname as sender $profile->id is not a member");
+                    }
+                    continue;
+                } else {
+                    common_log(LOG_DEBUG, "Skipping reply to bogus group $recipient");
+                }
+            }
+
+            common_log(LOG_DEBUG, "Skipping reply to unrecognized profile $recipient");
+
+        }
+        $attention_uris = $replies;
+        common_log(LOG_DEBUG, "Local reply recipients: " . implode(', ', $replies));
+        common_log(LOG_DEBUG, "Local group recipients: " . implode(', ', $groups));
+        return $groups;
     }
 
     /**
-     * Get an appropriate avatar image source URL, if available.
-     *
-     * @param ActivityObject $actor
+     * @param string $profile_url
+     * @return Ostatus_profile
+     * @throws FeedSubException
+     */
+    public static function ensureProfile($profile_uri, $hints=array())
+    {
+        // Get the canonical feed URI and check it
+        $discover = new FeedDiscovery();
+        if (isset($hints['feedurl'])) {
+            $feeduri = $hints['feedurl'];
+            $feeduri = $discover->discoverFromFeedURL($feeduri);
+        } else {
+            $feeduri = $discover->discoverFromURL($profile_uri);
+            $hints['feedurl'] = $feeduri;
+        }
+
+        $huburi = $discover->getAtomLink('hub');
+        $hints['hub'] = $huburi;
+        $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
+        $hints['salmon'] = $salmonuri;
+
+        if (!$huburi) {
+            // We can only deal with folks with a PuSH hub
+            throw new FeedSubNoHubException();
+        }
+
+        // Try to get a profile from the feed activity:subject
+
+        $feedEl = $discover->feed->documentElement;
+
+        $subject = ActivityUtils::child($feedEl, Activity::SUBJECT, Activity::SPEC);
+
+        if (!empty($subject)) {
+            $subjObject = new ActivityObject($subject);
+            return self::ensureActivityObjectProfile($subjObject, $hints);
+        }
+
+        // Otherwise, try the feed author
+
+        $author = ActivityUtils::child($feedEl, Activity::AUTHOR, Activity::ATOM);
+
+        if (!empty($author)) {
+            $authorObject = new ActivityObject($author);
+            return self::ensureActivityObjectProfile($authorObject, $hints);
+        }
+
+        // Sheesh. Not a very nice feed! Let's try fingerpoken in the
+        // entries.
+
+        $entries = $discover->feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
+
+        if (!empty($entries) && $entries->length > 0) {
+
+            $entry = $entries->item(0);
+
+            $actor = ActivityUtils::child($entry, Activity::ACTOR, Activity::SPEC);
+
+            if (!empty($actor)) {
+                $actorObject = new ActivityObject($actor);
+                return self::ensureActivityObjectProfile($actorObject, $hints);
+
+            }
+
+            $author = ActivityUtils::child($entry, Activity::AUTHOR, Activity::ATOM);
+
+            if (!empty($author)) {
+                $authorObject = new ActivityObject($author);
+                return self::ensureActivityObjectProfile($authorObject, $hints);
+            }
+        }
+
+        // XXX: make some educated guesses here
+
+        throw new FeedSubException("Can't find enough profile information to make a feed.");
+    }
+
+    /**
+     *
+     * Download and update given avatar image
+     * @param string $url
+     * @throws Exception in various failure cases
+     */
+    protected function updateAvatar($url)
+    {
+        if ($url == $this->avatar) {
+            // We've already got this one.
+            return;
+        }
+
+        if ($this->isGroup()) {
+            $self = $this->localGroup();
+        } else {
+            $self = $this->localProfile();
+        }
+        if (!$self) {
+            throw new ServerException(sprintf(
+                _m("Tried to update avatar for unsaved remote profile %s"),
+                $this->uri));
+        }
+
+        // @fixme this should be better encapsulated
+        // ripped from oauthstore.php (for old OMB client)
+        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
+        if (!copy($url, $temp_filename)) {
+            throw new ServerException(sprintf(_m("Unable to fetch avatar from %s"), $url));
+        }
+
+        if ($this->isGroup()) {
+            $id = $this->group_id;
+        } else {
+            $id = $this->profile_id;
+        }
+        // @fixme should we be using different ids?
+        $imagefile = new ImageFile($id, $temp_filename);
+        $filename = Avatar::filename($id,
+                                     image_type_to_extension($imagefile->type),
+                                     null,
+                                     common_timestamp());
+        rename($temp_filename, Avatar::path($filename));
+        $self->setOriginal($filename);
+
+        $orig = clone($this);
+        $this->avatar = $url;
+        $this->update($orig);
+    }
+
+    /**
+     * Pull avatar URL from ActivityObject or profile hints
+     *
+     * @param ActivityObject $object
+     * @param array $hints
+     * @return mixed URL string or false
+     */
+
+    protected static function getActivityObjectAvatar($object, $hints=array())
+    {
+        if ($object->avatarLinks) {
+            $best = false;
+            // Take the exact-size avatar, or the largest avatar, or the first avatar if all sizeless
+            foreach ($object->avatarLinks as $avatar) {
+                if ($avatar->width == AVATAR_PROFILE_SIZE && $avatar->height = AVATAR_PROFILE_SIZE) {
+                    // Exact match!
+                    $best = $avatar;
+                    break;
+                }
+                if (!$best || $avatar->width > $best->width) {
+                    $best = $avatar;
+                }
+            }
+            return $best->url;
+        } else if (array_key_exists('avatar', $hints)) {
+            return $hints['avatar'];
+        }
+        return false;
+    }
+
+    /**
+     * Get an appropriate avatar image source URL, if available.
+     *
+     * @param ActivityObject $actor
      * @param DOMElement $feed
      * @return string
      */
-    function getAvatar($actor, $feed)
+
+    protected static function getAvatar($actor, $feed)
     {
         $url = '';
         $icon = '';
@@ -831,13 +893,27 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
-     * @fixme move off of ostatus_profile or static?
+     * Fetch, or build if necessary, an Ostatus_profile for the actor
+     * in a given Activity Streams activity.
+     *
+     * @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
      */
-    function ensureActorProfile($activity)
+
+    public static function ensureActorProfile($activity, $hints=array())
+    {
+        return self::ensureActivityObjectProfile($activity->actor, $hints);
+    }
+
+    public static function ensureActivityObjectProfile($object, $hints=array())
     {
-        $profile = $this->getActorProfile($activity);
-        if (!$profile) {
-            $profile = $this->createActorProfile($activity);
+        $profile = self::getActivityObjectProfile($object);
+        if ($profile) {
+            $profile->updateFromActivityObject($object, $hints);
+        } else {
+            $profile = self::createActivityObjectProfile($object, $hints);
         }
         return $profile;
     }
@@ -846,10 +922,20 @@ class Ostatus_profile extends Memcached_DataObject
      * @param Activity $activity
      * @return mixed matching Ostatus_profile or false if none known
      */
-    function getActorProfile($activity)
+    public static function getActorProfile($activity)
+    {
+        return self::getActivityObjectProfile($activity->actor);
+    }
+
+    protected static function getActivityObjectProfile($object)
     {
-        $homeuri = $this->getActorProfileURI($activity);
-        return Ostatus_profile::staticGet('homeuri', $homeuri);
+        $uri = self::getActivityObjectProfileURI($object);
+        return Ostatus_profile::staticGet('uri', $uri);
+    }
+
+    protected static function getActorProfileURI($activity)
+    {
+        return self::getActivityObjectProfileURI($activity->actor);
     }
 
     /**
@@ -857,56 +943,110 @@ class Ostatus_profile extends Memcached_DataObject
      * @return string
      * @throws ServerException
      */
-    function getActorProfileURI($activity)
+    protected static function getActivityObjectProfileURI($object)
     {
         $opts = array('allowed_schemes' => array('http', 'https'));
-        $actor = $activity->actor;
-        if ($actor->id && Validate::uri($actor->id, $opts)) {
-            return $actor->id;
+        if ($object->id && Validate::uri($object->id, $opts)) {
+            return $object->id;
         }
-        if ($actor->link && Validate::uri($actor->link, $opts)) {
-            return $actor->link;
+        if ($object->link && Validate::uri($object->link, $opts)) {
+            return $object->link;
         }
         throw new ServerException("No author ID URI found");
     }
 
     /**
+     * @fixme validate stuff somewhere
+     */
+
+    /**
+     * Create local ostatus_profile and profile/user_group entries for
+     * the provided remote user or group.
+     *
+     * @param ActivityObject $object
+     * @param array $hints
      *
+     * @return Ostatus_profile
      */
-    function createActorProfile($activity)
-    {
-        $actor = $activity->actor();
-        $homeuri = $this->getActivityProfileURI($activity);
-        $nickname = $this->getAuthorNick($activity);
-        $avatar = $this->getAvatar($actor, $feed);
-
-        $profile = new Profile();
-        $profile->nickname   = $nickname;
-        $profile->fullname   = $actor->displayName;
-        $profile->homepage   = $actor->link; // @fixme
-        $profile->profileurl = $homeuri;
-        // @fixme bio
-        // @fixme tags/categories
-        // @fixme location?
-        // @todo tags from categories
-        // @todo lat/lon/location?
+    protected static function createActivityObjectProfile($object, $hints=array())
+    {
+        $homeuri = $object->id;
+        $discover = false;
 
-        $ok = $profile->insert();
-        if ($ok) {
-            $this->updateAvatar($profile, $avatar);
+        if (!$homeuri) {
+            common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true));
+            throw new ServerException("No profile URI");
+        }
+
+        if (array_key_exists('feedurl', $hints)) {
+            $feeduri = $hints['feedurl'];
+        } else {
+            $discover = new FeedDiscovery();
+            $feeduri = $discover->discoverFromURL($homeuri);
+        }
+
+        if (array_key_exists('salmon', $hints)) {
+            $salmonuri = $hints['salmon'];
+        } else {
+            if (!$discover) {
+                $discover = new FeedDiscovery();
+                $discover->discoverFromFeedURL($hints['feedurl']);
+            }
+            $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
+        }
+
+        if (array_key_exists('hub', $hints)) {
+            $huburi = $hints['hub'];
         } else {
-            throw new ServerException("Can't save local profile");
+            if (!$discover) {
+                $discover = new FeedDiscovery();
+                $discover->discoverFromFeedURL($hints['feedurl']);
+            }
+            $huburi = $discover->getAtomLink('hub');
+        }
+
+        if (!$huburi) {
+            // We can only deal with folks with a PuSH hub
+            throw new FeedSubNoHubException();
         }
 
-        // @fixme either need to do feed discovery here
-        // or need to split out some of the feed stuff
-        // so we can leave it empty until later.
         $oprofile = new Ostatus_profile();
-        $oprofile->homeuri = $homeuri;
-        $oprofile->profile_id = $profile->id;
+
+        $oprofile->uri        = $homeuri;
+        $oprofile->feeduri    = $feeduri;
+        $oprofile->salmonuri  = $salmonuri;
+
+        $oprofile->created    = common_sql_now();
+        $oprofile->modified   = common_sql_now();
+
+        if ($object->type == ActivityObject::PERSON) {
+            $profile = new Profile();
+            $profile->created = common_sql_now();
+            self::updateProfile($profile, $object, $hints);
+
+            $oprofile->profile_id = $profile->insert();
+            if (!$oprofile->profile_id) {
+                throw new ServerException("Can't save local profile");
+            }
+        } else {
+            $group = new User_group();
+            $group->uri = $homeuri;
+            $group->created = common_sql_now();
+            self::updateGroup($group, $object, $hints);
+
+            $oprofile->group_id = $group->insert();
+            if (!$oprofile->group_id) {
+                throw new ServerException("Can't save local profile");
+            }
+        }
 
         $ok = $oprofile->insert();
+
         if ($ok) {
+            $avatar = self::getActivityObjectAvatar($object, $hints);
+            if ($avatar) {
+                $oprofile->updateAvatar($avatar);
+            }
             return $oprofile;
         } else {
             throw new ServerException("Can't save OStatus profile");
@@ -914,23 +1054,450 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
-     * @fixme move this into Activity?
-     * @param Activity $activity
-     * @return string
+     * Save any updated profile information to our local copy.
+     * @param ActivityObject $object
+     * @param array $hints
      */
-    function getAuthorNick($activity)
-    {
-        // @fixme not technically part of the actor?
-        foreach (array($activity->entry, $activity->feed) as $source) {
-            $author = ActivityUtil::child($source, 'author', Activity::ATOM);
-            if ($author) {
-                $name = ActivityUtil::child($author, 'name', Activity::ATOM);
-                if ($name) {
-                    return trim($name->textContent);
-                }
+    public function updateFromActivityObject($object, $hints=array())
+    {
+        if ($this->isGroup()) {
+            $group = $this->localGroup();
+            self::updateGroup($group, $object, $hints);
+        } else {
+            $profile = $this->localProfile();
+            self::updateProfile($profile, $object, $hints);
+        }
+        $avatar = self::getActivityObjectAvatar($object, $hints);
+        if ($avatar) {
+            $this->updateAvatar($avatar);
+        }
+    }
+
+    protected static function updateProfile($profile, $object, $hints=array())
+    {
+        $orig = clone($profile);
+
+        $profile->nickname = self::getActivityObjectNickname($object, $hints);
+
+        if (!empty($object->title)) {
+            $profile->fullname = $object->title;
+        } else if (array_key_exists('fullname', $hints)) {
+            $profile->fullname = $hints['fullname'];
+        }
+
+        if (!empty($object->link)) {
+            $profile->profileurl = $object->link;
+        } else if (array_key_exists('profileurl', $hints)) {
+            $profile->profileurl = $hints['profileurl'];
+        } else if (Validate::uri($object->id, array('allowed_schemes' => array('http', 'https')))) {
+            $profile->profileurl = $object->id;
+        }
+
+        $profile->bio      = self::getActivityObjectBio($object, $hints);
+        $profile->location = self::getActivityObjectLocation($object, $hints);
+        $profile->homepage = self::getActivityObjectHomepage($object, $hints);
+
+        if (!empty($object->geopoint)) {
+            $location = ActivityContext::locationFromPoint($object->geopoint);
+            if (!empty($location)) {
+                $profile->lat = $location->lat;
+                $profile->lon = $location->lon;
             }
         }
-        return false;
+
+        // @fixme tags/categories
+        // @todo tags from categories
+
+        if ($profile->id) {
+            common_log(LOG_DEBUG, "Updating OStatus profile $profile->id from remote info $object->id: " . var_export($object, true) . var_export($hints, true));
+            $profile->update($orig);
+        }
+    }
+
+    protected static function updateGroup($group, $object, $hints=array())
+    {
+        $orig = clone($group);
+
+        $group->nickname = self::getActivityObjectNickname($object, $hints);
+        $group->fullname = $object->title;
+
+        if (!empty($object->link)) {
+            $group->mainpage = $object->link;
+        } else if (array_key_exists('profileurl', $hints)) {
+            $group->mainpage = $hints['profileurl'];
+        }
+
+        // @todo tags from categories
+        $group->description = self::getActivityObjectBio($object, $hints);
+        $group->location = self::getActivityObjectLocation($object, $hints);
+        $group->homepage = self::getActivityObjectHomepage($object, $hints);
+
+        if ($group->id) {
+            common_log(LOG_DEBUG, "Updating OStatus group $group->id from remote info $object->id: " . var_export($object, true) . var_export($hints, true));
+            $group->update($orig);
+        }
     }
 
+    protected static function getActivityObjectHomepage($object, $hints=array())
+    {
+        $homepage = null;
+        $poco     = $object->poco;
+
+        if (!empty($poco)) {
+            $url = $poco->getPrimaryURL();
+            if ($url && $url->type == 'homepage') {
+                $homepage = $url->value;
+            }
+        }
+
+        // @todo Try for a another PoCo URL?
+
+        return $homepage;
+    }
+
+    protected static function getActivityObjectLocation($object, $hints=array())
+    {
+        $location = null;
+
+        if (!empty($object->poco) &&
+            isset($object->poco->address->formatted)) {
+            $location = $object->poco->address->formatted;
+        } else if (array_key_exists('location', $hints)) {
+            $location = $hints['location'];
+        }
+
+        if (!empty($location)) {
+            if (mb_strlen($location) > 255) {
+                $location = mb_substr($note, 0, 255 - 3) . ' … ';
+            }
+        }
+
+        // @todo Try to find location some othe way? Via goerss point?
+
+        return $location;
+    }
+
+    protected static function getActivityObjectBio($object, $hints=array())
+    {
+        $bio  = null;
+
+        if (!empty($object->poco)) {
+            $note = $object->poco->note;
+        } else if (array_key_exists('bio', $hints)) {
+            $note = $hints['bio'];
+        }
+
+        if (!empty($note)) {
+            if (Profile::bioTooLong($note)) {
+                // XXX: truncate ok?
+                $bio = mb_substr($note, 0, Profile::maxBio() - 3) . ' … ';
+            } else {
+                $bio = $note;
+            }
+        }
+
+        // @todo Try to get bio info some other way?
+
+        return $bio;
+    }
+
+    protected static function getActivityObjectNickname($object, $hints=array())
+    {
+        if ($object->poco) {
+            if (!empty($object->poco->preferredUsername)) {
+                return common_nicknamize($object->poco->preferredUsername);
+            }
+        }
+
+        if (!empty($object->nickname)) {
+            return common_nicknamize($object->nickname);
+        }
+
+        if (array_key_exists('nickname', $hints)) {
+            return $hints['nickname'];
+        }
+
+        // Try the definitive ID
+
+        $nickname = self::nicknameFromURI($object->id);
+
+        // Try a Webfinger if one was passed (way) down
+
+        if (empty($nickname)) {
+            if (array_key_exists('webfinger', $hints)) {
+                $nickname = self::nicknameFromURI($hints['webfinger']);
+            }
+        }
+
+        // Try the name
+
+        if (empty($nickname)) {
+            $nickname = common_nicknamize($object->title);
+        }
+
+        return $nickname;
+    }
+
+    protected static function nicknameFromURI($uri)
+    {
+        preg_match('/(\w+):/', $uri, $matches);
+
+        $protocol = $matches[1];
+
+        switch ($protocol) {
+        case 'acct':
+        case 'mailto':
+            if (preg_match("/^$protocol:(.*)?@.*\$/", $uri, $matches)) {
+                return common_canonical_nickname($matches[1]);
+            }
+            return null;
+        case 'http':
+            return common_url_to_nickname($uri);
+            break;
+        default:
+            return null;
+        }
+    }
+
+    public static function ensureWebfinger($addr)
+    {
+        // First, try the cache
+
+        $uri = self::cacheGet(sprintf('ostatus_profile:webfinger:%s', $addr));
+
+        if ($uri !== false) {
+            if (is_null($uri)) {
+                return null;
+            }
+            $oprofile = Ostatus_profile::staticGet('uri', $uri);
+            if (!empty($oprofile)) {
+                return $oprofile;
+            }
+        }
+
+        // First, look it up
+
+        $oprofile = Ostatus_profile::staticGet('uri', 'acct:'.$addr);
+
+        if (!empty($oprofile)) {
+            self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
+            return $oprofile;
+        }
+
+        // Now, try some discovery
+
+        $disco = new Discovery();
+
+        try {
+            $result = $disco->lookup($addr);
+        } catch (Exception $e) {
+            self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), null);
+            return null;
+        }
+
+        foreach ($result->links as $link) {
+            switch ($link['rel']) {
+            case Discovery::PROFILEPAGE:
+                $profileUrl = $link['href'];
+                break;
+            case Salmon::NS_REPLIES:
+                $salmonEndpoint = $link['href'];
+                break;
+            case Discovery::UPDATESFROM:
+                $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;
+            }
+        }
+
+        $hints = array('webfinger' => $addr,
+                       'profileurl' => $profileUrl,
+                       'feedurl' => $feedUrl,
+                       'salmon' => $salmonEndpoint);
+
+        if (isset($hcardUrl)) {
+            $hcardHints = self::slurpHcard($hcardUrl);
+            // Note: Webfinger > hcard
+            $hints = array_merge($hcardHints, $hints);
+        }
+
+        // If we got a feed URL, try that
+
+        if (isset($feedUrl)) {
+            try {
+                common_log(LOG_INFO, "Discovery on acct:$addr with feed URL $feedUrl");
+                $oprofile = self::ensureProfile($feedUrl, $hints);
+                self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
+                return $oprofile;
+            } catch (Exception $e) {
+                common_log(LOG_WARNING, "Failed creating profile from feed URL '$feedUrl': " . $e->getMessage());
+                // keep looking
+            }
+        }
+
+        // If we got a profile page, try that!
+
+        if (isset($profileUrl)) {
+            try {
+                common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
+                $oprofile = self::ensureProfile($profileUrl, $hints);
+                self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
+                return $oprofile;
+            } catch (Exception $e) {
+                common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage());
+                // keep looking
+            }
+        }
+
+        // XXX: try hcard
+        // XXX: try FOAF
+
+        if (isset($salmonEndpoint)) {
+
+            // An account URL, a salmon endpoint, and a dream? Not much to go
+            // on, but let's give it a try
+
+            $uri = 'acct:'.$addr;
+
+            $profile = new Profile();
+
+            $profile->nickname = self::nicknameFromUri($uri);
+            $profile->created  = common_sql_now();
+
+            if (isset($profileUrl)) {
+                $profile->profileurl = $profileUrl;
+            }
+
+            $profile_id = $profile->insert();
+
+            if (!$profile_id) {
+                common_log_db_error($profile, 'INSERT', __FILE__);
+                throw new Exception("Couldn't save profile for '$addr'");
+            }
+
+            $oprofile = new Ostatus_profile();
+
+            $oprofile->uri        = $uri;
+            $oprofile->salmonuri  = $salmonEndpoint;
+            $oprofile->profile_id = $profile_id;
+            $oprofile->created    = common_sql_now();
+
+            if (isset($feedUrl)) {
+                $profile->feeduri = $feedUrl;
+            }
+
+            $result = $oprofile->insert();
+
+            if (!$result) {
+                common_log_db_error($oprofile, 'INSERT', __FILE__);
+                throw new Exception("Couldn't save ostatus_profile for '$addr'");
+            }
+
+            self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
+            return $oprofile;
+        }
+
+        return null;
+    }
+
+    function saveHTMLFile($title, $rendered)
+    {
+        $final = sprintf("<!DOCTYPE html>\n<html><head><title>%s</title></head>".
+                         '<body><div>%s</div></body></html>',
+                         htmlspecialchars($title),
+                         $rendered);
+
+        $filename = File::filename($this->localProfile(),
+                                   'ostatus', // ignored?
+                                   'text/html');
+
+        $filepath = File::path($filename);
+
+        file_put_contents($filepath, $final);
+
+        $file = new File;
+
+        $file->filename = $filename;
+        $file->url      = File::url($filename);
+        $file->size     = filesize($filepath);
+        $file->date     = time();
+        $file->mimetype = 'text/html';
+
+        $file_id = $file->insert();
+
+        if ($file_id === false) {
+            common_log_db_error($file, "INSERT", __FILE__);
+            throw new ServerException(_('Could not store HTML content of long post as file.'));
+        }
+
+        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['adr'])) {
+                // 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/classes/Ostatus_source.php b/plugins/OStatus/classes/Ostatus_source.php
new file mode 100644 (file)
index 0000000..e6ce7d4
--- /dev/null
@@ -0,0 +1,114 @@
+<?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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @maintainer Brion Vibber <brion@status.net>
+ */
+
+class Ostatus_source extends Memcached_DataObject
+{
+    public $__table = 'ostatus_source';
+
+    public $notice_id; // notice we're referring to
+    public $profile_uri; // uri of the ostatus_profile this came through -- may be a group feed
+    public $method; // push or salmon
+
+    public /*static*/ function staticGet($k, $v=null)
+    {
+        return parent::staticGet(__CLASS__, $k, $v);
+    }
+
+    /**
+     * return table definition for DB_DataObject
+     *
+     * DB_DataObject needs to know something about the table to manipulate
+     * instances. This method provides all the DB_DataObject needs to know.
+     *
+     * @return array array of column definitions
+     */
+
+    function table()
+    {
+        return array('notice_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
+                     'profile_uri' => DB_DATAOBJECT_STR,
+                     'method' => DB_DATAOBJECT_STR);
+    }
+
+    static function schemaDef()
+    {
+        return array(new ColumnDef('notice_id', 'integer',
+                                   null, false, 'PRI'),
+                     new ColumnDef('profile_uri', 'varchar',
+                                   255, false),
+                     new ColumnDef('method', "ENUM('push','salmon')",
+                                   null, false));
+    }
+
+    /**
+     * return key definitions for DB_DataObject
+     *
+     * DB_DataObject needs to know about keys that the table has; this function
+     * defines them.
+     *
+     * @return array key definitions
+     */
+
+    function keys()
+    {
+        return array_keys($this->keyTypes());
+    }
+
+    /**
+     * return key definitions for Memcached_DataObject
+     *
+     * Our caching system uses the same key definitions, but uses a different
+     * method to get them.
+     *
+     * @return array key definitions
+     */
+
+    function keyTypes()
+    {
+        return array('notice_id' => 'K');
+    }
+
+    function sequenceKey()
+    {
+        return array(false, false, false);
+    }
+
+    /**
+     * Save a remote notice source record; this helps indicate how trusted we are.
+     * @param string $method
+     */
+    public static function saveNew(Notice $notice, Ostatus_profile $oprofile, $method)
+    {
+        $osource = new Ostatus_source();
+        $osource->notice_id = $notice->id;
+        $osource->profile_uri = $oprofile->uri;
+        $osource->method = $method;
+        if ($osource->insert()) {
+           return true;
+        } else {
+            common_log_db_error($osource, 'INSERT', __FILE__);
+            return false;
+        }
+    }
+}
diff --git a/plugins/OStatus/extlib/Crypt/RSA.php b/plugins/OStatus/extlib/Crypt/RSA.php
new file mode 100644 (file)
index 0000000..16dfa54
--- /dev/null
@@ -0,0 +1,524 @@
+<?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
+ */
+
+/**
+ * RSA error handling facilities
+ */
+require_once 'Crypt/RSA/ErrorHandler.php';
+
+/**
+ * loader for math wrappers
+ */
+require_once 'Crypt/RSA/MathLoader.php';
+
+/**
+ * helper class for mange single key
+ */
+require_once 'Crypt/RSA/Key.php';
+
+/**
+ * helper class for manage key pair
+ */
+require_once 'Crypt/RSA/KeyPair.php';
+
+/**
+ * Crypt_RSA class, derived from Crypt_RSA_ErrorHandler
+ *
+ * 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
+ *
+ * Example usage:
+ *     // creating an error handler
+ *     $error_handler = create_function('$obj', 'echo "error: ", $obj->getMessage(), "\n"');
+ *
+ *     // 1024-bit key pair generation
+ *     $key_pair = new Crypt_RSA_KeyPair(1024);
+ *
+ *     // check consistence of Crypt_RSA_KeyPair object
+ *     $error_handler($key_pair);
+ *
+ *     // creating Crypt_RSA object
+ *     $rsa_obj = new Crypt_RSA;
+ *
+ *     // check consistence of Crypt_RSA object
+ *     $error_handler($rsa_obj);
+ *
+ *     // set error handler on Crypt_RSA object ( see Crypt/RSA/ErrorHandler.php for details )
+ *     $rsa_obj->setErrorHandler($error_handler);
+ *
+ *     // encryption (usually using public key)
+ *     $enc_data = $rsa_obj->encrypt($plain_data, $key_pair->getPublicKey());
+ *
+ *     // decryption (usually using private key)
+ *     $plain_data = $rsa_obj->decrypt($enc_data, $key_pair->getPrivateKey());
+ *
+ *     // signing
+ *     $signature = $rsa_obj->createSign($document, $key_pair->getPrivateKey());
+ *
+ *     // signature checking
+ *     $is_valid = $rsa_obj->validateSign($document, $signature, $key_pair->getPublicKey());
+ *
+ *     // 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);
+ *
+ *     // changing default hash function, which is used for sign
+ *     // creating/validation
+ *     $rsa_obj->setParams(array('hash_func' => 'md5'));
+ *
+ *     // 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";
+ *     }
+ *
+ * @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 extends Crypt_RSA_ErrorHandler
+{
+    /**
+     * Reference to math wrapper, which is used to
+     * manipulate large integers in RSA algorithm.
+     *
+     * @var object of Crypt_RSA_Math_* class
+     * @access private
+     */
+    var $_math_obj;
+
+    /**
+     * key for encryption, which is used by encrypt() method
+     *
+     * @var object of Crypt_RSA_KEY class
+     * @access private
+     */
+    var $_enc_key;
+
+    /**
+     * key for decryption, which is used by decrypt() method
+     *
+     * @var object of Crypt_RSA_KEY class
+     * @access private
+     */
+    var $_dec_key;
+
+    /**
+     * public key, which is used by validateSign() method
+     *
+     * @var object of Crypt_RSA_KEY class
+     * @access private
+     */
+    var $_public_key;
+
+    /**
+     * private key, which is used by createSign() method
+     *
+     * @var object of Crypt_RSA_KEY class
+     * @access private
+     */
+    var $_private_key;
+
+    /**
+     * name of hash function, which is used by validateSign()
+     * and createSign() methods. Default hash function is SHA-1
+     *
+     * @var string
+     * @access private
+     */
+    var $_hash_func = 'sha1';
+
+    /**
+     * Crypt_RSA constructor.
+     *
+     * @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
+     *
+     * @access public
+     */
+    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;
+
+        if (!is_null($params)) {
+            if (!$this->setParams($params)) {
+                // error in Crypt_RSA::setParams() function
+                return;
+            }
+        }
+    }
+
+    /**
+     * Crypt_RSA factory.
+     *
+     * @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
+     *
+     * @return object  new Crypt_RSA object on success or PEAR_Error object on failure
+     * @access public
+     */
+    function &factory($params = null, $wrapper_name = 'default', $error_handler = '')
+    {
+        $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();
+        }
+        // object created successfully. Return it
+        return $obj;
+    }
+
+    /**
+     * 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
+     *
+     * @param array $params
+     *        associative array of permitted parameters (see above)
+     *
+     * @return bool   true on success or false on error
+     * @access public
+     */
+    function setParams($params)
+    {
+        if (!is_array($params)) {
+            $this->pushError('parameters must be passed to function as associative array', CRYPT_RSA_ERROR_WRONG_PARAMS);
+            return false;
+        }
+
+        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 (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;
+            }
+        }
+        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'];
+            }
+            else {
+                $this->pushError('wrong private key. It must be an object of Crypt_RSA_Key class', CRYPT_RSA_ERROR_WRONG_KEY);
+                return false;
+            }
+        }
+        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;
+            }
+        }
+        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'];
+        }
+        return true; // all ok
+    }
+
+    /**
+     * Ecnrypts $plain_data by the key $this->_enc_key or $key.
+     *
+     * @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
+     */
+    function encrypt($plain_data, $key = null)
+    {
+        $enc_data = $this->encryptBinary($plain_data, $key);
+        if ($enc_data !== false) {
+            return base64_encode($enc_data);
+        }
+        // error during encripting data
+        return false;
+    }
+
+    /**
+     * Ecnrypts $plain_data by the key $this->_enc_key or $key.
+     *
+     * @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
+     */
+    function encryptBinary($plain_data, $key = null)
+    {
+        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;
+        }
+
+        // append tail \x01 to plain data. It needs for correctly decrypting of data
+        $plain_data .= "\x01";
+
+        $plain_data = $this->_math_obj->bin2int($plain_data);
+        $exp = $this->_math_obj->bin2int($key->getExponent());
+        $modulus = $this->_math_obj->bin2int($key->getModulus());
+
+        // 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;
+        }
+        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
+     *
+     * @access public
+     */
+    function decrypt($enc_data, $key = null)
+    {
+        $enc_data = base64_decode($enc_data);
+        return $this->decryptBinary($enc_data, $key);
+    }
+
+    /**
+     * Decrypts $enc_data by the key $this->_dec_key or $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
+     *
+     * @access public
+     */
+    function decryptBinary($enc_data, $key = null)
+    {
+        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);
+            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;
+        }
+        $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);
+    }
+
+    /**
+     * 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.
+     *
+     * @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
+     *
+     * @access public
+     */
+    function createSign($document, $private_key = null, $hash_func = null)
+    {
+        // 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;
+        }
+
+        // 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 false;
+        }
+
+        return $this->encrypt($hash_func($document), $private_key);
+    }
+
+    /**
+     * Validates $signature for document $document with public key $this->_public_key
+     * or $public_key and hash function $this->_hash_func or $hash_func.
+     *
+     * @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
+     *
+     * @access public
+     */
+    function validateSign($document, $signature, $public_key = null, $hash_func = null)
+    {
+        // 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;
+        }
+
+        return $hash_func($document) == $this->decrypt($signature, $public_key);
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php b/plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php
new file mode 100644 (file)
index 0000000..8f39741
--- /dev/null
@@ -0,0 +1,234 @@
+<?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
new file mode 100644 (file)
index 0000000..6595302
--- /dev/null
@@ -0,0 +1,315 @@
+<?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
new file mode 100644 (file)
index 0000000..ecc0b7d
--- /dev/null
@@ -0,0 +1,804 @@
+<?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
new file mode 100644 (file)
index 0000000..646ff67
--- /dev/null
@@ -0,0 +1,482 @@
+<?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
new file mode 100644 (file)
index 0000000..b7ac24c
--- /dev/null
@@ -0,0 +1,313 @@
+<?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
new file mode 100644 (file)
index 0000000..54e4c34
--- /dev/null
@@ -0,0 +1,361 @@
+<?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
new file mode 100644 (file)
index 0000000..de6c946
--- /dev/null
@@ -0,0 +1,135 @@
+<?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/README b/plugins/OStatus/extlib/README
deleted file mode 100644 (file)
index 799b40c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-XML_Feed_Parser 1.0.3 is not currently actively maintained, and has
-a nasty bug which breaks getting the feed target link from WordPress
-feeds and possibly others that are RSS2-formatted but include an
-<atom:link> self-link element as well.
-
-Patch from this bug report is included:
-http://pear.php.net/bugs/bug.php?id=16416
-
-If upgrading, be sure that fix is included with the future upgrade!
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser.php b/plugins/OStatus/extlib/XML/Feed/Parser.php
deleted file mode 100755 (executable)
index ffe8220..0000000
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Key gateway class for XML_Feed_Parser package
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL
- * @version    CVS: $Id: Parser.php,v 1.24 2006/08/15 13:04:00 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * XML_Feed_Parser_Type is an abstract class required by all of our
- * feed types. It makes sense to load it here to keep the other files
- * clean.
- */
-require_once 'XML/Feed/Parser/Type.php';
-
-/**
- * We will throw exceptions when errors occur.
- */
-require_once 'XML/Feed/Parser/Exception.php';
-
-/**
- * This is the core of the XML_Feed_Parser package. It identifies feed types 
- * and abstracts access to them. It is an iterator, allowing for easy access 
- * to the entire feed.
- *
- * @author  James Stewart <james@jystewart.net>
- * @version Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser implements Iterator
-{
-    /**
-     * This is where we hold the feed object 
-     * @var Object
-     */
-    private $feed;
-
-    /**
-     * To allow for extensions, we make a public reference to the feed model 
-     * @var DOMDocument
-     */
-    public $model;
-    
-    /**
-     * A map between entry ID and offset
-     * @var array
-     */
-    protected $idMappings = array();
-
-    /**
-     * A storage space for Namespace URIs.
-     * @var array
-     */
-    private $feedNamespaces = array(
-        'rss2' => array(
-            'http://backend.userland.com/rss',
-            'http://backend.userland.com/rss2',
-            'http://blogs.law.harvard.edu/tech/rss'));
-    /**
-     * Detects feed types and instantiate appropriate objects.
-     *
-     * Our constructor takes care of detecting feed types and instantiating
-     * appropriate classes. For now we're going to treat Atom 0.3 as Atom 1.0
-     * but raise a warning. I do not intend to introduce full support for 
-     * Atom 0.3 as it has been deprecated, but others are welcome to.
-     *
-     * @param    string    $feed    XML serialization of the feed
-     * @param    bool    $strict    Whether or not to validate the feed
-     * @param    bool    $suppressWarnings Trigger errors for deprecated feed types?
-     * @param    bool    $tidy    Whether or not to try and use the tidy library on input
-     */
-    function __construct($feed, $strict = false, $suppressWarnings = false, $tidy = false)
-    {
-        $this->model = new DOMDocument;
-        if (! $this->model->loadXML($feed)) {
-            if (extension_loaded('tidy') && $tidy) {
-                $tidy = new tidy;
-                $tidy->parseString($feed, 
-                    array('input-xml' => true, 'output-xml' => true));
-                $tidy->cleanRepair();
-                if (! $this->model->loadXML((string) $tidy)) {
-                    throw new XML_Feed_Parser_Exception('Invalid input: this is not ' .
-                        'valid XML');
-                }
-            } else {
-                throw new XML_Feed_Parser_Exception('Invalid input: this is not valid XML');
-            }
-
-        }
-
-        /* detect feed type */
-        $doc_element = $this->model->documentElement;
-        $error = false;
-
-        switch (true) {
-            case ($doc_element->namespaceURI == 'http://www.w3.org/2005/Atom'):
-                require_once 'XML/Feed/Parser/Atom.php';
-                require_once 'XML/Feed/Parser/AtomElement.php';
-                $class = 'XML_Feed_Parser_Atom';
-                break;
-            case ($doc_element->namespaceURI == 'http://purl.org/atom/ns#'):
-                require_once 'XML/Feed/Parser/Atom.php';
-                require_once 'XML/Feed/Parser/AtomElement.php';
-                $class = 'XML_Feed_Parser_Atom';
-                $error = 'Atom 0.3 deprecated, using 1.0 parser which won\'t provide ' .
-                    'all options';
-                break;
-            case ($doc_element->namespaceURI == 'http://purl.org/rss/1.0/' || 
-                ($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1 
-                && $doc_element->childNodes->item(1)->namespaceURI == 
-                'http://purl.org/rss/1.0/')):
-                require_once 'XML/Feed/Parser/RSS1.php';
-                require_once 'XML/Feed/Parser/RSS1Element.php';
-                $class = 'XML_Feed_Parser_RSS1';
-                break;
-            case ($doc_element->namespaceURI == 'http://purl.org/rss/1.1/' || 
-                ($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1 
-                && $doc_element->childNodes->item(1)->namespaceURI == 
-                'http://purl.org/rss/1.1/')):
-                require_once 'XML/Feed/Parser/RSS11.php';
-                require_once 'XML/Feed/Parser/RSS11Element.php';
-                $class = 'XML_Feed_Parser_RSS11';
-                break;
-            case (($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1
-                && $doc_element->childNodes->item(1)->namespaceURI == 
-                'http://my.netscape.com/rdf/simple/0.9/') || 
-                $doc_element->namespaceURI == 'http://my.netscape.com/rdf/simple/0.9/'):
-                require_once 'XML/Feed/Parser/RSS09.php';
-                require_once 'XML/Feed/Parser/RSS09Element.php';
-                $class = 'XML_Feed_Parser_RSS09';
-                break;
-            case ($doc_element->tagName == 'rss' and
-                $doc_element->hasAttribute('version') && 
-                $doc_element->getAttribute('version') == 0.91):
-                $error = 'RSS 0.91 has been superceded by RSS2.0. Using RSS2.0 parser.';
-                require_once 'XML/Feed/Parser/RSS2.php';
-                require_once 'XML/Feed/Parser/RSS2Element.php';
-                $class = 'XML_Feed_Parser_RSS2';
-                break;
-            case ($doc_element->tagName == 'rss' and
-                $doc_element->hasAttribute('version') && 
-                $doc_element->getAttribute('version') == 0.92):
-                $error = 'RSS 0.92 has been superceded by RSS2.0. Using RSS2.0 parser.';
-                require_once 'XML/Feed/Parser/RSS2.php';
-                require_once 'XML/Feed/Parser/RSS2Element.php';
-                $class = 'XML_Feed_Parser_RSS2';
-                break;
-            case (in_array($doc_element->namespaceURI, $this->feedNamespaces['rss2'])
-                || $doc_element->tagName == 'rss'):
-                if (! $doc_element->hasAttribute('version') || 
-                    $doc_element->getAttribute('version') != 2) {
-                    $error = 'RSS version not specified. Parsing as RSS2.0';
-                }
-                require_once 'XML/Feed/Parser/RSS2.php';
-                require_once 'XML/Feed/Parser/RSS2Element.php';
-                $class = 'XML_Feed_Parser_RSS2';
-                break;
-            default:
-                throw new XML_Feed_Parser_Exception('Feed type unknown');
-                break;
-        }
-
-        if (! $suppressWarnings && ! empty($error)) {
-            trigger_error($error, E_USER_WARNING);
-        }
-
-        /* Instantiate feed object */
-        $this->feed = new $class($this->model, $strict);
-    }
-
-    /**
-     * Proxy to allow feed element names to be used as method names
-     *
-     * For top-level feed elements we will provide access using methods or 
-     * attributes. This function simply passes on a request to the appropriate 
-     * feed type object.
-     *
-     * @param   string  $call - the method being called
-     * @param   array   $attributes
-     */
-    function __call($call, $attributes)
-    {
-        $attributes = array_pad($attributes, 5, false);
-        list($a, $b, $c, $d, $e) = $attributes;
-        return $this->feed->$call($a, $b, $c, $d, $e);
-    }
-
-    /**
-     * Proxy to allow feed element names to be used as attribute names
-     *
-     * To allow variable-like access to feed-level data we use this
-     * method. It simply passes along to __call() which in turn passes
-     * along to the relevant object.
-     *
-     * @param   string  $val - the name of the variable required
-     */
-    function __get($val)
-    {
-        return $this->feed->$val;
-    }
-
-    /**
-     * Provides iteration functionality.
-     *
-     * Of course we must be able to iterate... This function simply increases
-     * our internal counter.
-     */
-    function next()
-    {
-        if (isset($this->current_item) && 
-            $this->current_item <= $this->feed->numberEntries - 1) {
-            ++$this->current_item;
-        } else if (! isset($this->current_item)) {
-            $this->current_item = 0;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Return XML_Feed_Type object for current element
-     *
-     * @return    XML_Feed_Parser_Type Object
-     */
-    function current()
-    {
-        return $this->getEntryByOffset($this->current_item);
-    }
-
-    /**
-     * For iteration -- returns the key for the current stage in the array.
-     *
-     * @return    int
-     */    
-    function key()
-    {
-        return $this->current_item;
-    }
-
-    /**
-     * For iteration -- tells whether we have reached the 
-     * end.
-     *
-     * @return    bool
-     */
-    function valid()
-    {
-        return $this->current_item < $this->feed->numberEntries;
-    }
-
-    /**
-     * For iteration -- resets the internal counter to the beginning.
-     */
-    function rewind()
-    {
-        $this->current_item = 0;
-    }
-
-    /**
-     * Provides access to entries by ID if one is specified in the source feed.
-     *
-     * As well as allowing the items to be iterated over we want to allow
-     * users to be able to access a specific entry. This is one of two ways of
-     * doing that, the other being by offset. This method can be quite slow
-     * if dealing with a large feed that hasn't yet been processed as it
-     * instantiates objects for every entry until it finds the one needed.
-     *
-     * @param    string    $id  Valid ID for the given feed format
-     * @return    XML_Feed_Parser_Type|false
-     */            
-    function getEntryById($id)
-    {
-        if (isset($this->idMappings[$id])) {
-            return $this->getEntryByOffset($this->idMappings[$id]);
-        }
-
-        /* 
-         * Since we have not yet encountered that ID, let's go through all the
-         * remaining entries in order till we find it.
-         * This is a fairly slow implementation, but it should work.
-         */
-        return $this->feed->getEntryById($id);
-    }
-
-    /**
-     * Retrieve entry by numeric offset, starting from zero.
-     *
-     * As well as allowing the items to be iterated over we want to allow
-     * users to be able to access a specific entry. This is one of two ways of
-     * doing that, the other being by ID.
-     *
-     * @param    int    $offset The position of the entry within the feed, starting from 0
-     * @return    XML_Feed_Parser_Type|false
-     */
-    function getEntryByOffset($offset)
-    {
-        if ($offset < $this->feed->numberEntries) {
-            if (isset($this->feed->entries[$offset])) {
-                return $this->feed->entries[$offset];
-            } else {
-                try {
-                    $this->feed->getEntryByOffset($offset);
-                } catch (Exception $e) {
-                    return false;
-                }
-                $id = $this->feed->entries[$offset]->getID();
-                $this->idMappings[$id] = $offset;
-                return $this->feed->entries[$offset];
-            }
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Retrieve version details from feed type class.
-     *
-     * @return void
-     * @author James Stewart
-     */
-    function version()
-    {
-        return $this->feed->version;
-    }
-    
-    /**
-     * Returns a string representation of the feed.
-     * 
-     * @return String
-     **/
-    function __toString()
-    {
-        return $this->feed->__toString();
-    }
-}
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/Atom.php b/plugins/OStatus/extlib/XML/Feed/Parser/Atom.php
deleted file mode 100644 (file)
index c7e218a..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Atom feed class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: Atom.php,v 1.29 2008/03/30 22:00:36 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
-*/
-
-/**
- * This is the class that determines how we manage Atom 1.0 feeds
- * 
- * How we deal with constructs:
- *  date - return as unix datetime for use with the 'date' function unless specified otherwise
- *  text - return as is. optional parameter will give access to attributes
- *  person - defaults to name, but parameter based access
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_Atom extends XML_Feed_Parser_Type
-{
-    /**
-     * The URI of the RelaxNG schema used to (optionally) validate the feed 
-     * @var string
-     */
-    private $relax = 'atom.rnc';
-
-    /**
-     * We're likely to use XPath, so let's keep it global 
-     * @var DOMXPath
-     */
-    public $xpath;
-
-    /**
-     * When performing XPath queries we will use this prefix 
-     * @var string
-     */
-    private $xpathPrefix = '//';
-
-    /**
-     * The feed type we are parsing 
-     * @var string
-     */
-    public $version = 'Atom 1.0';
-
-    /** 
-     * The class used to represent individual items 
-     * @var string
-     */
-    protected $itemClass = 'XML_Feed_Parser_AtomElement';
-    
-    /** 
-     * The element containing entries 
-     * @var string
-     */
-    protected $itemElement = 'entry';
-
-    /**
-     * Here we map those elements we're not going to handle individually
-     * to the constructs they are. The optional second parameter in the array
-     * tells the parser whether to 'fall back' (not apt. at the feed level) or
-     * fail if the element is missing. If the parameter is not set, the function
-     * will simply return false and leave it to the client to decide what to do.
-     * @var array
-     */
-    protected $map = array(
-        'author' => array('Person'),
-        'contributor' => array('Person'),
-        'icon' => array('Text'),
-        'logo' => array('Text'),
-        'id' => array('Text', 'fail'),
-        'rights' => array('Text'),
-        'subtitle' => array('Text'),
-        'title' => array('Text', 'fail'),
-        'updated' => array('Date', 'fail'),
-        'link' => array('Link'),
-        'generator' => array('Text'),
-        'category' => array('Category'));
-
-    /**
-     * Here we provide a few mappings for those very special circumstances in
-     * which it makes sense to map back to the RSS2 spec. Key is RSS2 version
-     * value is an array consisting of the equivalent in atom and any attributes
-     * needed to make the mapping.
-     * @var array
-     */
-    protected $compatMap = array(
-        'guid' => array('id'),
-        'links' => array('link'),
-        'tags' => array('category'),
-        'contributors' => array('contributor'));
-
-    /**
-     * Our constructor does nothing more than its parent.
-     * 
-     * @param    DOMDocument    $xml    A DOM object representing the feed
-     * @param    bool (optional) $string    Whether or not to validate this feed
-     */
-    function __construct(DOMDocument $model, $strict = false)
-    {
-        $this->model = $model;
-
-        if ($strict) {
-            if (! $this->model->relaxNGValidateSource($this->relax)) {
-                throw new XML_Feed_Parser_Exception('Failed required validation');
-            }
-        }
-
-        $this->xpath = new DOMXPath($this->model);
-        $this->xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
-        $this->numberEntries = $this->count('entry');
-    }
-
-    /**
-     * Implement retrieval of an entry based on its ID for atom feeds.
-     *
-     * This function uses XPath to get the entry based on its ID. If DOMXPath::evaluate
-     * is available, we also use that to store a reference to the entry in the array
-     * used by getEntryByOffset so that method does not have to seek out the entry
-     * if it's requested that way.
-     * 
-     * @param    string    $id    any valid Atom ID.
-     * @return    XML_Feed_Parser_AtomElement
-     */
-    function getEntryById($id)
-    {
-        if (isset($this->idMappings[$id])) {
-            return $this->entries[$this->idMappings[$id]];
-        }
-
-        $entries = $this->xpath->query("//atom:entry[atom:id='$id']");
-
-        if ($entries->length > 0) {
-            $xmlBase = $entries->item(0)->baseURI;
-            $entry = new $this->itemClass($entries->item(0), $this, $xmlBase);
-            
-            if (in_array('evaluate', get_class_methods($this->xpath))) {
-                $offset = $this->xpath->evaluate("count(preceding-sibling::atom:entry)", $entries->item(0));
-                $this->entries[$offset] = $entry;
-            }
-
-            $this->idMappings[$id] = $entry;
-
-            return $entry;
-        }
-        
-    }
-
-    /**
-     * Retrieves data from a person construct.
-     *
-     * Get a person construct. We default to the 'name' element but allow
-     * access to any of the elements.
-     * 
-     * @param    string    $method    The name of the person construct we want
-     * @param    array     $arguments    An array which we hope gives a 'param'
-     * @return    string|false
-     */
-    protected function getPerson($method, $arguments)
-    {
-        $offset = empty($arguments[0]) ? 0 : $arguments[0];
-        $parameter = empty($arguments[1]['param']) ? 'name' : $arguments[1]['param'];
-        $section = $this->model->getElementsByTagName($method);
-        
-        if ($parameter == 'url') {
-            $parameter = 'uri';
-        }
-
-        if ($section->length <= $offset) {
-            return false;
-        }
-
-        $param = $section->item($offset)->getElementsByTagName($parameter);
-        if ($param->length == 0) {
-            return false;
-        }
-        return $param->item(0)->nodeValue;
-    }
-
-    /**
-     * Retrieves an element's content where that content is a text construct.
-     *
-     * Get a text construct. When calling this method, the two arguments
-     * allowed are 'offset' and 'attribute', so $parser->subtitle() would
-     * return the content of the element, while $parser->subtitle(false, 'type')
-     * would return the value of the type attribute.
-     *
-     * @todo    Clarify overlap with getContent()
-     * @param    string    $method    The name of the text construct we want
-     * @param    array     $arguments    An array which we hope gives a 'param'
-     * @return    string
-     */
-    protected function getText($method, $arguments)
-    {
-        $offset = empty($arguments[0]) ? 0: $arguments[0];
-        $attribute = empty($arguments[1]) ? false : $arguments[1];
-        $tags = $this->model->getElementsByTagName($method);
-
-        if ($tags->length <= $offset) {
-            return false;
-        }
-
-        $content = $tags->item($offset);
-
-        if (! $content->hasAttribute('type')) {
-            $content->setAttribute('type', 'text');
-        }
-        $type = $content->getAttribute('type');
-
-        if (! empty($attribute) and 
-            ! ($method == 'generator' and $attribute == 'name')) {
-            if ($content->hasAttribute($attribute)) {
-                return $content->getAttribute($attribute);
-            } else if ($attribute == 'href' and $content->hasAttribute('uri')) {
-                return $content->getAttribute('uri');
-            }
-            return false;
-        }
-
-        return $this->parseTextConstruct($content);
-    }
-    
-    /**
-     * Extract content appropriately from atom text constructs
-     *
-     * Because of different rules applied to the content element and other text
-     * constructs, they are deployed as separate functions, but they share quite
-     * a bit of processing. This method performs the core common process, which is
-     * to apply the rules for different mime types in order to extract the content.
-     *
-     * @param   DOMNode $content    the text construct node to be parsed
-     * @return String
-     * @author James Stewart
-     **/
-    protected function parseTextConstruct(DOMNode $content)
-    {
-        if ($content->hasAttribute('type')) {
-            $type = $content->getAttribute('type');
-        } else {
-            $type = 'text';
-        }
-
-        if (strpos($type, 'text/') === 0) {
-            $type = 'text';
-        }
-
-        switch ($type) {
-            case 'text':
-            case 'html':
-                return $content->textContent;
-                break;
-            case 'xhtml':
-                $container = $content->getElementsByTagName('div');
-                if ($container->length == 0) {
-                    return false;
-                }
-                $contents = $container->item(0);
-                if ($contents->hasChildNodes()) {
-                    /* Iterate through, applying xml:base and store the result */
-                    $result = '';
-                    foreach ($contents->childNodes as $node) {
-                        $result .= $this->traverseNode($node);
-                    }
-                    return $result;
-                }
-                break;
-            case preg_match('@^[a-zA-Z]+/[a-zA-Z+]*xml@i', $type) > 0:
-                return $content;
-                break;
-            case 'application/octet-stream':
-            default:
-                return base64_decode(trim($content->nodeValue));
-                break;
-        }
-        return false;
-    }
-    /**
-     * Get a category from the entry.
-     *
-     * A feed or entry can have any number of categories. A category can have the
-     * attributes term, scheme and label.
-     * 
-     * @param    string    $method    The name of the text construct we want
-     * @param    array     $arguments    An array which we hope gives a 'param'
-     * @return    string
-     */
-    function getCategory($method, $arguments)
-    {
-        $offset = empty($arguments[0]) ? 0: $arguments[0];
-        $attribute = empty($arguments[1]) ? 'term' : $arguments[1];
-        $categories = $this->model->getElementsByTagName('category');
-        if ($categories->length <= $offset) {
-            $category = $categories->item($offset);
-            if ($category->hasAttribute($attribute)) {
-                return $category->getAttribute($attribute);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * This element must be present at least once with rel="feed". This element may be 
-     * present any number of further times so long as there is no clash. If no 'rel' is 
-     * present and we're asked for one, we follow the example of the Universal Feed
-     * Parser and presume 'alternate'.
-     *
-     * @param    int    $offset    the position of the link within the container
-     * @param    string    $attribute    the attribute name required
-     * @param    array     an array of attributes to search by
-     * @return    string    the value of the attribute
-     */
-    function getLink($offset = 0, $attribute = 'href', $params = false)
-    {
-        if (is_array($params) and !empty($params)) {
-            $terms = array();
-            $alt_predicate = '';
-            $other_predicate = '';
-
-            foreach ($params as $key => $value) {
-                if ($key == 'rel' && $value == 'alternate') {
-                    $alt_predicate = '[not(@rel) or @rel="alternate"]';
-                } else {
-                    $terms[] = "@$key='$value'";
-                }
-            }
-            if (!empty($terms)) {
-                $other_predicate = '[' . join(' and ', $terms) . ']';
-            }
-            $query =  $this->xpathPrefix . 'atom:link' . $alt_predicate . $other_predicate;
-            $links = $this->xpath->query($query);
-        } else {
-            $links = $this->model->getElementsByTagName('link');
-        }
-        if ($links->length > $offset) {
-            if ($links->item($offset)->hasAttribute($attribute)) {
-                $value = $links->item($offset)->getAttribute($attribute);
-                if ($attribute == 'href') {
-                    $value = $this->addBase($value, $links->item($offset));
-                }
-                return $value;
-            } else if ($attribute == 'rel') {
-                return 'alternate';
-            }
-        }
-        return false;
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php b/plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php
deleted file mode 100755 (executable)
index 063ecb6..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * AtomElement class for XML_Feed_Parser package
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: AtomElement.php,v 1.19 2007/03/26 12:43:11 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class provides support for atom entries. It will usually be called by
- * XML_Feed_Parser_Atom with which it shares many methods.
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_AtomElement extends XML_Feed_Parser_Atom
-{
-    /**
-     * This will be a reference to the parent object for when we want
-     * to use a 'fallback' rule 
-     * @var XML_Feed_Parser_Atom
-     */
-    protected $parent;
-
-    /**
-     * When performing XPath queries we will use this prefix 
-     * @var string
-     */
-    private $xpathPrefix = '';
-    
-    /**
-     * xml:base values inherited by the element 
-     * @var string
-     */
-    protected $xmlBase;
-
-    /**
-     * Here we provide a few mappings for those very special circumstances in
-     * which it makes sense to map back to the RSS2 spec or to manage other
-     * compatibilities (eg. with the Univeral Feed Parser). Key is the other version's
-     * name for the command, value is an array consisting of the equivalent in our atom 
-     * api and any attributes needed to make the mapping.
-     * @var array
-     */
-    protected $compatMap = array(
-        'guid' => array('id'),
-        'links' => array('link'),
-        'tags' => array('category'),
-        'contributors' => array('contributor'));
-        
-    /**
-     * Our specific element map 
-     * @var array
-     */
-    protected $map = array(
-        'author' => array('Person', 'fallback'),
-        'contributor' => array('Person'),
-        'id' => array('Text', 'fail'),
-        'published' => array('Date'),
-        'updated' => array('Date', 'fail'),
-        'title' => array('Text', 'fail'),
-        'rights' => array('Text', 'fallback'),
-        'summary' => array('Text'),
-        'content' => array('Content'),
-        'link' => array('Link'),
-        'enclosure' => array('Enclosure'),
-        'category' => array('Category'));
-
-    /**
-     * Store useful information for later.
-     *
-     * @param   DOMElement  $element - this item as a DOM element
-     * @param   XML_Feed_Parser_Atom    $parent - the feed of which this is a member
-     */
-    function __construct(DOMElement $element, $parent, $xmlBase = '')
-    {
-        $this->model = $element;
-        $this->parent = $parent;
-        $this->xmlBase = $xmlBase;
-        $this->xpathPrefix = "//atom:entry[atom:id='" . $this->id . "']/";
-        $this->xpath = $this->parent->xpath;
-    }
-
-    /**
-     * Provides access to specific aspects of the author data for an atom entry
-     *
-     * Author data at the entry level is more complex than at the feed level.
-     * If atom:author is not present for the entry we need to look for it in
-     * an atom:source child of the atom:entry. If it's not there either, then
-     * we look to the parent for data.
-     *
-     * @param   array
-     * @return  string
-     */
-    function getAuthor($arguments)
-    {
-        /* Find out which part of the author data we're looking for */
-        if (isset($arguments['param'])) {
-            $parameter = $arguments['param'];
-        } else {
-            $parameter = 'name';
-        }
-        
-        $test = $this->model->getElementsByTagName('author');
-        if ($test->length > 0) {
-            $item = $test->item(0);
-            return $item->getElementsByTagName($parameter)->item(0)->nodeValue;
-        }
-        
-        $source = $this->model->getElementsByTagName('source');
-        if ($source->length > 0) {
-            $test = $this->model->getElementsByTagName('author');
-            if ($test->length > 0) {
-                $item = $test->item(0);
-                return $item->getElementsByTagName($parameter)->item(0)->nodeValue;
-            }
-        }
-        return $this->parent->getAuthor($arguments);
-    }
-
-    /**
-     * Returns the content of the content element or info on a specific attribute
-     *
-     * This element may or may not be present. It cannot be present more than
-     * once. It may have a 'src' attribute, in which case there's no content
-     * If not present, then the entry must have link with rel="alternate".
-     * If there is content we return it, if not and there's a 'src' attribute
-     * we return the value of that instead. The method can take an 'attribute'
-     * argument, in which case we return the value of that attribute if present.
-     * eg. $item->content("type") will return the type of the content. It is
-     * recommended that all users check the type before getting the content to
-     * ensure that their script is capable of handling the type of returned data.
-     * (data carried in the content element can be either 'text', 'html', 'xhtml', 
-     * or any standard MIME type).
-     *
-     * @return  string|false
-     */
-    protected function getContent($method, $arguments = array())
-    {
-        $attribute = empty($arguments[0]) ? false : $arguments[0];
-        $tags = $this->model->getElementsByTagName('content');
-
-        if ($tags->length == 0) {
-            return false;
-        }
-
-        $content = $tags->item(0);
-
-        if (! $content->hasAttribute('type')) {
-            $content->setAttribute('type', 'text');
-        }
-        if (! empty($attribute)) {
-            return $content->getAttribute($attribute);
-        }
-
-        $type = $content->getAttribute('type');
-
-        if (! empty($attribute)) {
-            if ($content->hasAttribute($attribute))
-            {
-                return $content->getAttribute($attribute);
-            }
-            return false;
-        }
-
-        if ($content->hasAttribute('src')) {
-            return $content->getAttribute('src');
-        }
-
-        return $this->parseTextConstruct($content);
-     }
-
-    /**
-     * For compatibility, this method provides a mapping to access enclosures.
-     *
-     * The Atom spec doesn't provide for an enclosure element, but it is
-     * generally supported using the link element with rel='enclosure'.
-     *
-     * @param   string  $method - for compatibility with our __call usage
-     * @param   array   $arguments - for compatibility with our __call usage
-     * @return  array|false
-     */
-    function getEnclosure($method, $arguments = array())
-    {
-        $offset = isset($arguments[0]) ? $arguments[0] : 0;
-        $query = "//atom:entry[atom:id='" . $this->getText('id', false) . 
-            "']/atom:link[@rel='enclosure']";
-
-        $encs = $this->parent->xpath->query($query);
-        if ($encs->length > $offset) {
-            try {
-                if (! $encs->item($offset)->hasAttribute('href')) {
-                    return false;
-                }
-                $attrs = $encs->item($offset)->attributes;
-                $length = $encs->item($offset)->hasAttribute('length') ? 
-                    $encs->item($offset)->getAttribute('length') : false;
-                return array(
-                    'url' => $attrs->getNamedItem('href')->value,
-                    'type' => $attrs->getNamedItem('type')->value,
-                    'length' => $length);
-            } catch (Exception $e) {
-                return false;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Get details of this entry's source, if available/relevant
-     *
-     * Where an atom:entry is taken from another feed then the aggregator
-     * is supposed to include an atom:source element which replicates at least
-     * the atom:id, atom:title, and atom:updated metadata from the original
-     * feed. Atom:source therefore has a very similar structure to atom:feed
-     * and if we find it we will return it as an XML_Feed_Parser_Atom object.
-     *
-     * @return  XML_Feed_Parser_Atom|false
-     */
-    function getSource()
-    {
-        $test = $this->model->getElementsByTagName('source');
-        if ($test->length == 0) {
-            return false;
-        }
-        $source = new XML_Feed_Parser_Atom($test->item(0));
-    }
-
-    /**
-     * Get the entry as an XML string
-     *
-     * Return an XML serialization of the feed, should it be required. Most 
-     * users however, will already have a serialization that they used when 
-     * instantiating the object.
-     *
-     * @return    string    XML serialization of element
-     */    
-    function __toString()
-    {
-        $simple = simplexml_import_dom($this->model);
-        return $simple->asXML();
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/Exception.php b/plugins/OStatus/extlib/XML/Feed/Parser/Exception.php
deleted file mode 100755 (executable)
index 1e76e3f..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Keeps the exception class for XML_Feed_Parser.
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL
- * @version    CVS: $Id: Exception.php,v 1.3 2005/11/07 01:52:35 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-/**
- * We are extending PEAR_Exception
- */
-require_once 'PEAR/Exception.php';
-
-/**
- * XML_Feed_Parser_Exception is a simple extension of PEAR_Exception, existing
- * to help with identification of the source of exceptions.
- *
- * @author  James Stewart <james@jystewart.net>
- * @version Release: 1.0.3
- * @package XML_Feed_Parser
- */ 
-class XML_Feed_Parser_Exception extends PEAR_Exception
-{
-
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php
deleted file mode 100755 (executable)
index 07f38f9..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS0.9 class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS09.php,v 1.5 2006/07/26 21:18:46 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class handles RSS0.9 feeds.
- * 
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- * @todo    Find a Relax NG URI we can use
- */
-class XML_Feed_Parser_RSS09 extends XML_Feed_Parser_Type
-{
-    /**
-     * The URI of the RelaxNG schema used to (optionally) validate the feed 
-     * @var string
-     */
-    private $relax = '';
-
-    /**
-     * We're likely to use XPath, so let's keep it global
-     * @var DOMXPath
-     */
-    protected $xpath;
-
-    /**
-     * The feed type we are parsing 
-     * @var string
-     */
-    public $version = 'RSS 0.9';
-
-    /**
-     * The class used to represent individual items 
-     * @var string
-     */
-    protected $itemClass = 'XML_Feed_Parser_RSS09Element';
-    
-    /**
-     * The element containing entries 
-     * @var string
-     */
-    protected $itemElement = 'item';
-
-    /**
-     * Here we map those elements we're not going to handle individually
-     * to the constructs they are. The optional second parameter in the array
-     * tells the parser whether to 'fall back' (not apt. at the feed level) or
-     * fail if the element is missing. If the parameter is not set, the function
-     * will simply return false and leave it to the client to decide what to do.
-     * @var array
-     */
-    protected $map = array(
-        'title' => array('Text'),
-        'link' => array('Text'),
-        'description' => array('Text'),
-        'image' => array('Image'),
-        'textinput' => array('TextInput'));
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS2.
-     * @var array
-     */
-    protected $compatMap = array(
-        'title' => array('title'),
-        'link' => array('link'),
-        'subtitle' => array('description'));
-
-    /**
-     * We will be working with multiple namespaces and it is useful to 
-     * keep them together 
-     * @var array
-     */
-    protected $namespaces = array(
-        'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
-
-    /**
-     * Our constructor does nothing more than its parent.
-     * 
-     * @todo    RelaxNG validation
-     * @param    DOMDocument    $xml    A DOM object representing the feed
-     * @param    bool (optional) $string    Whether or not to validate this feed
-     */
-    function __construct(DOMDocument $model, $strict = false)
-    {
-        $this->model = $model;
-
-        $this->xpath = new DOMXPath($model);
-        foreach ($this->namespaces as $key => $value) {
-            $this->xpath->registerNamespace($key, $value);
-        }            
-        $this->numberEntries = $this->count('item');
-    }
-
-    /**
-     * Included for compatibility -- will not work with RSS 0.9
-     *
-     * This is not something that will work with RSS0.9 as it does not have
-     * clear restrictions on the global uniqueness of IDs.
-     *
-     * @param    string    $id    any valid ID.
-     * @return    false
-     */
-    function getEntryById($id)
-    {
-        return false;        
-    }
-
-    /**
-     * Get details of the image associated with the feed.
-     *
-     * @return  array|false an array simply containing the child elements
-     */
-    protected function getImage()
-    {
-        $images = $this->model->getElementsByTagName('image');
-        if ($images->length > 0) {
-            $image = $images->item(0);
-            $details = array();
-            if ($image->hasChildNodes()) {
-                $details = array(
-                    'title' => $image->getElementsByTagName('title')->item(0)->value,
-                    'link' => $image->getElementsByTagName('link')->item(0)->value,
-                    'url' => $image->getElementsByTagName('url')->item(0)->value);
-            } else {
-                $details = array('title' => false,
-                    'link' => false,
-                    'url' => $image->attributes->getNamedItem('resource')->nodeValue);
-            }
-            $details = array_merge($details, 
-                array('description' => false, 'height' => false, 'width' => false));
-            if (! empty($details)) {
-                return $details;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * The textinput element is little used, but in the interests of
-     * completeness we will support it.
-     *
-     * @return  array|false
-     */
-    protected function getTextInput()
-    {
-        $inputs = $this->model->getElementsByTagName('textinput');
-        if ($inputs->length > 0) {
-            $input = $inputs->item(0);
-            $results = array();
-            $results['title'] = isset(
-                $input->getElementsByTagName('title')->item(0)->value) ? 
-                $input->getElementsByTagName('title')->item(0)->value : null;
-            $results['description'] = isset(
-                $input->getElementsByTagName('description')->item(0)->value) ? 
-                $input->getElementsByTagName('description')->item(0)->value : null;
-            $results['name'] = isset(
-                $input->getElementsByTagName('name')->item(0)->value) ? 
-                $input->getElementsByTagName('name')->item(0)->value : null;
-            $results['link'] = isset(
-                   $input->getElementsByTagName('link')->item(0)->value) ? 
-                   $input->getElementsByTagName('link')->item(0)->value : null;
-            if (empty($results['link']) && 
-                $input->attributes->getNamedItem('resource')) {
-                $results['link'] = $input->attributes->getNamedItem('resource')->nodeValue;
-            }
-            if (! empty($results)) {
-                return $results;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Get details of a link from the feed.
-     *
-     * In RSS1 a link is a text element but in order to ensure that we resolve
-     * URLs properly we have a special function for them.
-     *
-     * @return  string
-     */
-    function getLink($offset = 0, $attribute = 'href', $params = false)
-    {
-        $links = $this->model->getElementsByTagName('link');
-        if ($links->length <= $offset) {
-            return false;
-        }
-        $link = $links->item($offset);
-        return $this->addBase($link->nodeValue, $link);
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php
deleted file mode 100755 (executable)
index d41f36e..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS0.9 Element class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS09Element.php,v 1.4 2006/06/30 17:41:56 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/*
- * This class provides support for RSS 0.9 entries. It will usually be called by
- * XML_Feed_Parser_RSS09 with which it shares many methods.
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_RSS09Element extends XML_Feed_Parser_RSS09
-{
-    /**
-     * This will be a reference to the parent object for when we want
-     * to use a 'fallback' rule 
-     * @var XML_Feed_Parser_RSS09
-     */
-    protected $parent;
-
-    /**
-     * Our specific element map 
-     * @var array
-     */
-    protected $map = array(
-        'title' => array('Text'),
-        'link' => array('Link'));
-
-    /**
-     * Store useful information for later.
-     *
-     * @param   DOMElement  $element - this item as a DOM element
-     * @param   XML_Feed_Parser_RSS1 $parent - the feed of which this is a member
-     */
-    function __construct(DOMElement $element, $parent, $xmlBase = '')
-    {
-        $this->model = $element;
-        $this->parent = $parent;
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php
deleted file mode 100755 (executable)
index 60c9938..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS1 class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS1.php,v 1.10 2006/07/27 13:52:05 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class handles RSS1.0 feeds.
- * 
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- * @todo    Find a Relax NG URI we can use
- */
-class XML_Feed_Parser_RSS1 extends XML_Feed_Parser_Type
-{
-    /**
-     * The URI of the RelaxNG schema used to (optionally) validate the feed 
-     * @var string
-     */
-    private $relax = 'rss10.rnc';
-
-    /**
-     * We're likely to use XPath, so let's keep it global
-     * @var DOMXPath
-     */
-    protected $xpath;
-
-    /**
-     * The feed type we are parsing 
-     * @var string
-     */
-    public $version = 'RSS 1.0';
-
-    /**
-     * The class used to represent individual items 
-     * @var string
-     */
-    protected $itemClass = 'XML_Feed_Parser_RSS1Element';
-    
-    /**
-     * The element containing entries 
-     * @var string
-     */
-    protected $itemElement = 'item';
-
-    /**
-     * Here we map those elements we're not going to handle individually
-     * to the constructs they are. The optional second parameter in the array
-     * tells the parser whether to 'fall back' (not apt. at the feed level) or
-     * fail if the element is missing. If the parameter is not set, the function
-     * will simply return false and leave it to the client to decide what to do.
-     * @var array
-     */
-    protected $map = array(
-        'title' => array('Text'),
-        'link' => array('Text'),
-        'description' => array('Text'),
-        'image' => array('Image'),
-        'textinput' => array('TextInput'),
-        'updatePeriod' => array('Text'),
-        'updateFrequency' => array('Text'),
-        'updateBase' => array('Date'),
-        'rights' => array('Text'), # dc:rights
-        'description' => array('Text'), # dc:description
-        'creator' => array('Text'), # dc:creator
-        'publisher' => array('Text'), # dc:publisher
-        'contributor' => array('Text'), # dc:contributor
-        'date' => array('Date') # dc:contributor
-        );
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS2.
-     * @var array
-     */
-    protected $compatMap = array(
-        'title' => array('title'),
-        'link' => array('link'),
-        'subtitle' => array('description'),
-        'author' => array('creator'),
-        'updated' => array('date'));
-
-    /**
-     * We will be working with multiple namespaces and it is useful to 
-     * keep them together 
-     * @var array
-     */
-    protected $namespaces = array(
-        'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-        'rss' => 'http://purl.org/rss/1.0/',
-        'dc' => 'http://purl.org/rss/1.0/modules/dc/',
-        'content' => 'http://purl.org/rss/1.0/modules/content/',
-        'sy' => 'http://web.resource.org/rss/1.0/modules/syndication/');
-
-    /**
-     * Our constructor does nothing more than its parent.
-     * 
-     * @param    DOMDocument    $xml    A DOM object representing the feed
-     * @param    bool (optional) $string    Whether or not to validate this feed
-     */
-    function __construct(DOMDocument $model, $strict = false)
-    {
-        $this->model = $model;
-        if ($strict) {
-            $validate = $this->model->relaxNGValidate(self::getSchemaDir . 
-                DIRECTORY_SEPARATOR . $this->relax);
-            if (! $validate) {
-                throw new XML_Feed_Parser_Exception('Failed required validation');
-            }
-        }
-
-        $this->xpath = new DOMXPath($model);
-        foreach ($this->namespaces as $key => $value) {
-            $this->xpath->registerNamespace($key, $value);
-        }
-        $this->numberEntries = $this->count('item');
-    }
-
-    /**
-     * Allows retrieval of an entry by ID where the rdf:about attribute is used
-     *
-     * This is not really something that will work with RSS1 as it does not have
-     * clear restrictions on the global uniqueness of IDs. We will employ the
-     * _very_ hit and miss method of selecting entries based on the rdf:about
-     * attribute. If DOMXPath::evaluate is available, we also use that to store 
-     * a reference to the entry in the array used by getEntryByOffset so that 
-     * method does not have to seek out the entry if it's requested that way.
-     *
-     * @param    string    $id    any valid ID.
-     * @return    XML_Feed_Parser_RSS1Element
-     */
-    function getEntryById($id)
-    {
-        if (isset($this->idMappings[$id])) {
-            return $this->entries[$this->idMappings[$id]];
-        }
-
-        $entries = $this->xpath->query("//rss:item[@rdf:about='$id']");
-        if ($entries->length > 0) {
-            $classname = $this->itemClass;
-            $entry = new $classname($entries->item(0), $this);
-            if (in_array('evaluate', get_class_methods($this->xpath))) {
-                $offset = $this->xpath->evaluate("count(preceding-sibling::rss:item)", $entries->item(0));
-                $this->entries[$offset] = $entry;
-            }
-            $this->idMappings[$id] = $entry;
-            return $entry;
-        }
-        return false;
-    }
-
-    /**
-     * Get details of the image associated with the feed.
-     *
-     * @return  array|false an array simply containing the child elements
-     */
-    protected function getImage()
-    {
-        $images = $this->model->getElementsByTagName('image');
-        if ($images->length > 0) {
-            $image = $images->item(0);
-            $details = array();
-            if ($image->hasChildNodes()) {
-                $details = array(
-                    'title' => $image->getElementsByTagName('title')->item(0)->value,
-                    'link' => $image->getElementsByTagName('link')->item(0)->value,
-                    'url' => $image->getElementsByTagName('url')->item(0)->value);
-            } else {
-                $details = array('title' => false,
-                    'link' => false,
-                    'url' => $image->attributes->getNamedItem('resource')->nodeValue);
-            }
-            $details = array_merge($details, array('description' => false, 'height' => false, 'width' => false));
-            if (! empty($details)) {
-                return $details;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * The textinput element is little used, but in the interests of
-     * completeness we will support it.
-     *
-     * @return  array|false
-     */
-    protected function getTextInput()
-    {
-        $inputs = $this->model->getElementsByTagName('textinput');
-        if ($inputs->length > 0) {
-            $input = $inputs->item(0);
-            $results = array();
-            $results['title'] = isset(
-                $input->getElementsByTagName('title')->item(0)->value) ? 
-                $input->getElementsByTagName('title')->item(0)->value : null;
-            $results['description'] = isset(
-                $input->getElementsByTagName('description')->item(0)->value) ? 
-                $input->getElementsByTagName('description')->item(0)->value : null;
-            $results['name'] = isset(
-                $input->getElementsByTagName('name')->item(0)->value) ? 
-                $input->getElementsByTagName('name')->item(0)->value : null;
-            $results['link'] = isset(
-                   $input->getElementsByTagName('link')->item(0)->value) ? 
-                   $input->getElementsByTagName('link')->item(0)->value : null;
-            if (empty($results['link']) and 
-                $input->attributes->getNamedItem('resource')) {
-                $results['link'] = 
-                    $input->attributes->getNamedItem('resource')->nodeValue;
-            }
-            if (! empty($results)) {
-                return $results;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Employs various techniques to identify the author
-     *
-     * Dublin Core provides the dc:creator, dc:contributor, and dc:publisher
-     * elements for defining authorship in RSS1. We will try each of those in
-     * turn in order to simulate the atom author element and will return it
-     * as text.
-     *
-     * @return  array|false
-     */
-    function getAuthor()
-    {
-        $options = array('creator', 'contributor', 'publisher');
-        foreach ($options as $element) {
-            $test = $this->model->getElementsByTagName($element);
-            if ($test->length > 0) {
-                return $test->item(0)->value;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Retrieve a link
-     * 
-     * In RSS1 a link is a text element but in order to ensure that we resolve
-     * URLs properly we have a special function for them.
-     *
-     * @return  string
-     */
-    function getLink($offset = 0, $attribute = 'href', $params = false)
-    {
-        $links = $this->model->getElementsByTagName('link');
-        if ($links->length <= $offset) {
-            return false;
-        }
-        $link = $links->item($offset);
-        return $this->addBase($link->nodeValue, $link);
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php
deleted file mode 100755 (executable)
index 3cd1ef1..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS1.1 class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS11.php,v 1.6 2006/07/27 13:52:05 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class handles RSS1.1 feeds. RSS1.1 is documented at:
- * http://inamidst.com/rss1.1/
- * 
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- * @todo    Support for RDF:List
- * @todo    Ensure xml:lang is accessible to users
- */
-class XML_Feed_Parser_RSS11 extends XML_Feed_Parser_Type
-{
-    /**
-     * The URI of the RelaxNG schema used to (optionally) validate the feed 
-     * @var string
-     */
-    private $relax = 'rss11.rnc';
-
-    /**
-     * We're likely to use XPath, so let's keep it global
-     * @var DOMXPath
-     */
-    protected $xpath;
-
-    /**
-     * The feed type we are parsing 
-     * @var string
-     */
-    public $version = 'RSS 1.0';
-
-    /**
-     * The class used to represent individual items 
-     * @var string
-     */
-    protected $itemClass = 'XML_Feed_Parser_RSS1Element';
-    
-    /**
-     * The element containing entries 
-     * @var string
-     */
-    protected $itemElement = 'item';
-
-    /**
-     * Here we map those elements we're not going to handle individually
-     * to the constructs they are. The optional second parameter in the array
-     * tells the parser whether to 'fall back' (not apt. at the feed level) or
-     * fail if the element is missing. If the parameter is not set, the function
-     * will simply return false and leave it to the client to decide what to do.
-     * @var array
-     */
-    protected $map = array(
-        'title' => array('Text'),
-        'link' => array('Text'),
-        'description' => array('Text'),
-        'image' => array('Image'),
-        'updatePeriod' => array('Text'),
-        'updateFrequency' => array('Text'),
-        'updateBase' => array('Date'),
-        'rights' => array('Text'), # dc:rights
-        'description' => array('Text'), # dc:description
-        'creator' => array('Text'), # dc:creator
-        'publisher' => array('Text'), # dc:publisher
-        'contributor' => array('Text'), # dc:contributor
-        'date' => array('Date') # dc:contributor
-        );
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS2.
-     * @var array
-     */
-    protected $compatMap = array(
-        'title' => array('title'),
-        'link' => array('link'),
-        'subtitle' => array('description'),
-        'author' => array('creator'),
-        'updated' => array('date'));
-
-    /**
-     * We will be working with multiple namespaces and it is useful to 
-     * keep them together. We will retain support for some common RSS1.0 modules
-     * @var array
-     */
-    protected $namespaces = array(
-        'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-        'rss' => 'http://purl.org/net/rss1.1#',
-        'dc' => 'http://purl.org/rss/1.0/modules/dc/',
-        'content' => 'http://purl.org/rss/1.0/modules/content/',
-        'sy' => 'http://web.resource.org/rss/1.0/modules/syndication/');
-
-    /**
-     * Our constructor does nothing more than its parent.
-     * 
-     * @param    DOMDocument    $xml    A DOM object representing the feed
-     * @param    bool (optional) $string    Whether or not to validate this feed
-     */
-    function __construct(DOMDocument $model, $strict = false)
-    {
-        $this->model = $model;
-
-        if ($strict) {
-            $validate = $this->model->relaxNGValidate(self::getSchemaDir . 
-                DIRECTORY_SEPARATOR . $this->relax);
-            if (! $validate) {
-                throw new XML_Feed_Parser_Exception('Failed required validation');
-            }
-        }
-
-        $this->xpath = new DOMXPath($model);
-        foreach ($this->namespaces as $key => $value) {
-            $this->xpath->registerNamespace($key, $value);
-        }            
-        $this->numberEntries = $this->count('item');
-    }
-
-    /**
-     * Attempts to identify an element by ID given by the rdf:about attribute
-     *
-     * This is not really something that will work with RSS1.1 as it does not have
-     * clear restrictions on the global uniqueness of IDs. We will employ the
-     * _very_ hit and miss method of selecting entries based on the rdf:about
-     * attribute. Please note that this is even more hit and miss with RSS1.1 than
-     * with RSS1.0 since RSS1.1 does not require the rdf:about attribute for items.
-     *
-     * @param    string    $id    any valid ID.
-     * @return    XML_Feed_Parser_RSS1Element
-     */
-    function getEntryById($id)
-    {
-        if (isset($this->idMappings[$id])) {
-            return $this->entries[$this->idMappings[$id]];
-        }
-
-        $entries = $this->xpath->query("//rss:item[@rdf:about='$id']");
-        if ($entries->length > 0) {
-            $classname = $this->itemClass;
-            $entry = new $classname($entries->item(0), $this);
-            return $entry;
-        }
-        return false;
-    }
-
-    /**
-     * Get details of the image associated with the feed.
-     *
-     * @return  array|false an array simply containing the child elements
-     */
-    protected function getImage()
-    {
-        $images = $this->model->getElementsByTagName('image');
-        if ($images->length > 0) {
-            $image = $images->item(0);
-            $details = array();
-            if ($image->hasChildNodes()) {
-                $details = array(
-                    'title' => $image->getElementsByTagName('title')->item(0)->value,
-                    'url' => $image->getElementsByTagName('url')->item(0)->value);
-                if ($image->getElementsByTagName('link')->length > 0) {
-                    $details['link'] = 
-                        $image->getElementsByTagName('link')->item(0)->value;
-                }
-            } else {
-                $details = array('title' => false,
-                    'link' => false,
-                    'url' => $image->attributes->getNamedItem('resource')->nodeValue);
-            }
-            $details = array_merge($details, 
-                array('description' => false, 'height' => false, 'width' => false));
-            if (! empty($details)) {
-                return $details;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * The textinput element is little used, but in the interests of
-     * completeness we will support it.
-     *
-     * @return  array|false
-     */
-    protected function getTextInput()
-    {
-        $inputs = $this->model->getElementsByTagName('textinput');
-        if ($inputs->length > 0) {
-            $input = $inputs->item(0);
-            $results = array();
-            $results['title'] = isset(
-                $input->getElementsByTagName('title')->item(0)->value) ? 
-                $input->getElementsByTagName('title')->item(0)->value : null;
-            $results['description'] = isset(
-                $input->getElementsByTagName('description')->item(0)->value) ? 
-                $input->getElementsByTagName('description')->item(0)->value : null;
-            $results['name'] = isset(
-                $input->getElementsByTagName('name')->item(0)->value) ? 
-                $input->getElementsByTagName('name')->item(0)->value : null;
-            $results['link'] = isset(
-                   $input->getElementsByTagName('link')->item(0)->value) ? 
-                   $input->getElementsByTagName('link')->item(0)->value : null;
-            if (empty($results['link']) and 
-                $input->attributes->getNamedItem('resource')) {
-                $results['link'] = $input->attributes->getNamedItem('resource')->nodeValue;
-            }
-            if (! empty($results)) {
-                return $results;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Attempts to discern authorship
-     *
-     * Dublin Core provides the dc:creator, dc:contributor, and dc:publisher
-     * elements for defining authorship in RSS1. We will try each of those in
-     * turn in order to simulate the atom author element and will return it
-     * as text.
-     *
-     * @return  array|false
-     */
-    function getAuthor()
-    {
-        $options = array('creator', 'contributor', 'publisher');
-        foreach ($options as $element) {
-            $test = $this->model->getElementsByTagName($element);
-            if ($test->length > 0) {
-                return $test->item(0)->value;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * Retrieve a link
-     *
-     * In RSS1 a link is a text element but in order to ensure that we resolve
-     * URLs properly we have a special function for them.
-     *
-     * @return  string
-     */
-    function getLink($offset = 0, $attribute = 'href', $params = false)
-    {
-        $links = $this->model->getElementsByTagName('link');
-        if ($links->length <= $offset) {
-            return false;
-        }
-        $link = $links->item($offset);
-        return $this->addBase($link->nodeValue, $link);
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php
deleted file mode 100755 (executable)
index 75918be..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS1 Element class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS11Element.php,v 1.4 2006/06/30 17:41:56 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/*
- * This class provides support for RSS 1.1 entries. It will usually be called by
- * XML_Feed_Parser_RSS11 with which it shares many methods.
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_RSS11Element extends XML_Feed_Parser_RSS11
-{
-    /**
-     * This will be a reference to the parent object for when we want
-     * to use a 'fallback' rule 
-     * @var XML_Feed_Parser_RSS1
-     */
-    protected $parent;
-
-    /**
-     * Our specific element map 
-     * @var array
-     */
-    protected $map = array(
-        'id' => array('Id'),
-        'title' => array('Text'),
-        'link' => array('Link'),
-        'description' => array('Text'), # or dc:description
-        'category' => array('Category'),
-        'rights' => array('Text'), # dc:rights
-        'creator' => array('Text'), # dc:creator
-        'publisher' => array('Text'), # dc:publisher
-        'contributor' => array('Text'), # dc:contributor
-        'date' => array('Date'), # dc:date
-        'content' => array('Content')
-        );
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS1.
-     * @var array
-     */
-    protected $compatMap = array(
-        'content' => array('content'),
-        'updated' => array('lastBuildDate'),
-        'published' => array('pubdate'),
-        'subtitle' => array('description'),
-        'updated' => array('date'),
-        'author' => array('creator'),
-        'contributor' => array('contributor')
-    );
-
-    /**
-     * Store useful information for later.
-     *
-     * @param   DOMElement  $element - this item as a DOM element
-     * @param   XML_Feed_Parser_RSS1 $parent - the feed of which this is a member
-     */
-    function __construct(DOMElement $element, $parent, $xmlBase = '')
-    {
-        $this->model = $element;
-        $this->parent = $parent;
-    }
-
-    /**
-     * If an rdf:about attribute is specified, return that as an ID
-     *
-     * There is no established way of showing an ID for an RSS1 entry. We will 
-     * simulate it using the rdf:about attribute of the entry element. This cannot
-     * be relied upon for unique IDs but may prove useful.
-     *
-     * @return  string|false
-     */
-    function getId()
-    {
-        if ($this->model->attributes->getNamedItem('about')) {
-            return $this->model->attributes->getNamedItem('about')->nodeValue;
-        }
-        return false;
-    }
-
-    /**
-     * Return the entry's content
-     *
-     * The official way to include full content in an RSS1 entry is to use
-     * the content module's element 'encoded'. Often, however, the 'description'
-     * element is used instead. We will offer that as a fallback.
-     *
-     * @return  string|false
-     */
-    function getContent()
-    {
-        $options = array('encoded', 'description');
-        foreach ($options as $element) {
-            $test = $this->model->getElementsByTagName($element);
-            if ($test->length == 0) {
-                continue;
-            }
-            if ($test->item(0)->hasChildNodes()) {
-                $value = '';
-                foreach ($test->item(0)->childNodes as $child) {
-                    if ($child instanceof DOMText) {
-                        $value .= $child->nodeValue;
-                    } else {
-                        $simple = simplexml_import_dom($child);
-                        $value .= $simple->asXML();
-                    }
-                }
-                return $value;
-            } else if ($test->length > 0) {
-                return $test->item(0)->nodeValue;
-            }
-        }
-        return false;
-    }
-    
-    /**
-     * How RSS1.1 should support for enclosures is not clear. For now we will return
-     * false.
-     *
-     * @return  false
-     */
-    function getEnclosure()
-    {
-        return false;
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php
deleted file mode 100755 (executable)
index 8e36d5a..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * RSS1 Element class for XML_Feed_Parser
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS1Element.php,v 1.6 2006/06/30 17:41:56 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/*
- * This class provides support for RSS 1.0 entries. It will usually be called by
- * XML_Feed_Parser_RSS1 with which it shares many methods.
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_RSS1Element extends XML_Feed_Parser_RSS1
-{
-    /**
-     * This will be a reference to the parent object for when we want
-     * to use a 'fallback' rule 
-     * @var XML_Feed_Parser_RSS1
-     */
-    protected $parent;
-
-    /**
-     * Our specific element map 
-     * @var array
-     */
-    protected $map = array(
-        'id' => array('Id'),
-        'title' => array('Text'),
-        'link' => array('Link'),
-        'description' => array('Text'), # or dc:description
-        'category' => array('Category'),
-        'rights' => array('Text'), # dc:rights
-        'creator' => array('Text'), # dc:creator
-        'publisher' => array('Text'), # dc:publisher
-        'contributor' => array('Text'), # dc:contributor
-        'date' => array('Date'), # dc:date
-        'content' => array('Content')
-        );
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS1.
-     * @var array
-     */
-    protected $compatMap = array(
-        'content' => array('content'),
-        'updated' => array('lastBuildDate'),
-        'published' => array('pubdate'),
-        'subtitle' => array('description'),
-        'updated' => array('date'),
-        'author' => array('creator'),
-        'contributor' => array('contributor')
-    );
-
-    /**
-     * Store useful information for later.
-     *
-     * @param   DOMElement  $element - this item as a DOM element
-     * @param   XML_Feed_Parser_RSS1 $parent - the feed of which this is a member
-     */
-    function __construct(DOMElement $element, $parent, $xmlBase = '')
-    {
-        $this->model = $element;
-        $this->parent = $parent;
-    }
-
-    /**
-     * If an rdf:about attribute is specified, return it as an ID
-     *
-     * There is no established way of showing an ID for an RSS1 entry. We will 
-     * simulate it using the rdf:about attribute of the entry element. This cannot
-     * be relied upon for unique IDs but may prove useful.
-     *
-     * @return  string|false
-     */
-    function getId()
-    {
-        if ($this->model->attributes->getNamedItem('about')) {
-            return $this->model->attributes->getNamedItem('about')->nodeValue;
-        }
-        return false;
-    }
-
-    /**
-     * How RSS1 should support for enclosures is not clear. For now we will return
-     * false.
-     *
-     * @return  false
-     */
-    function getEnclosure()
-    {
-        return false;
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php
deleted file mode 100644 (file)
index 0936bd2..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Class representing feed-level data for an RSS2 feed
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS2.php,v 1.12 2008/03/08 18:16:45 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class handles RSS2 feeds.
- * 
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_RSS2 extends XML_Feed_Parser_Type
-{
-    /**
-     * The URI of the RelaxNG schema used to (optionally) validate the feed
-     * @var string
-     */
-    private $relax = 'rss20.rnc';
-
-    /**
-     * We're likely to use XPath, so let's keep it global
-     * @var DOMXPath
-     */
-    protected $xpath;
-
-    /**
-     * The feed type we are parsing
-     * @var string
-     */
-    public $version = 'RSS 2.0';
-
-    /**
-     * The class used to represent individual items
-     * @var string
-     */     
-    protected $itemClass = 'XML_Feed_Parser_RSS2Element';
-    
-    /**
-     * The element containing entries 
-     * @var string
-     */
-    protected $itemElement = 'item';
-
-    /**
-     * Here we map those elements we're not going to handle individually
-     * to the constructs they are. The optional second parameter in the array
-     * tells the parser whether to 'fall back' (not apt. at the feed level) or
-     * fail if the element is missing. If the parameter is not set, the function
-     * will simply return false and leave it to the client to decide what to do.
-     * @var array
-     */
-    protected $map = array(
-        'ttl' => array('Text'),
-        'pubDate' => array('Date'),
-        'lastBuildDate' => array('Date'),
-        'title' => array('Text'),
-        'link' => array('Link'),
-        'description' => array('Text'),
-        'language' => array('Text'),
-        'copyright' => array('Text'),
-        'managingEditor' => array('Text'),
-        'webMaster' => array('Text'),
-        'category' => array('Text'),
-        'generator' => array('Text'),
-        'docs' => array('Text'),
-        'ttl' => array('Text'),
-        'image' => array('Image'),
-        'skipDays' => array('skipDays'),
-        'skipHours' => array('skipHours'));
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS2.
-     * @var array
-     */
-    protected $compatMap = array(
-        'title' => array('title'),
-        'rights' => array('copyright'),
-        'updated' => array('lastBuildDate'),
-        'subtitle' => array('description'),
-        'date' => array('pubDate'),
-        'author' => array('managingEditor'));
-
-    protected $namespaces = array(
-        'dc' => 'http://purl.org/rss/1.0/modules/dc/',
-        'content' => 'http://purl.org/rss/1.0/modules/content/');
-
-    /**
-     * Our constructor does nothing more than its parent.
-     * 
-     * @param    DOMDocument    $xml    A DOM object representing the feed
-     * @param    bool (optional) $string    Whether or not to validate this feed
-     */
-    function __construct(DOMDocument $model, $strict = false)
-    {
-        $this->model = $model;
-
-        if ($strict) {
-            if (! $this->model->relaxNGValidate($this->relax)) {
-                throw new XML_Feed_Parser_Exception('Failed required validation');
-            }
-        }
-
-        $this->xpath = new DOMXPath($this->model);
-        foreach ($this->namespaces as $key => $value) {
-            $this->xpath->registerNamespace($key, $value);
-        }
-        $this->numberEntries = $this->count('item');
-    }
-
-    /**
-     * Retrieves an entry by ID, if the ID is specified with the guid element
-     *
-     * This is not really something that will work with RSS2 as it does not have
-     * clear restrictions on the global uniqueness of IDs. But we can emulate
-     * it by allowing access based on the 'guid' element. If DOMXPath::evaluate
-     * is available, we also use that to store a reference to the entry in the array
-     * used by getEntryByOffset so that method does not have to seek out the entry
-     * if it's requested that way.
-     *
-     * @param    string    $id    any valid ID.
-     * @return    XML_Feed_Parser_RSS2Element
-     */
-    function getEntryById($id)
-    {
-        if (isset($this->idMappings[$id])) {
-            return $this->entries[$this->idMappings[$id]];
-        }
-
-        $entries = $this->xpath->query("//item[guid='$id']");
-        if ($entries->length > 0) {
-            $entry = new $this->itemElement($entries->item(0), $this);
-            if (in_array('evaluate', get_class_methods($this->xpath))) {
-                $offset = $this->xpath->evaluate("count(preceding-sibling::item)", $entries->item(0));
-                $this->entries[$offset] = $entry;
-            }
-            $this->idMappings[$id] = $entry;
-            return $entry;
-        }        
-    }
-
-    /**
-     * Get a category from the element
-     *
-     * The category element is a simple text construct which can occur any number
-     * of times. We allow access by offset or access to an array of results.
-     *
-     * @param    string    $call    for compatibility with our overloading
-     * @param   array $arguments - arg 0 is the offset, arg 1 is whether to return as array
-     * @return  string|array|false
-     */
-    function getCategory($call, $arguments = array())
-    {
-        $categories = $this->model->getElementsByTagName('category');
-        $offset = empty($arguments[0]) ? 0 : $arguments[0];
-        $array = empty($arguments[1]) ? false : true;
-        if ($categories->length <= $offset) {
-            return false;
-        }
-        if ($array) {
-            $list = array();
-            foreach ($categories as $category) {
-                array_push($list, $category->nodeValue);
-            }
-            return $list;
-        }
-        return $categories->item($offset)->nodeValue;
-    }
-
-    /**
-     * Get details of the image associated with the feed.
-     *
-     * @return  array|false an array simply containing the child elements
-     */
-    protected function getImage()
-    {
-        $images = $this->xpath->query("//image");
-        if ($images->length > 0) {
-            $image = $images->item(0);
-            $desc = $image->getElementsByTagName('description');
-            $description = $desc->length ? $desc->item(0)->nodeValue : false;
-            $heigh = $image->getElementsByTagName('height'); 
-            $height = $heigh->length ? $heigh->item(0)->nodeValue : false;
-            $widt = $image->getElementsByTagName('width'); 
-            $width = $widt->length ? $widt->item(0)->nodeValue : false;
-            return array(
-                'title' => $image->getElementsByTagName('title')->item(0)->nodeValue,
-                'link' => $image->getElementsByTagName('link')->item(0)->nodeValue,
-                'url' => $image->getElementsByTagName('url')->item(0)->nodeValue,
-                'description' => $description,
-                'height' => $height,
-                'width' => $width);
-        }
-        return false;
-    }
-
-    /**
-     * The textinput element is little used, but in the interests of
-     * completeness...
-     *
-     * @return  array|false
-     */
-    function getTextInput()
-    {
-        $inputs = $this->model->getElementsByTagName('input');
-        if ($inputs->length > 0) {
-            $input = $inputs->item(0);
-            return array(
-                'title' => $input->getElementsByTagName('title')->item(0)->value,
-                'description' => 
-                    $input->getElementsByTagName('description')->item(0)->value,
-                'name' => $input->getElementsByTagName('name')->item(0)->value,
-                'link' => $input->getElementsByTagName('link')->item(0)->value);
-        }
-        return false;
-    }
-
-    /**
-     * Utility function for getSkipDays and getSkipHours
-     *
-     * This is a general function used by both getSkipDays and getSkipHours. It simply
-     * returns an array of the values of the children of the appropriate tag.
-     *
-     * @param   string      $tagName    The tag name (getSkipDays or getSkipHours)
-     * @return  array|false
-     */
-    protected function getSkips($tagName)
-    {
-        $hours = $this->model->getElementsByTagName($tagName);
-        if ($hours->length == 0) {
-            return false;
-        }
-        $skipHours = array();
-        foreach($hours->item(0)->childNodes as $hour) {
-            if ($hour instanceof DOMElement) {
-                array_push($skipHours, $hour->nodeValue);
-            }
-        }
-        return $skipHours;
-    }
-
-    /**
-     * Retrieve skipHours data
-     *
-     * The skiphours element provides a list of hours on which this feed should
-     * not be checked. We return an array of those hours (integers, 24 hour clock)
-     *
-     * @return  array
-     */    
-    function getSkipHours()
-    {
-        return $this->getSkips('skipHours');
-    }
-
-    /**
-     * Retrieve skipDays data
-     *
-     * The skipdays element provides a list of days on which this feed should
-     * not be checked. We return an array of those days.
-     *
-     * @return  array
-     */
-    function getSkipDays()
-    {
-        return $this->getSkips('skipDays');
-    }
-
-    /**
-     * Return content of the little-used 'cloud' element
-     *
-     * The cloud element is rarely used. It is designed to provide some details
-     * of a location to update the feed.
-     *
-     * @return  array   an array of the attributes of the element
-     */
-    function getCloud()
-    {
-        $cloud = $this->model->getElementsByTagName('cloud');
-        if ($cloud->length == 0) {
-            return false;
-        }
-        $cloudData = array();
-        foreach ($cloud->item(0)->attributes as $attribute) {
-            $cloudData[$attribute->name] = $attribute->value;
-        }
-        return $cloudData;
-    }
-    
-    /**
-     * Get link URL
-     *
-     * In RSS2 a link is a text element but in order to ensure that we resolve
-     * URLs properly we have a special function for them. We maintain the 
-     * parameter used by the atom getLink method, though we only use the offset
-     * parameter.
-     *
-     * @param   int     $offset The position of the link within the feed. Starts from 0
-     * @param   string  $attribute  The attribute of the link element required
-     * @param   array   $params An array of other parameters. Not used.
-     * @return  string
-     */
-    function getLink($offset, $attribute = 'href', $params = array())
-    {
-        $xPath = new DOMXPath($this->model);
-        $links = $xPath->query('//link');
-
-        if ($links->length <= $offset) {
-            return false;
-        }
-        $link = $links->item($offset);
-        return $this->addBase($link->nodeValue, $link);
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php
deleted file mode 100755 (executable)
index 6edf910..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Class representing entries in an RSS2 feed.
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: RSS2Element.php,v 1.11 2006/07/26 21:18:47 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This class provides support for RSS 2.0 entries. It will usually be 
- * called by XML_Feed_Parser_RSS2 with which it shares many methods.
- *
- * @author    James Stewart <james@jystewart.net>
- * @version    Release: 1.0.3
- * @package XML_Feed_Parser
- */
-class XML_Feed_Parser_RSS2Element extends XML_Feed_Parser_RSS2
-{
-    /**
-     * This will be a reference to the parent object for when we want
-     * to use a 'fallback' rule
-     * @var XML_Feed_Parser_RSS2
-     */
-    protected $parent;
-
-    /**
-     * Our specific element map 
-     * @var array
-     */
-    protected $map = array(
-        'title' => array('Text'),
-        'guid' => array('Guid'),
-        'description' => array('Text'),
-        'author' => array('Text'),
-        'comments' => array('Text'),
-        'enclosure' => array('Enclosure'),
-        'pubDate' => array('Date'),
-        'source' => array('Source'),
-        'link' => array('Text'),
-        'content' => array('Content'));
-
-    /**
-     * Here we map some elements to their atom equivalents. This is going to be
-     * quite tricky to pull off effectively (and some users' methods may vary)
-     * but is worth trying. The key is the atom version, the value is RSS2.
-     * @var array
-     */
-    protected $compatMap = array(
-        'id' => array('guid'),
-        'updated' => array('lastBuildDate'),
-        'published' => array('pubdate'),
-        'guidislink' => array('guid', 'ispermalink'),
-        'summary' => array('description'));
-
-    /**
-     * Store useful information for later.
-     *
-     * @param   DOMElement  $element - this item as a DOM element
-     * @param   XML_Feed_Parser_RSS2    $parent - the feed of which this is a member
-     */
-    function __construct(DOMElement $element, $parent, $xmlBase = '')
-    {
-        $this->model = $element;
-        $this->parent = $parent;
-    }
-
-    /**
-     * Get the value of the guid element, if specified
-     *
-     * guid is the closest RSS2 has to atom's ID. It is usually but not always a
-     * URI. The one attribute that RSS2 can posess is 'ispermalink' which specifies
-     * whether the guid is itself dereferencable. Use of guid is not obligatory,
-     * but is advisable. To get the guid you would call $item->id() (for atom
-     * compatibility) or $item->guid(). To check if this guid is a permalink call
-     * $item->guid("ispermalink").
-     *
-     * @param   string  $method - the method name being called
-     * @param   array   $params - parameters required
-     * @return  string  the guid or value of ispermalink
-     */
-    protected function getGuid($method, $params)
-    {
-        $attribute = (isset($params[0]) and $params[0] == 'ispermalink') ? 
-            true : false;
-        $tag = $this->model->getElementsByTagName('guid');
-        if ($tag->length > 0) {
-            if ($attribute) {
-                if ($tag->hasAttribute("ispermalink")) {
-                    return $tag->getAttribute("ispermalink");
-                }
-            }
-            return $tag->item(0)->nodeValue;
-        }
-        return false;
-    }
-
-    /**
-     * Access details of file enclosures
-     *
-     * The RSS2 spec is ambiguous as to whether an enclosure element must be
-     * unique in a given entry. For now we will assume it needn't, and allow
-     * for an offset.
-     *
-     * @param   string $method - the method being called
-     * @param   array   $parameters - we expect the first of these to be our offset
-     * @return  array|false
-     */
-    protected function getEnclosure($method, $parameters)
-    {
-        $encs = $this->model->getElementsByTagName('enclosure');
-        $offset = isset($parameters[0]) ? $parameters[0] : 0;
-        if ($encs->length > $offset) {
-            try {
-                if (! $encs->item($offset)->hasAttribute('url')) {
-                    return false;
-                }
-                $attrs = $encs->item($offset)->attributes;
-                return array(
-                    'url' => $attrs->getNamedItem('url')->value,
-                    'length' => $attrs->getNamedItem('length')->value,
-                    'type' => $attrs->getNamedItem('type')->value);
-            } catch (Exception $e) {
-                return false;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Get the entry source if specified
-     *
-     * source is an optional sub-element of item. Like atom:source it tells
-     * us about where the entry came from (eg. if it's been copied from another
-     * feed). It is not a rich source of metadata in the same way as atom:source
-     * and while it would be good to maintain compatibility by returning an
-     * XML_Feed_Parser_RSS2 element, it makes a lot more sense to return an array.
-     *
-     * @return array|false
-     */
-    protected function getSource()
-    {
-        $get = $this->model->getElementsByTagName('source');
-        if ($get->length) {
-            $source = $get->item(0);
-            $array = array(
-                'content' => $source->nodeValue);
-            foreach ($source->attributes as $attribute) {
-                $array[$attribute->name] = $attribute->value;
-            }
-            return $array;
-        }
-        return false;
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/Parser/Type.php b/plugins/OStatus/extlib/XML/Feed/Parser/Type.php
deleted file mode 100644 (file)
index 7505261..0000000
+++ /dev/null
@@ -1,467 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Abstract class providing common methods for XML_Feed_Parser feeds.
- *
- * PHP versions 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   XML
- * @package    XML_Feed_Parser
- * @author     James Stewart <james@jystewart.net>
- * @copyright  2005 James Stewart <james@jystewart.net>
- * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
- * @version    CVS: $Id: Type.php,v 1.25 2008/03/08 18:39:09 jystewart Exp $
- * @link       http://pear.php.net/package/XML_Feed_Parser/
- */
-
-/**
- * This abstract class provides some general methods that are likely to be
- * implemented exactly the same way for all feed types.
- *
- * @package XML_Feed_Parser
- * @author  James Stewart <james@jystewart.net>
- * @version Release: 1.0.3
- */
-abstract class XML_Feed_Parser_Type
-{
-    /**
-     * Where we store our DOM object for this feed 
-     * @var DOMDocument
-     */
-    public $model;
-
-    /**
-     * For iteration we'll want a count of the number of entries 
-     * @var int
-     */
-    public $numberEntries;
-
-    /**
-     * Where we store our entry objects once instantiated 
-     * @var array
-     */
-    public $entries = array();
-
-    /**
-     * Store mappings between entry IDs and their position in the feed
-     */
-    public $idMappings = array();
-
-    /**
-     * Proxy to allow use of element names as method names
-     *
-     * We are not going to provide methods for every entry type so this
-     * function will allow for a lot of mapping. We rely pretty heavily
-     * on this to handle our mappings between other feed types and atom.
-     *
-     * @param   string  $call - the method attempted
-     * @param   array   $arguments - arguments to that method
-     * @return  mixed
-     */
-    function __call($call, $arguments = array())
-    {
-        if (! is_array($arguments)) {
-            $arguments = array();
-        }
-
-        if (isset($this->compatMap[$call])) {
-            $tempMap = $this->compatMap;
-            $tempcall = array_pop($tempMap[$call]);
-            if (! empty($tempMap)) {
-                $arguments = array_merge($arguments, $tempMap[$call]);
-            }
-            $call = $tempcall;
-        }
-
-        /* To be helpful, we allow a case-insensitive search for this method */
-        if (! isset($this->map[$call])) {
-            foreach (array_keys($this->map) as $key) {
-                if (strtoupper($key) == strtoupper($call)) {
-                    $call = $key;
-                    break;
-                }
-            }
-        }
-
-        if (empty($this->map[$call])) {
-            return false;
-        }
-
-        $method = 'get' . $this->map[$call][0];
-        if ($method == 'getLink') {
-            $offset = empty($arguments[0]) ? 0 : $arguments[0];
-            $attribute = empty($arguments[1]) ? 'href' : $arguments[1];
-            $params = isset($arguments[2]) ? $arguments[2] : array();
-            return $this->getLink($offset, $attribute, $params);
-        }
-        if (method_exists($this, $method)) {
-            return $this->$method($call, $arguments);
-        }
-
-        return false;
-    }
-
-    /**
-     * Proxy to allow use of element names as attribute names
-     *
-     * For many elements variable-style access will be desirable. This function
-     * provides for that.
-     *
-     * @param   string  $value - the variable required
-     * @return  mixed
-     */
-    function __get($value)
-    {
-        return $this->__call($value, array());
-    }
-
-    /**
-     * Utility function to help us resolve xml:base values
-     *
-     * We have other methods which will traverse the DOM and work out the different
-     * xml:base declarations we need to be aware of. We then need to combine them.
-     * If a declaration starts with a protocol then we restart the string. If it 
-     * starts with a / then we add on to the domain name. Otherwise we simply tag 
-     * it on to the end.
-     *
-     * @param   string  $base - the base to add the link to
-     * @param   string  $link
-     */
-    function combineBases($base, $link)
-    {
-        if (preg_match('/^[A-Za-z]+:\/\//', $link)) {
-            return $link;
-        } else if (preg_match('/^\//', $link)) {
-            /* Extract domain and suffix link to that */
-            preg_match('/^([A-Za-z]+:\/\/.*)?\/*/', $base, $results);
-            $firstLayer = $results[0];
-            return $firstLayer . "/" . $link;
-        } else if (preg_match('/^\.\.\//', $base)) {
-            /* Step up link to find place to be */
-            preg_match('/^((\.\.\/)+)(.*)$/', $link, $bases);
-            $suffix = $bases[3];
-            $count = preg_match_all('/\.\.\//', $bases[1], $steps);
-            $url = explode("/", $base);
-            for ($i = 0; $i <= $count; $i++) {
-                array_pop($url);
-            }
-            return implode("/", $url) . "/" . $suffix;
-        } else if (preg_match('/^(?!\/$)/', $base)) {
-            $base = preg_replace('/(.*\/).*$/', '$1', $base)  ;
-            return $base . $link;
-        } else {
-            /* Just stick it on the end */
-            return $base . $link;
-        }
-    }
-
-    /**
-     * Determine whether we need to apply our xml:base rules
-     *
-     * Gets us the xml:base data and then processes that with regard
-     * to our current link.
-     *
-     * @param   string
-     * @param   DOMElement
-     * @return  string
-     */
-    function addBase($link, $element)
-    {
-        if (preg_match('/^[A-Za-z]+:\/\//', $link)) {
-            return $link;
-        }
-
-        return $this->combineBases($element->baseURI, $link);
-    }
-
-    /**
-     * Get an entry by its position in the feed, starting from zero
-     *
-     * As well as allowing the items to be iterated over we want to allow
-     * users to be able to access a specific entry. This is one of two ways of
-     * doing that, the other being by ID.
-     * 
-     * @param   int $offset
-     * @return  XML_Feed_Parser_RSS1Element
-     */
-    function getEntryByOffset($offset)
-    {
-        if (! isset($this->entries[$offset])) {
-            $entries = $this->model->getElementsByTagName($this->itemElement);
-            if ($entries->length > $offset) {
-                $xmlBase = $entries->item($offset)->baseURI;
-                $this->entries[$offset] = new $this->itemClass(
-                    $entries->item($offset), $this, $xmlBase);
-                if ($id = $this->entries[$offset]->id) {
-                    $this->idMappings[$id] = $this->entries[$offset];
-                }
-            } else {
-                throw new XML_Feed_Parser_Exception('No entries found');
-            }
-        }
-
-        return $this->entries[$offset];
-    }
-
-    /**
-     * Return a date in seconds since epoch.
-     *
-     * Get a date construct. We use PHP's strtotime to return it as a unix datetime, which
-     * is the number of seconds since 1970-01-01 00:00:00.
-     * 
-     * @link    http://php.net/strtotime
-     * @param    string    $method        The name of the date construct we want
-     * @param    array     $arguments    Included for compatibility with our __call usage
-     * @return    int|false datetime
-     */
-    protected function getDate($method, $arguments)
-    {
-        $time = $this->model->getElementsByTagName($method);
-        if ($time->length == 0 || empty($time->item(0)->nodeValue)) {
-            return false;
-        }
-        return strtotime($time->item(0)->nodeValue);
-    }
-
-    /**
-     * Get a text construct. 
-     *
-     * @param    string    $method    The name of the text construct we want
-     * @param    array     $arguments    Included for compatibility with our __call usage
-     * @return    string
-     */
-    protected function getText($method, $arguments = array())
-    {
-        $tags = $this->model->getElementsByTagName($method);
-        if ($tags->length > 0) {
-            $value = $tags->item(0)->nodeValue;
-            return $value;
-        }
-        return false;
-    }
-
-    /**
-     * Apply various rules to retrieve category data.
-     *
-     * There is no single way of declaring a category in RSS1/1.1 as there is in RSS2 
-     * and  Atom. Instead the usual approach is to use the dublin core namespace to 
-     * declare  categories. For example delicious use both: 
-     * <dc:subject>PEAR</dc:subject> and: <taxo:topics><rdf:Bag>
-     * <rdf:li resource="http://del.icio.us/tag/PEAR" /></rdf:Bag></taxo:topics>
-     * to declare a categorisation of 'PEAR'.
-     *
-     * We need to be sensitive to this where possible.
-     *
-     * @param    string    $call    for compatibility with our overloading
-     * @param   array $arguments - arg 0 is the offset, arg 1 is whether to return as array
-     * @return  string|array|false
-     */
-    protected function getCategory($call, $arguments)
-    {
-        $categories = $this->model->getElementsByTagName('subject');
-        $offset = empty($arguments[0]) ? 0 : $arguments[0];
-        $array = empty($arguments[1]) ? false : true;
-        if ($categories->length <= $offset) {
-            return false;
-        }
-        if ($array) {
-            $list = array();
-            foreach ($categories as $category) {
-                array_push($list, $category->nodeValue);
-            }
-            return $list;
-        }
-        return $categories->item($offset)->nodeValue;
-    }
-
-    /**
-     * Count occurrences of an element
-     *
-     * This function will tell us how many times the element $type
-     * appears at this level of the feed.
-     * 
-     * @param    string    $type    the element we want to get a count of
-     * @return    int
-     */
-    protected function count($type)
-    {
-        if ($tags = $this->model->getElementsByTagName($type)) {
-            return $tags->length;
-        }
-        return 0;
-    }
-
-    /**
-     * Part of our xml:base processing code
-     *
-     * We need a couple of methods to access XHTML content stored in feeds. 
-     * This is because we dereference all xml:base references before returning
-     * the element. This method handles the attributes.
-     *
-     * @param   DOMElement $node    The DOM node we are iterating over
-     * @return  string
-     */
-    function processXHTMLAttributes($node) {
-        $return = '';
-        foreach ($node->attributes as $attribute) {
-            if ($attribute->name == 'src' or $attribute->name == 'href') {
-                $attribute->value = $this->addBase(htmlentities($attribute->value, NULL, 'utf-8'), $attribute);
-            }
-            if ($attribute->name == 'base') {
-                continue;
-            }
-            $return .= $attribute->name . '="' . htmlentities($attribute->value, NULL, 'utf-8') .'" ';
-        }
-        if (! empty($return)) {
-            return ' ' . trim($return);
-        }
-        return '';
-    }
-
-    /**
-     * Convert HTML entities based on the current character set.
-     * 
-     * @param String
-     * @return String
-     */
-    function processEntitiesForNodeValue($node) 
-    {
-        if (function_exists('iconv')) {
-          $current_encoding = $node->ownerDocument->encoding;
-          $value = iconv($current_encoding, 'UTF-8', $node->nodeValue);
-        } else if ($current_encoding == 'iso-8859-1') {
-          $value = utf8_encode($node->nodeValue);
-        } else {
-          $value = $node->nodeValue;
-        }
-
-        $decoded = html_entity_decode($value, NULL, 'UTF-8');
-        return htmlentities($decoded, NULL, 'UTF-8');
-    }
-
-    /**
-     * Part of our xml:base processing code
-     *
-     * We need a couple of methods to access XHTML content stored in feeds. 
-     * This is because we dereference all xml:base references before returning
-     * the element. This method recurs through the tree descending from the node
-     * and builds our string.
-     *
-     * @param   DOMElement $node    The DOM node we are processing
-     * @return   string
-     */
-    function traverseNode($node)
-    {
-        $content = '';
-
-        /* Add the opening of this node to the content */
-        if ($node instanceof DOMElement) {
-            $content .= '<' . $node->tagName . 
-                $this->processXHTMLAttributes($node) . '>';
-        }
-
-        /* Process children */
-        if ($node->hasChildNodes()) {
-            foreach ($node->childNodes as $child) {
-                $content .= $this->traverseNode($child);
-            }
-        }
-
-        if ($node instanceof DOMText) {
-            $content .= $this->processEntitiesForNodeValue($node);
-        }
-
-        /* Add the closing of this node to the content */
-        if ($node instanceof DOMElement) {
-            $content .= '</' . $node->tagName . '>';
-        }
-
-        return $content;
-    }
-
-    /**
-     * Get content from RSS feeds (atom has its own implementation)
-     *
-     * The official way to include full content in an RSS1 entry is to use
-     * the content module's element 'encoded', and RSS2 feeds often duplicate that.
-     * Often, however, the 'description' element is used instead. We will offer that 
-     * as a fallback. Atom uses its own approach and overrides this method.
-     *
-     * @return  string|false
-     */
-    protected function getContent()
-    {
-        $options = array('encoded', 'description');
-        foreach ($options as $element) {
-            $test = $this->model->getElementsByTagName($element);
-            if ($test->length == 0) {
-                continue;
-            }
-            if ($test->item(0)->hasChildNodes()) {
-                $value = '';
-                foreach ($test->item(0)->childNodes as $child) {
-                    if ($child instanceof DOMText) {
-                        $value .= $child->nodeValue;
-                    } else {
-                        $simple = simplexml_import_dom($child);
-                        $value .= $simple->asXML();
-                    }
-                }
-                return $value;
-            } else if ($test->length > 0) {
-                return $test->item(0)->nodeValue;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks if this element has a particular child element.
-     *
-     * @param   String
-     * @param   Integer
-     * @return  bool
-     **/
-    function hasKey($name, $offset = 0)
-    {
-        $search = $this->model->getElementsByTagName($name);
-        return $search->length > $offset;
-    }
-
-    /**
-     * Return an XML serialization of the feed, should it be required. Most 
-     * users however, will already have a serialization that they used when 
-     * instantiating the object.
-     *
-     * @return    string    XML serialization of element
-     */    
-    function __toString()
-    {
-        $simple = simplexml_import_dom($this->model);
-        return $simple->asXML();
-    }
-    
-    /**
-     * Get directory holding RNG schemas. Method is based on that 
-     * found in Contact_AddressBook.
-     *
-     * @return string PEAR data directory.
-     * @access public
-     * @static
-     */
-    static function getSchemaDir()
-    {
-        require_once 'PEAR/Config.php';
-        $config = new PEAR_Config;
-        return $config->get('data_dir') . '/XML_Feed_Parser/schemas';
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml
deleted file mode 100755 (executable)
index 02e1c58..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<entry xmlns="http://www.w3.org/2005/Atom">
-    <title>Atom draft-07 snapshot</title>
-    <link rel="alternate" type="text/html" 
-     href="http://example.org/2005/04/02/atom"/>
-    <link rel='enclosure' type="audio/mpeg" length="1337"
-     href="http://example.org/audio/ph34r_my_podcast.mp3"/>
-    <id>tag:example.org,2003:3.2397</id>
-    <updated>2005-07-10T12:29:29Z</updated>
-    <published>2003-12-13T08:29:29-04:00</published>
-    <author>
-      <name>Mark Pilgrim</name>
-      <uri>http://example.org/</uri>
-      <email>f8dy@example.com</email>
-    </author>
-    <contributor>
-      <name>Sam Ruby</name>
-    </contributor>
-    <contributor>
-      <name>Joe Gregorio</name>
-    </contributor>
-    <content type="xhtml" xml:lang="en" 
-     xml:base="http://diveintomark.org/">
-      <div xmlns="http://www.w3.org/1999/xhtml">
-        <p><i>[Update: The Atom draft is finished.]</i></p>
-      </div>
-    </content>
-  </entry>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml
deleted file mode 100755 (executable)
index d181d2b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
- <title>Example Feed</title>
- <link href="http://example.org/"/>
- <updated>2003-12-13T18:30:02Z</updated>
- <author>
-   <name>John Doe</name>
- </author>
- <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
-
- <entry>
-   <title>Atom-Powered Robots Run Amok</title>
-   <link href="http://example.org/2003/12/13/atom03"/>
-   <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
-   <updated>2003-12-13T18:30:02Z</updated>
-   <summary>Some text.</summary>
- </entry>
-
-</feed>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml
deleted file mode 100755 (executable)
index 98abf9d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-   <feed xmlns="http://www.w3.org/2005/Atom">
-     <title type="text">dive into mark</title>
-     <subtitle type="html">
-       A &lt;em&gt;lot&lt;/em&gt; of effort
-       went into making this effortless
-     </subtitle>
-     <updated>2005-07-31T12:29:29Z</updated>
-     <id>tag:example.org,2003:3</id>
-     <link rel="alternate" type="text/html"
-      hreflang="en" href="http://example.org/"/>
-     <link rel="self" type="application/atom+xml"
-      href="http://example.org/feed.atom"/>
-     <rights>Copyright (c) 2003, Mark Pilgrim</rights>
-     <generator uri="http://www.example.com/" version="1.0">
-       Example Toolkit
-     </generator>
-     <entry>
-       <title>Atom draft-07 snapshot</title>
-       <link rel="alternate" type="text/html"
-        href="http://example.org/2005/04/02/atom"/>
-       <link rel='enclosure' type="audio/mpeg" length="1337"
-        href="http://example.org/audio/ph34r_my_podcast.mp3"/>
-       <id>tag:example.org,2003:3.2397</id>
-       <updated>2005-07-31T12:29:29Z</updated>
-       <published>2003-12-13T08:29:29-04:00</published>
-       <author>
-         <name>Mark Pilgrim</name>
-         <uri>http://example.org/</uri>
-         <email>f8dy@example.com</email>
-       </author>
-       <contributor>
-         <name>Sam Ruby</name>
-       </contributor>
-       <contributor>
-         <name>Joe Gregorio</name>
-       </contributor>
-       <content type="xhtml" xml:lang="en"
-        xml:base="http://diveintomark.org/">
-         <div xmlns="http://www.w3.org/1999/xhtml">
-           <p><i>[Update: The Atom draft is finished.]</i></p>
-         </div>
-       </content>
-     </entry>
-   </feed>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/delicious.feed b/plugins/OStatus/extlib/XML/Feed/samples/delicious.feed
deleted file mode 100755 (executable)
index 32f9fa4..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<rdf:RDF
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns="http://purl.org/rss/1.0/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
- xmlns:admin="http://webns.net/mvcb/"
->
-<channel rdf:about="http://del.icio.us/tag/greenbelt">
-<title>del.icio.us/tag/greenbelt</title>
-<link>http://del.icio.us/tag/greenbelt</link>
-<description>Text</description>
-<items>
- <rdf:Seq>
-  <rdf:li rdf:resource="http://www.greenbelt.org.uk/" />
-  <rdf:li rdf:resource="http://www.greenbelt.org.uk/" />
-  <rdf:li rdf:resource="http://www.natuerlichwien.at/rundumadum/dergruenguertel/" />
-  <rdf:li rdf:resource="http://www.flickerweb.co.uk/wiki/index.php/Tank#Seminars" />
-  <rdf:li rdf:resource="http://www.greenbelt.ca/home.htm" />
-  <rdf:li rdf:resource="http://pipwilsonbhp.blogspot.com/" />
-  <rdf:li rdf:resource="http://maggidawn.typepad.com/maggidawn/" />
-  <rdf:li rdf:resource="http://www.johndavies.org/" />
-  <rdf:li rdf:resource="http://jonnybaker.blogs.com/" />
- </rdf:Seq>
-</items>
-</channel>
-
-<item rdf:about="http://www.greenbelt.org.uk/">
-<dc:title>Greenbelt - Homepage Section</dc:title>
-<link>http://www.greenbelt.org.uk/</link>
-<dc:creator>jonnybaker</dc:creator>
-<dc:date>2005-05-16T16:30:38Z</dc:date>
-<dc:subject>greenbelt</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/greenbelt" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://www.greenbelt.org.uk/">
-<title>Greenbelt festival (uk)</title>
-<link>http://www.greenbelt.org.uk/</link>
-<dc:creator>sssshhhh</dc:creator>
-<dc:date>2005-05-14T18:19:40Z</dc:date>
-<dc:subject>audiology festival gigs greenbelt</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/gigs" />
-    <rdf:li resource="http://del.icio.us/tag/audiology" />
-    <rdf:li resource="http://del.icio.us/tag/festival" />
-    <rdf:li resource="http://del.icio.us/tag/greenbelt" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://www.natuerlichwien.at/rundumadum/dergruenguertel/">
-<title>Natuerlichwien.at - Rundumadum</title>
-<link>http://www.natuerlichwien.at/rundumadum/dergruenguertel/</link>
-<dc:creator>egmilman47</dc:creator>
-<dc:date>2005-05-06T21:33:41Z</dc:date>
-<dc:subject>Austria Vienna Wien greenbelt nature walking</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/Vienna" />
-    <rdf:li resource="http://del.icio.us/tag/Wien" />
-    <rdf:li resource="http://del.icio.us/tag/Austria" />
-    <rdf:li resource="http://del.icio.us/tag/walking" />
-    <rdf:li resource="http://del.icio.us/tag/nature" />
-    <rdf:li resource="http://del.icio.us/tag/greenbelt" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://www.flickerweb.co.uk/wiki/index.php/Tank#Seminars">
-<title>Tank - GBMediaWiki</title>
-<link>http://www.flickerweb.co.uk/wiki/index.php/Tank#Seminars</link>
-<dc:creator>jystewart</dc:creator>
-<dc:date>2005-03-21T22:44:11Z</dc:date>
-<dc:subject>greenbelt</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/greenbelt" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://www.greenbelt.ca/home.htm">
-<title>Greenbelt homepage</title>
-<link>http://www.greenbelt.ca/home.htm</link>
-<dc:creator>Gooberoo</dc:creator>
-<dc:date>2005-03-01T22:43:17Z</dc:date>
-<dc:subject>greenbelt ontario</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/ontario" />
-    <rdf:li resource="http://del.icio.us/tag/greenbelt" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://pipwilsonbhp.blogspot.com/">
-<title>Pip Wilson bhp ...... blog</title>
-<link>http://pipwilsonbhp.blogspot.com/</link>
-<dc:creator>sssshhhh</dc:creator>
-<dc:date>2004-12-27T11:20:51Z</dc:date>
-<dc:subject>Greenbelt friend ideas links thinking weblog</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/Greenbelt" />
-    <rdf:li resource="http://del.icio.us/tag/thinking" />
-    <rdf:li resource="http://del.icio.us/tag/ideas" />
-    <rdf:li resource="http://del.icio.us/tag/links" />
-    <rdf:li resource="http://del.icio.us/tag/friend" />
-    <rdf:li resource="http://del.icio.us/tag/weblog" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://maggidawn.typepad.com/maggidawn/">
-<title>maggi dawn</title>
-<link>http://maggidawn.typepad.com/maggidawn/</link>
-<dc:creator>sssshhhh</dc:creator>
-<dc:date>2004-12-27T11:20:11Z</dc:date>
-<dc:subject>Greenbelt ideas links thinking weblog</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/Greenbelt" />
-    <rdf:li resource="http://del.icio.us/tag/thinking" />
-    <rdf:li resource="http://del.icio.us/tag/ideas" />
-    <rdf:li resource="http://del.icio.us/tag/links" />
-    <rdf:li resource="http://del.icio.us/tag/weblog" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://www.johndavies.org/">
-<title>John Davies</title>
-<link>http://www.johndavies.org/</link>
-<dc:creator>sssshhhh</dc:creator>
-<dc:date>2004-12-27T11:18:37Z</dc:date>
-<dc:subject>Greenbelt ideas links thinking weblog</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/Greenbelt" />
-    <rdf:li resource="http://del.icio.us/tag/thinking" />
-    <rdf:li resource="http://del.icio.us/tag/ideas" />
-    <rdf:li resource="http://del.icio.us/tag/links" />
-    <rdf:li resource="http://del.icio.us/tag/weblog" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-<item rdf:about="http://jonnybaker.blogs.com/">
-<title>jonnybaker</title>
-<link>http://jonnybaker.blogs.com/</link>
-<dc:creator>sssshhhh</dc:creator>
-<dc:date>2004-12-27T11:18:17Z</dc:date>
-<dc:subject>Greenbelt event ideas links resources thinking weblog youth</dc:subject>
-<taxo:topics>
-  <rdf:Bag>
-    <rdf:li resource="http://del.icio.us/tag/Greenbelt" />
-    <rdf:li resource="http://del.icio.us/tag/thinking" />
-    <rdf:li resource="http://del.icio.us/tag/ideas" />
-    <rdf:li resource="http://del.icio.us/tag/links" />
-    <rdf:li resource="http://del.icio.us/tag/weblog" />
-    <rdf:li resource="http://del.icio.us/tag/youth" />
-    <rdf:li resource="http://del.icio.us/tag/event" />
-    <rdf:li resource="http://del.icio.us/tag/resources" />
-  </rdf:Bag>
-</taxo:topics>
-</item>
-
-</rdf:RDF>
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed b/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed
deleted file mode 100755 (executable)
index 57e83af..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r
-<feed version="0.3" xmlns="http://purl.org/atom/ns#" \r
-    xmlns:dc="http://purl.org/dc/elements/1.1/">\r
-\r
-       <title>jamesstewart - Everyone's Tagged Photos</title>\r
-       <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/tags/jamesstewart/"/>\r
-       <link rel="icon" type="image/jpeg" href="http://www.flickr.com/images/buddyicon.jpg"/>\r
-       <info type="text/html" mode="escaped">A feed of jamesstewart - Everyone's Tagged Photos</info>\r
-       <modified>2005-08-01T18:50:26Z</modified>\r
-       <generator url="http://www.flickr.com/">Flickr</generator>\r
-\r
-       <entry>\r
-               <title>Oma and James</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/30484029@N00/30367516/"/>\r
-               <link rel='enclosure' type="application/xml" href="http://james.anthropiccollective.org" />\r
-               <id>tag:flickr.com,2004:/photo/30367516</id>\r
-               <issued>2005-08-01T18:50:26Z</issued>\r
-               <modified>2005-08-01T18:50:26Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/30484029@N00/&quot;&gt;kstewart&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/30484029@N00/30367516/&quot; title=&quot;Oma and James&quot;&gt;&lt;img src=&quot;http://photos23.flickr.com/30367516_1f685a16e8_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Oma and James&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-&lt;p&gt;I have a beautiful Oma and a gorgeous husband.&lt;/p&gt;</content>\r
-               <author>\r
-                       <name>kstewart</name>\r
-                       <url>http://www.flickr.com/people/30484029@N00/</url>\r
-               </author>\r
-                               <dc:subject>jamesstewart oma stoelfamily</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title></title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/buddscreek/21376174/"/>\r
-               <id>tag:flickr.com,2004:/photo/21376174</id>\r
-               <issued>2005-06-25T02:00:35Z</issued>\r
-               <modified>2005-06-25T02:00:35Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/buddscreek/&quot;&gt;Lan Rover&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/buddscreek/21376174/&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://photos17.flickr.com/21376174_4314fd8d5c_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-&lt;p&gt;AMA Motocross Championship 2005, Budds Creek, Maryland&lt;/p&gt;</content>\r
-               <author>\r
-                       <name>Lan Rover</name>\r
-                       <url>http://www.flickr.com/people/buddscreek/</url>\r
-               </author>\r
-                               <dc:subject>amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational rickycarmichael 259 jamesstewart 4</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title></title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/buddscreek/21375650/"/>\r
-               <id>tag:flickr.com,2004:/photo/21375650</id>\r
-               <issued>2005-06-25T01:56:24Z</issued>\r
-               <modified>2005-06-25T01:56:24Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/buddscreek/&quot;&gt;Lan Rover&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/buddscreek/21375650/&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://photos16.flickr.com/21375650_5c60e0dab1_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>Lan Rover</name>\r
-                       <url>http://www.flickr.com/people/buddscreek/</url>\r
-               </author>\r
-                               <dc:subject>amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational 259 jamesstewart</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title></title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/buddscreek/21375345/"/>\r
-               <id>tag:flickr.com,2004:/photo/21375345</id>\r
-               <issued>2005-06-25T01:54:11Z</issued>\r
-               <modified>2005-06-25T01:54:11Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/buddscreek/&quot;&gt;Lan Rover&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/buddscreek/21375345/&quot; title=&quot;&quot;&gt;&lt;img src=&quot;http://photos15.flickr.com/21375345_4205fdd22b_m.jpg&quot; width=&quot;160&quot; height=&quot;240&quot; alt=&quot;&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>Lan Rover</name>\r
-                       <url>http://www.flickr.com/people/buddscreek/</url>\r
-               </author>\r
-                               <dc:subject>amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational 259 jamesstewart</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>Lunch with Kari &amp; James, café in the crypt of St Martin in the fields</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/fidothe/16516618/"/>\r
-               <id>tag:flickr.com,2004:/photo/16516618</id>\r
-               <issued>2005-05-30T21:56:39Z</issued>\r
-               <modified>2005-05-30T21:56:39Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/fidothe/&quot;&gt;fidothe&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/fidothe/16516618/&quot; title=&quot;Lunch with Kari &amp;amp; James, café in the crypt of St Martin in the fields&quot;&gt;&lt;img src=&quot;http://photos14.flickr.com/16516618_afaa4a395e_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Lunch with Kari &amp;amp; James, café in the crypt of St Martin in the fields&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>fidothe</name>\r
-                       <url>http://www.flickr.com/people/fidothe/</url>\r
-               </author>\r
-                               <dc:subject>nokia7610 london stmartininthefields clarepatterson jamesstewart parvinstewart jimstewart susanstewart</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>Stewart keeping it low over the obstacle.</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/pqbon/10224728/"/>\r
-               <id>tag:flickr.com,2004:/photo/10224728</id>\r
-               <issued>2005-04-21T07:30:29Z</issued>\r
-               <modified>2005-04-21T07:30:29Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/pqbon/&quot;&gt;pqbon&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/pqbon/10224728/&quot; title=&quot;Stewart keeping it low over the obstacle.&quot;&gt;&lt;img src=&quot;http://photos7.flickr.com/10224728_b756341957_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Stewart keeping it low over the obstacle.&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>pqbon</name>\r
-                       <url>http://www.flickr.com/people/pqbon/</url>\r
-               </author>\r
-                               <dc:subject>ama hangtown motocross jamesstewart bubba</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>king james stewart</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/jjlook/7152910/"/>\r
-               <id>tag:flickr.com,2004:/photo/7152910</id>\r
-               <issued>2005-03-22T21:53:37Z</issued>\r
-               <modified>2005-03-22T21:53:37Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/jjlook/&quot;&gt;jj look&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/jjlook/7152910/&quot; title=&quot;king james stewart&quot;&gt;&lt;img src=&quot;http://photos7.flickr.com/7152910_a02ab5a750_m.jpg&quot; width=&quot;180&quot; height=&quot;240&quot; alt=&quot;king james stewart&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-&lt;p&gt;11th&lt;/p&gt;</content>\r
-               <author>\r
-                       <name>jj look</name>\r
-                       <url>http://www.flickr.com/people/jjlook/</url>\r
-               </author>\r
-                               <dc:subject>dilomar05 eastside austin texas 78702 kingjames stewart jamesstewart borrowed</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/fidothe/1586562/"/>\r
-               <id>tag:flickr.com,2004:/photo/1586562</id>\r
-               <issued>2004-11-20T09:34:28Z</issued>\r
-               <modified>2004-11-20T09:34:28Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/fidothe/&quot;&gt;fidothe&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/fidothe/1586562/&quot; title=&quot;It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)&quot;&gt;&lt;img src=&quot;http://photos2.flickr.com/1586562_0bc5313a3e_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>fidothe</name>\r
-                       <url>http://www.flickr.com/people/fidothe/</url>\r
-               </author>\r
-                               <dc:subject>holiday grandrapids jamesstewart</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/fidothe/1586539/"/>\r
-               <id>tag:flickr.com,2004:/photo/1586539</id>\r
-               <issued>2004-11-20T09:28:16Z</issued>\r
-               <modified>2004-11-20T09:28:16Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/fidothe/&quot;&gt;fidothe&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/fidothe/1586539/&quot; title=&quot;It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)&quot;&gt;&lt;img src=&quot;http://photos2.flickr.com/1586539_c51e5f2e7a_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>fidothe</name>\r
-                       <url>http://www.flickr.com/people/fidothe/</url>\r
-               </author>\r
-                               <dc:subject>holiday grandrapids jamesstewart</dc:subject>\r
-       </entry>\r
-       <entry>\r
-               <title>It's a Grind, James and Jim can't decide)</title>\r
-               <link rel="alternate" type="text/html" href="http://www.flickr.com/photos/fidothe/1586514/"/>\r
-               <id>tag:flickr.com,2004:/photo/1586514</id>\r
-               <issued>2004-11-20T09:25:05Z</issued>\r
-               <modified>2004-11-20T09:25:05Z</modified>\r
-               <content type="text/html" mode="escaped">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/people/fidothe/&quot;&gt;fidothe&lt;/a&gt; posted a photo:&lt;/p&gt;\r
-\r
-&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/fidothe/1586514/&quot; title=&quot;It's a Grind, James and Jim can't decide)&quot;&gt;&lt;img src=&quot;http://photos2.flickr.com/1586514_733c2dfa3e_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;It's a Grind, James and Jim can't decide)&quot; style=&quot;border: 1px solid #000000;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;\r
-\r
-</content>\r
-               <author>\r
-                       <name>fidothe</name>\r
-                       <url>http://www.flickr.com/people/fidothe/</url>\r
-               </author>\r
-                               <dc:subject>holiday grandrapids jamesstewart johnkentish</dc:subject>\r
-       </entry>\r
-\r
-</feed>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml b/plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml
deleted file mode 100755 (executable)
index c351d3c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>\r<feed xmlns="http://www.w3.org/2005/Atom"\r xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">\r<title>Updates to Grand Rapids WiFi hotspot details</title>\r<link rel="alternate" type="text/html" href="http://grwifi.net/"/>\r<link rel="self" type="application/atom+xml" href="http://grwifi.net/atom/locations"/>\r<updated>2005-09-01T15:43:01-05:00</updated>\r<subtitle>WiFi Hotspots in Grand Rapids, MI</subtitle>\r<id>http://grwifi.net/atom/locations</id>\r<rights>Creative Commons Attribution-NonCommercial-ShareAlike 2.0 http://creativecommons.org/licenses/by-nc-sa/2.0/ </rights>\r\r\r<entry>\r    <title>Hotspot Details Updated: Sweetwaters</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/sweetwaters"/>\r    <id>http://grwifi.net/location/sweetwaters</id>\r    <updated>2005-09-01T15:43:01-05:00</updated>\r\r        <summary type="html">\r          The details of the WiFi hotspot at: Sweetwaters have been updated. Find out more at:
-http://grwifi.net/location/sweetwaters\r        </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r\r<entry>\r    <title>Hotspot Details Updated: Common Ground Coffee Shop</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/common-ground"/>\r    <id>http://grwifi.net/location/common-ground</id>\r    <updated>2005-09-01T15:42:39-05:00</updated>\r\r     <summary type="html">\r          The details of the WiFi hotspot at: Common Ground Coffee Shop have been updated. Find out more at:
-http://grwifi.net/location/common-ground\r      </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r\r<entry>\r    <title>Hotspot Details Updated: Grand Rapids Public Library, Main Branch</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/grpl-main-branch"/>\r    <id>http://grwifi.net/location/grpl-main-branch</id>\r    <updated>2005-09-01T15:42:20-05:00</updated>\r\r        <summary type="html">\r          The details of the WiFi hotspot at: Grand Rapids Public Library, Main Branch have been updated. Find out more at:
-http://grwifi.net/location/grpl-main-branch\r   </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r\r<entry>\r    <title>Hotspot Details Updated: Four Friends Coffee House</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/four-friends"/>\r    <id>http://grwifi.net/location/four-friends</id>\r    <updated>2005-09-01T15:41:35-05:00</updated>\r\r       <summary type="html">\r          The details of the WiFi hotspot at: Four Friends Coffee House have been updated. Find out more at:
-http://grwifi.net/location/four-friends\r       </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r\r<entry>\r    <title>Hotspot Details Updated: Barnes and Noble, Rivertown Crossings</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/barnes-noble-rivertown"/>\r    <id>http://grwifi.net/location/barnes-noble-rivertown</id>\r    <updated>2005-09-01T15:40:41-05:00</updated>\r\r       <summary type="html">\r          The details of the WiFi hotspot at: Barnes and Noble, Rivertown Crossings have been updated. Find out more at:
-http://grwifi.net/location/barnes-noble-rivertown\r     </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r\r<entry>\r    <title>Hotspot Details Updated: The Boss Sports Bar &amp; Grille</title>\r    <link rel="alternate" type="text/html" href="http://grwifi.net/location/boss-sports-bar"/>\r    <id>http://grwifi.net/location/boss-sports-bar</id>\r    <updated>2005-09-01T15:40:19-05:00</updated>\r\r  <summary type="html">\r          The details of the WiFi hotspot at: The Boss Sports Bar &amp; Grille have been updated. Find out more at:
-http://grwifi.net/location/boss-sports-bar\r    </summary>\r\r    <author>\r               <name>James</name>\r             <uri>http://jystewart.net</uri>\r                <email>james@jystewart.net</email>      </author>\r      <dc:subject>wifi hotspot</dc:subject>\r</entry>\r</feed>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/hoder.xml b/plugins/OStatus/extlib/XML/Feed/samples/hoder.xml
deleted file mode 100755 (executable)
index 0994635..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<rss version="2.0" 
-  xmlns:dc="http://purl.org/dc/elements/1.1/"
-  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
-  xmlns:admin="http://webns.net/mvcb/"
-  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-
-<channel>
-<title>Editor: Myself (Persian)</title>
-<link>http://editormyself.info</link>
-<description>This is a Persian (Farsi) weblog, written by Hossein Derakhshan (aka, Hoder), an Iranian Multimedia designer and a journalist who lives in Toronto since Dec 2000. He also keeps an English weblog with the same name.</description>
-<dc:language>en-us</dc:language>
-<dc:creator>hoder@hotmail.com</dc:creator>
-<dc:date>2005-10-12T19:45:32-05:00</dc:date>
-<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=3.15" />
-<sy:updatePeriod>hourly</sy:updatePeriod>
-<sy:updateFrequency>1</sy:updateFrequency>
-<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
-
-
-<item>
-<title>لينکدونی‌ | جلسه‌ی امریکن انترپرایز برای تقسیم قومی ایران</title>
-<link>http://www.aei.org/events/type.upcoming,eventID.1166,filter.all/event_detail.asp</link>
-<description>چطور بعضی‌ها فکر می‌کنند دست راستی‌های آمریکا از خامنه‌ای ملی‌گراترند</description>
-<guid isPermaLink="false">14645@http://i.hoder.com/</guid>
-<dc:subject>iran</dc:subject>
-<dc:date>2005-10-12T19:45:32-05:00</dc:date>
-</item>
-
-<item>
-<title>لينکدونی‌ | به صبحانه آگهی بدهید</title>
-<link>http://www.adbrite.com/mb/commerce/purchase_form.php?opid=24346&amp;afsid=1</link>
-<description>خیلی ارزان و راحت است</description>
-<guid isPermaLink="false">14644@http://i.hoder.com/</guid>
-<dc:subject>media/journalism</dc:subject>
-<dc:date>2005-10-12T17:23:15-05:00</dc:date>
-</item>
-
-<item>
-<title>لينکدونی‌ | نیروی انتظامی چگونه تابوهای هم‌جنس‌گرایانه را می‌شکند؛ فرنگوپولیس</title>
-<link>http://farangeopolis.blogspot.com/2005/10/blog-post_08.html</link>
-<description>از پس و پیش و حاشیه‌ی این ماجرا می‌توان یک مستند بی‌نظیر ساخت</description>
-<guid isPermaLink="false">14643@http://i.hoder.com/</guid>
-<dc:subject>soc_popculture</dc:subject>
-<dc:date>2005-10-12T17:06:40-05:00</dc:date>
-</item>
-
-<item>
-<title>لينکدونی‌ | بازتاب توقیف شد</title>
-<link>http://www.baztab.com/news/30201.php</link>
-<description>اگر گفتید یک وب‌سایت را چطور توقیف می‌کنند؟ لابد ماوس‌شان را قایم می‌کنند.</description>
-<guid isPermaLink="false">14642@http://i.hoder.com/</guid>
-<dc:subject>media/journalism</dc:subject>
-<dc:date>2005-10-12T14:41:57-05:00</dc:date>
-</item>
-
-<item>
-<title>لينکدونی‌ | رشد وب در سال 2005 از همیشه بیشتر بوده است&quot; بی.بی.سی</title>
-<link>http://news.bbc.co.uk/2/hi/technology/4325918.stm</link>
-<description></description>
-<guid isPermaLink="false">14640@http://i.hoder.com/</guid>
-<dc:subject>tech</dc:subject>
-<dc:date>2005-10-12T13:04:46-05:00</dc:date>
-</item>
-
-
-
-<item>
-<title>==قرعه کشی گرین کارد به زودی شروع می‌شود==</title>
-<link>http://nice.newsxphotos.biz/05/09/2007_dv_lottery_registration_to_begin_oct_5_14589.php</link>
-<description></description>
-<guid isPermaLink="false">14613@http://vagrantly.com</guid>
-<dc:subject>ads03</dc:subject>
-<dc:date>2005-09-27T04:49:22-05:00</dc:date>
-</item>
-
-
-
-
-
-
-<item>
-<title>پروژه‌ی هاروارد، قدم دوم</title>
-<link>http://editormyself.info/archives/2005/10/051012_014641.shtml</link>
-<description><![CDATA[<p>اگر یادتان باشد <a href="/archives/2005/09/050906_014504.shtml">چند وقت پیش نوشتم</a> که دانشگاه هاروارد پروژه‌ای دارد با نام آواهای جهانی که در آن به وبلاگ‌های غیر انگلیسی‌زبان می‌پردازد. خواشتم که اگر کسی علاقه دارد ایمیل بزند. تعداد زیادی جواب دادند و ابراز علاقه کردند. حالا وقت قدم دوم است.</p>
-
-<p>قدم دوم این است که برای اینکه مسوولین پروژه بتوانند تصمیم بگیرند که با چه کسی کار کنند، می‌خواهند نمونه‌ی کارهای علاقمندان مشارکت در این پرزو‌ه را ببینند.</p>
-
-<p>برای همین از همه‌ی علاقماندان، حتی کسانی که قبلا اعلام آمادگی نکرده بودند، می‌‌خواهم که یک موضوع رایج این روزهای وبلاگستان فارسی را انتخاب کنند و در هفتصد کلمه، به انگلیسی، بنویسند که وبلاگ‌دارهای درباره‌اش چه می‌گویند. لینک به پنج، شش وبلاگ و بازنویسی آنچه آنها از جنبه‌های گوناگون درباره‌ی آن موضوع نوشته‌اند با نقل قول مستقیم از آنها (البته ترجمه شده از فارسی) کافی است. دو سه جمله هم اول کار توضیح دهید که چرا این موضوع مهم است.</p>
-
-<p>متن نمونه را به آدرس ایمیل من hoder@hoder.com و نیز برای افراد زیر تا روز دوشنبه بفرستید:<br />
-ربکا : rmackinnon@cyber.law.harvard.edu<br />
-هیثم: haitham.sabbah@gmail.com</p>]]></description>
-<guid isPermaLink="false">14641@http://editormyself.info</guid>
-<dc:subject>weblog</dc:subject>
-<dc:date>2005-10-12T14:04:23-05:00</dc:date>
-</item>
-
-
-
-</channel>
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml b/plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml
deleted file mode 100755 (executable)
index 6121868..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--\r
-Description: entry author name\r
-Expect:      bozo and entries[0]['author_detail']['name'] == u'Example author'\r
--->\r
-<feed xmlns="http://www.w3.org/2005/Atom">\r
-<entry>\r
-  <author>\r
-    <name>Example author</name>\r
-    <email>me@example.com</email>\r
-    <uri>http://example.com/</uri>\r
-  </author>\r
-</entry>\r
-</feed
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml
deleted file mode 100755 (executable)
index b0a1fee..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd">
-<rss version="0.91">
-<channel>
-<copyright>Copyright 1997-1999 UserLand Software, Inc.</copyright>
-<pubDate>Thu, 08 Jul 1999 07:00:00 GMT</pubDate>
-<lastBuildDate>Thu, 08 Jul 1999 16:20:26 GMT</lastBuildDate>
-<docs>http://my.userland.com/stories/storyReader$11</docs>
-<description>News and commentary from the cross-platform scripting community.</description>
-<link>http://www.scripting.com/</link>
-<title>Scripting News</title>
-<image>
-<link>http://www.scripting.com/</link>
-<title>Scripting News</title>
-<url>http://www.scripting.com/gifs/tinyScriptingNews.gif</url>
-<height>40</height>
-<width>78</width>
-<description>What is this used for?</description>
-</image>
-<managingEditor>dave@userland.com (Dave Winer)</managingEditor>
-<webMaster>dave@userland.com (Dave Winer)</webMaster>
-<language>en-us</language>
-<skipHours>
-<hour>6</hour>
-<hour>7</hour>
-<hour>8</hour>
-<hour>9</hour>
-<hour>10</hour>
-<hour>11</hour>
-</skipHours>
-<skipDays>
-<day>Sunday</day>
-</skipDays>
-<rating>(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))</rating>
-<item>
-<title>stuff</title>
-<link>http://bar</link>
-<description>This is an article about some stuff</description>
-</item>
-<textinput>
-<title>Search Now!</title>
-<description>Enter your search &lt;terms&gt;</description>
-<name>find</name>
-<link>http://my.site.com/search.cgi</link>
-</textinput>
-</channel>
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml
deleted file mode 100755 (executable)
index cfe9169..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="EuC-JP"?>  
-<!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd">
-<rss version="0.91">
-<channel>
-<title>膮ŸÛë´é´Ì´×´è´ŒÁ¹´Õ</title>
-<link>http://www.mozilla.org</link>
-<description>膮ŸÛë´é´Ì´×´è´ŒÁ¹´Õ</description>
-<language>ja</language>  <!-- tagged as Japanese content -->
-<item>
-<title>NYÒ™Á¢¸»ÌêÛì15285.25´ƒ´‘Á£´Û´—´ÀÁ¹´ê´Ì´éÒ™Ûì¡êçÒÕ‰ÌêÁ£</title>
-<link>http://www.mozilla.org/status/</link>
-<description>This is an item description...</description>
-</item>
-<item>
-<title>‚§±Çç¡ËßÛÂÒ\8féøÓ¸Á£Ë²®Ÿè†Ûèå\8d±ÇÌ’¡Íæ—éøë‡Á£</title>
-<link>http://www.mozilla.org/status/</link>
-<description>This is an item description...</description>
-</item>
-<item>
-<title>ËÜË”\81ïÌëÈšÁ¢È†Ë§æàÀ豎ˉۂÁ¢Ë‚åܼšÛ˜íËüËÁ£</title>
-<link>http://www.mozilla.org/status/</link>
-<description>This is an item description...</description>
-</item>
-<item>
-<title>2000‚øíŠå\90Á¢«‘¦éÛë¹\8fÛ\90çéÛ§ÛÂè†ÒæÓ¸Á£Ì¾«…æ—ÕÝéøƒ¸Á£</title>
-<link>http://www.mozilla.org/status/</link>
-<description>This is an item description...</description>
-</item>
-</channel>
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml
deleted file mode 100755 (executable)
index f0964a2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd">
-<rss version="0.91">
-<channel>
-<language>en</language>
-<description>News and commentary from the cross-platform scripting community.</description>
-<link>http://www.scripting.com/</link>
-<title>Scripting News</title>
-<image>
-<link>http://www.scripting.com/</link>
-<title>Scripting News</title>
-<url>http://www.scripting.com/gifs/tinyScriptingNews.gif</url>
-</image>
-</channel>
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml
deleted file mode 100755 (executable)
index 5d75c35..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0"?>
-<!-- RSS generation done by 'Radio UserLand' on Fri, 13 Apr 2001 19:23:02 GMT -->
-<rss version="0.92">
-       <channel>
-               <title>Dave Winer: Grateful Dead</title>
-               <link>http://www.scripting.com/blog/categories/gratefulDead.html</link>
-               <description>A high-fidelity Grateful Dead song every day. This is where we&apos;re experimenting with enclosures on RSS news items that download when you&apos;re not using your computer. If it works (it will) it will be the end of the Click-And-Wait multimedia experience on the Internet. </description>
-               <lastBuildDate>Fri, 13 Apr 2001 19:23:02 GMT</lastBuildDate>
-               <docs>http://backend.userland.com/rss092</docs>
-               <managingEditor>dave@userland.com (Dave Winer)</managingEditor>
-               <webMaster>dave@userland.com (Dave Winer)</webMaster>
-               <cloud domain="data.ourfavoritesongs.com" port="80" path="/RPC2" registerProcedure="ourFavoriteSongs.rssPleaseNotify" protocol="xml-rpc"/>
-               <item>
-                       <description>It&apos;s been a few days since I added a song to the Grateful Dead channel. Now that there are all these new Radio users, many of whom are tuned into this channel (it&apos;s #16 on the hotlist of upstreaming Radio users, there&apos;s no way of knowing how many non-upstreaming users are subscribing, have to do something about this..). Anyway, tonight&apos;s song is a live version of Weather Report Suite from Dick&apos;s Picks Volume 7. It&apos;s wistful music. Of course a beautiful song, oft-quoted here on Scripting News. &lt;i&gt;A little change, the wind and rain.&lt;/i&gt;
-</description>
-                       <enclosure url="http://www.scripting.com/mp3s/weatherReportDicksPicsVol7.mp3" length="6182912" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Kevin Drennan started a &lt;a href=&quot;http://deadend.editthispage.com/&quot;&gt;Grateful Dead Weblog&lt;/a&gt;. Hey it&apos;s cool, he even has a &lt;a href=&quot;http://deadend.editthispage.com/directory/61&quot;&gt;directory&lt;/a&gt;. &lt;i&gt;A Frontier 7 feature.&lt;/i&gt;</description>
-                       <source url="http://scriptingnews.userland.com/xml/scriptingNews2.xml">Scripting News</source>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/other1.html&quot;&gt;The Other One&lt;/a&gt;, live instrumental, One From The Vault. Very rhythmic very spacy, you can listen to it many times, and enjoy something new every time.</description>
-                       <enclosure url="http://www.scripting.com/mp3s/theOtherOne.mp3" length="6666097" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>This is a test of a change I just made. Still diggin..</description>
-                       </item>
-               <item>
-                       <description>The HTML rendering almost &lt;a href=&quot;http://validator.w3.org/check/referer&quot;&gt;validates&lt;/a&gt;. Close. Hey I wonder if anyone has ever published a style guide for ALT attributes on images? What are you supposed to say in the ALT attribute? I sure don&apos;t know. If you&apos;re blind send me an email if u cn rd ths. </description>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Franklin&apos;s_Tower.txt&quot;&gt;Franklin&apos;s Tower&lt;/a&gt;, a live version from One From The Vault.</description>
-                       <enclosure url="http://www.scripting.com/mp3s/franklinsTower.mp3" length="6701402" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Moshe Weitzman says Shakedown Street is what I&apos;m lookin for for tonight. I&apos;m listening right now. It&apos;s one of my favorites. &quot;Don&apos;t tell me this town ain&apos;t got no heart.&quot; Too bright. I like the jazziness of Weather Report Suite. Dreamy and soft. How about The Other One? &quot;Spanish lady come to me..&quot;</description>
-                       <source url="http://scriptingnews.userland.com/xml/scriptingNews2.xml">Scripting News</source>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.scripting.com/mp3s/youWinAgain.mp3&quot;&gt;The news is out&lt;/a&gt;, all over town..&lt;p&gt;
-You&apos;ve been seen, out runnin round. &lt;p&gt;
-The lyrics are &lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/You_Win_Again.txt&quot;&gt;here&lt;/a&gt;, short and sweet. &lt;p&gt;
-&lt;i&gt;You win again!&lt;/i&gt;
-</description>
-                       <enclosure url="http://www.scripting.com/mp3s/youWinAgain.mp3" length="3874816" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.getlyrics.com/lyrics/grateful-dead/wake-of-the-flood/07.htm&quot;&gt;Weather Report Suite&lt;/a&gt;: &quot;Winter rain, now tell me why, summers fade, and roses die? The answer came. The wind and rain. Golden hills, now veiled in grey, summer leaves have blown away. Now what remains? The wind and rain.&quot;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://arts.ucsc.edu/gdead/agdl/darkstar.html&quot;&gt;Dark Star&lt;/a&gt; crashes, pouring its light into ashes.</description>
-                       <enclosure url="http://www.scripting.com/mp3s/darkStar.mp3" length="10889216" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>DaveNet: &lt;a href=&quot;http://davenet.userland.com/2001/01/21/theUsBlues&quot;&gt;The U.S. Blues&lt;/a&gt;.</description>
-                       </item>
-               <item>
-                       <description>Still listening to the US Blues. &lt;i&gt;&quot;Wave that flag, wave it wide and high..&quot;&lt;/i&gt; Mistake made in the 60s. We gave our country to the assholes. Ah ah. Let&apos;s take it back. Hey I&apos;m still a hippie. &lt;i&gt;&quot;You could call this song The United States Blues.&quot;&lt;/i&gt;</description>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.sixties.com/html/garcia_stack_0.html&quot;&gt;&lt;img src=&quot;http://www.scripting.com/images/captainTripsSmall.gif&quot; height=&quot;51&quot; width=&quot;42&quot; border=&quot;0&quot; hspace=&quot;10&quot; vspace=&quot;10&quot; align=&quot;right&quot;&gt;&lt;/a&gt;In celebration of today&apos;s inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the &lt;a href=&quot;http://searchlyrics2.homestead.com/gd_usblues.html&quot;&gt;lyrics&lt;/a&gt;. Click on the audio icon to the left to give it a listen. &quot;Red and white, blue suede shoes, I&apos;m Uncle Sam, how do you do?&quot; It&apos;s a different kind of patriotic music, but man I love my country and I love Jerry and the band. &lt;i&gt;I truly do!&lt;/i&gt;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/usBlues.mp3" length="5272510" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Grateful Dead: &quot;Tennessee, Tennessee, ain&apos;t no place I&apos;d rather be.&quot;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/tennesseeJed.mp3" length="3442648" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Ed Cone: &quot;Had a nice Deadhead experience with my wife, who never was one but gets the vibe and knows and likes a lot of the music. Somehow she made it to the age of 40 without ever hearing Wharf Rat. We drove to Jersey and back over Christmas with the live album commonly known as Skull and Roses in the CD player much of the way, and it was cool to see her discover one the band&apos;s finest moments. That song is unique and underappreciated. Fun to hear that disc again after a few years off -- you get Jerry as blues-guitar hero on Big Railroad Blues and a nice version of Bertha.&quot;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/darkStarWharfRat.mp3" length="27503386" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/fotd.html&quot;&gt;Tonight&apos;s Song&lt;/a&gt;: &quot;If I get home before daylight I just might get some sleep tonight.&quot; </description>
-                       <enclosure url="http://www.scripting.com/mp3s/friendOfTheDevil.mp3" length="3219742" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://arts.ucsc.edu/GDead/AGDL/uncle.html&quot;&gt;Tonight&apos;s song&lt;/a&gt;: &quot;Come hear Uncle John&apos;s Band by the river side. Got some things to talk about here beside the rising tide.&quot;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/uncleJohnsBand.mp3" length="4587102" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Me_and_My_Uncle.txt&quot;&gt;Me and My Uncle&lt;/a&gt;: &quot;I loved my uncle, God rest his soul, taught me good, Lord, taught me all I know. Taught me so well, I grabbed that gold and I left his dead ass there by the side of the road.&quot;
-</description>
-                       <enclosure url="http://www.scripting.com/mp3s/meAndMyUncle.mp3" length="2949248" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Truckin, like the doo-dah man, once told me gotta play your hand. Sometimes the cards ain&apos;t worth a dime, if you don&apos;t lay em down.</description>
-                       <enclosure url="http://www.scripting.com/mp3s/truckin.mp3" length="4847908" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>Two-Way-Web: &lt;a href=&quot;http://www.thetwowayweb.com/payloadsForRss&quot;&gt;Payloads for RSS&lt;/a&gt;. &quot;When I started talking with Adam late last year, he wanted me to think about high quality video on the Internet, and I totally didn&apos;t want to hear about it.&quot;</description>
-                       </item>
-               <item>
-                       <description>A touch of gray, kinda suits you anyway..</description>
-                       <enclosure url="http://www.scripting.com/mp3s/touchOfGrey.mp3" length="5588242" type="audio/mpeg"/>
-                       </item>
-               <item>
-                       <description>&lt;a href=&quot;http://www.sixties.com/html/garcia_stack_0.html&quot;&gt;&lt;img src=&quot;http://www.scripting.com/images/captainTripsSmall.gif&quot; height=&quot;51&quot; width=&quot;42&quot; border=&quot;0&quot; hspace=&quot;10&quot; vspace=&quot;10&quot; align=&quot;right&quot;&gt;&lt;/a&gt;In celebration of today&apos;s inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the &lt;a href=&quot;http://searchlyrics2.homestead.com/gd_usblues.html&quot;&gt;lyrics&lt;/a&gt;. Click on the audio icon to the left to give it a listen. &quot;Red and white, blue suede shoes, I&apos;m Uncle Sam, how do you do?&quot; It&apos;s a different kind of patriotic music, but man I love my country and I love Jerry and the band. &lt;i&gt;I truly do!&lt;/i&gt;</description>
-                       <enclosure url="http://www.scripting.com/mp3s/usBlues.mp3" length="5272510" type="audio/mpeg"/>
-                       </item>
-               </channel>
-       </rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml
deleted file mode 100755 (executable)
index 0edecf5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-
-<rdf:RDF 
-  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-  xmlns="http://purl.org/rss/1.0/"
->
-
-  <channel rdf:about="http://www.xml.com/xml/news.rss">
-    <title>XML.com</title>
-    <link>http://xml.com/pub</link>
-    <description>
-      XML.com features a rich mix of information and services 
-      for the XML community.
-    </description>
-
-    <image rdf:resource="http://xml.com/universal/images/xml_tiny.gif" />
-
-    <items>
-      <rdf:Seq>
-        <rdf:li resource="http://xml.com/pub/2000/08/09/xslt/xslt.html" />
-        <rdf:li resource="http://xml.com/pub/2000/08/09/rdfdb/index.html" />
-      </rdf:Seq>
-    </items>
-
-    <textinput rdf:resource="http://search.xml.com" />
-
-  </channel>
-  
-  <image rdf:about="http://xml.com/universal/images/xml_tiny.gif">
-    <title>XML.com</title>
-    <link>http://www.xml.com</link>
-    <url>http://xml.com/universal/images/xml_tiny.gif</url>
-  </image>
-  
-  <item rdf:about="http://xml.com/pub/2000/08/09/xslt/xslt.html">
-    <title>Processing Inclusions with XSLT</title>
-    <link>http://xml.com/pub/2000/08/09/xslt/xslt.html</link>
-    <description>
-     Processing document inclusions with general XML tools can be 
-     problematic. This article proposes a way of preserving inclusion 
-     information through SAX-based processing.
-    </description>
-  </item>
-  
-  <item rdf:about="http://xml.com/pub/2000/08/09/rdfdb/index.html">
-    <title>Putting RDF to Work</title>
-    <link>http://xml.com/pub/2000/08/09/rdfdb/index.html</link>
-    <description>
-     Tool and API support for the Resource Description Framework 
-     is slowly coming of age. Edd Dumbill takes a look at RDFDB, 
-     one of the most exciting new RDF toolkits.
-    </description>
-  </item>
-
-  <textinput rdf:about="http://search.xml.com">
-    <title>Search XML.com</title>
-    <description>Search XML.com's XML collection</description>
-    <name>s</name>
-    <link>http://search.xml.com</link>
-  </textinput>
-
-</rdf:RDF>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml
deleted file mode 100755 (executable)
index 26235f7..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?> 
-
-<rdf:RDF 
-  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
-  xmlns:dc="http://purl.org/dc/elements/1.1/"
-  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
-  xmlns:co="http://purl.org/rss/1.0/modules/company/"
-  xmlns:ti="http://purl.org/rss/1.0/modules/textinput/"
-  xmlns="http://purl.org/rss/1.0/"
-> 
-
-  <channel rdf:about="http://meerkat.oreillynet.com/?_fl=rss1.0">
-    <title>Meerkat</title>
-    <link>http://meerkat.oreillynet.com</link>
-    <description>Meerkat: An Open Wire Service</description>
-    <dc:publisher>The O'Reilly Network</dc:publisher>
-    <dc:creator>Rael Dornfest (mailto:rael@oreilly.com)</dc:creator>
-    <dc:rights>Copyright &#169; 2000 O'Reilly &amp; Associates, Inc.</dc:rights>
-    <dc:date>2000-01-01T12:00+00:00</dc:date>
-    <sy:updatePeriod>hourly</sy:updatePeriod>
-    <sy:updateFrequency>2</sy:updateFrequency>
-    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
-
-    <image rdf:resource="http://meerkat.oreillynet.com/icons/meerkat-powered.jpg" />
-
-    <items>
-      <rdf:Seq>
-        <rdf:li resource="http://c.moreover.com/click/here.pl?r123" />
-      </rdf:Seq>
-    </items>
-
-    <textinput rdf:resource="http://meerkat.oreillynet.com" />
-
-  </channel>
-
-  <image rdf:about="http://meerkat.oreillynet.com/icons/meerkat-powered.jpg">
-    <title>Meerkat Powered!</title>
-    <url>http://meerkat.oreillynet.com/icons/meerkat-powered.jpg</url>
-    <link>http://meerkat.oreillynet.com</link>
-  </image>
-
-  <item rdf:about="http://c.moreover.com/click/here.pl?r123">
-    <title>XML: A Disruptive Technology</title> 
-    <link>http://c.moreover.com/click/here.pl?r123</link>
-    <dc:description>
-      XML is placing increasingly heavy loads on the existing technical
-      infrastructure of the Internet.
-    </dc:description>
-    <dc:publisher>The O'Reilly Network</dc:publisher>
-    <dc:creator>Simon St.Laurent (mailto:simonstl@simonstl.com)</dc:creator>
-    <dc:rights>Copyright &#169; 2000 O'Reilly &amp; Associates, Inc.</dc:rights>
-    <dc:subject>XML</dc:subject>
-    <co:name>XML.com</co:name>
-    <co:market>NASDAQ</co:market>
-    <co:symbol>XML</co:symbol>
-  </item> 
-
-  <textinput rdf:about="http://meerkat.oreillynet.com">
-    <title>Search Meerkat</title>
-    <description>Search Meerkat's RSS Database...</description>
-    <name>s</name>
-    <link>http://meerkat.oreillynet.com/</link>
-    <ti:function>search</ti:function>
-    <ti:inputType>regex</ti:inputType>
-  </textinput>
-
-</rdf:RDF>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml
deleted file mode 100755 (executable)
index 53483cc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>\r
-<rss version="2.0" xmlns:content="http://purl.org/rss/1.0.modules/content/">\r
-   <channel>\r
-      <title>Liftoff News</title>\r
-      <link>http://liftoff.msfc.nasa.gov/</link>\r
-      <description>Liftoff to Space Exploration.</description>\r
-      <language>en-us</language>\r
-      <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>\r
-      <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>\r
-      <docs>http://blogs.law.harvard.edu/tech/rss</docs>\r
-      <generator>Weblog Editor 2.0</generator>\r
-      <managingEditor>editor@example.com</managingEditor>\r
-      <webMaster>webmaster@example.com</webMaster>\r
-      <item>\r
-         <title>Star City</title>\r
-         <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>\r
-         <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's &lt;a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm"&gt;Star City&lt;/a&gt;.</description>\r
-         <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>\r
-         <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>\r
-      </item>\r
-      <item>\r
-         <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a &lt;a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm"&gt;partial eclipse of the Sun&lt;/a&gt; on Saturday, May 31st.</description>\r
-         <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>\r
-         <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>\r
-      </item>\r
-      <item>\r
-         <title>The Engine That Does More</title>\r
-         <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link>\r
-         <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly.  The proposed VASIMR engine would do that.</description>\r
-         <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate>\r
-         <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid>\r
-                <content:encoded><![CDATA[<p>Test content</p>]]></content:encoded>\r
-      </item>\r
-      <item>\r
-         <title>Astronauts' Dirty Laundry</title>\r
-         <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>\r
-         <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them.  Instead, astronauts have other options.</description>\r
-         <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>\r
-         <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>\r
-      </item>\r
-   </channel>\r
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml b/plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml
deleted file mode 100755 (executable)
index f8a04bb..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<rss version="2.0">
-<channel>
-<title>Six Apart - News</title>
-<link>http://www.sixapart.jp/</link>
-<description></description>
-<language>ja</language>
-<copyright>Copyright 2005</copyright>
-<lastBuildDate>Fri, 07 Oct 2005 19:09:34 +0900</lastBuildDate>
-<generator>http://www.movabletype.org/?v=3.2-ja</generator>
-<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
-
-<item>
-<title>ファイブ・ディーが、Movable Typeでブログプロモーションをスタート</title>
-<description><![CDATA[<p><img alt="MIYAZAWAblog_banner.jpg" src="http://www.sixapart.jp/MIYAZAWAblog_banner.jpg" width="200" height="88" align="right" /><br />
-ファイブ・ディーは、Movable Typeで構築したプロモーション ブログ『宮沢和史 中南米ツアーblog Latin America 2005』を開設しました。</p>
-
-<p>9月21日に開設されたこのブログは、ブラジル、ホンジュラス、ニカラグア、メキシコ、キューバの5か国を巡る「Latin America 2005」ツアーに合わせ、そのツアーの模様を同行マネージャーがレポートしていきます。<br />
-さらに今月2日からは宮沢和史自身が日々録音した声をPodcastingするという点でも、ブログを使ったユニークなプロモーションとなっています。</p>
-
-<p><a href="http://www.five-d.co.jp/miyazawa/jp/blog/la2005/">「宮沢和史 中南米ツアーblog Latin America 2005」</a></p>
-
-<p>※シックス・アパートではこうしたブログを使ったプロモーションに最適な製品をご用意しております。<br />
-<ul><li><a href="/movabletype/">Movable Type</a><br />
-<li><a href="/typepad/typepad_promotion.html">TypePad Promotion</a><br />
-</ul></p>]]></description>
-<link>http://www.sixapart.jp/news/2005/10/07-1909.html</link>
-<guid>http://www.sixapart.jp/news/2005/10/07-1909.html</guid>
-<category>news</category>
-<pubDate>Fri, 07 Oct 2005 19:09:34 +0900</pubDate>
-</item>
-<item>
-<title>Movable Type 3.2日本語版の提供を開始</title>
-<description><![CDATA[<p><img alt="Movable Type Logo" src="/images/mt3-logo-small.gif" width="151" height="37"/></p>
-<p>シックス・アパートは、Movable Type 3.2日本語版の提供を開始いたしました。<br />
-ベータテストにご協力いただいた多くの皆様に、スタッフ一同、心から感謝いたします。</p>
-<p>製品概要など、詳しくは<a href="http://www.sixapart.jp/press_releases/2005/09/29-1529.html" title="Six Apart - News: シックス・アパートが、スパム対策強化の「Movable Type 3.2 日本語版」を提供開始">プレスリリース</a>をご参照下さい。</p>
-<p>ご購入のご検討は、<a href="http://www.sixapart.jp/movabletype/purchase-mt.html">Movable Typeのご購入</a>からどうぞ。</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/29-1530.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/29-1530.html</guid>
-<category>news</category>
-<pubDate>Thu, 29 Sep 2005 15:30:00 +0900</pubDate>
-</item>
-<item>
-<title>シックス・アパートが、スパム対策強化の「Movable Type 3.2 日本語版」を提供開始</title>
-<description><![CDATA[<p><プレスリリース資料></p>
-<ul>
-  <li><a href="http://www.sixapart.jp/sixapart20050929.pdf">印刷用(PDF版)</a></li>
-</ul>
-<p><strong>シックス・アパートが、スパム対策強化の「Movable Type 3.2 日本語版」を提供開始 ~ スパムの自動判別機能や新ユーザー・インターフェースで、運用管理の機能を強化 ~</strong></p>
-<p>2005年9月29日<br />
-シックス・アパート株式会社</p>
-<p>ブログ・ソフトウェア大手のシックス・アパート株式会社(本社:東京都港区、代表取締役:関 信浩)は、「Movable Type(ムーバブル・タイプ) 3.2 日本語版」(URL:<a href="http://www.sixapart.jp/movabletype/">http://www.sixapart.jp/movabletype/</a>)を9月29日より提供開始いたします。</p>]]></description>
-<link>http://www.sixapart.jp/press_releases/2005/09/29-1529.html</link>
-<guid>http://www.sixapart.jp/press_releases/2005/09/29-1529.html</guid>
-<category>Press Releases</category>
-<pubDate>Thu, 29 Sep 2005 15:29:00 +0900</pubDate>
-</item>
-<item>
-<title>スタッフを募集しています</title>
-<description><![CDATA[<p>シックス・アパートはMovable TypeやTypePadの開発エンジニアなど、スタッフを広く募集しています。具体的な募集職種は次の通りです。</p>
-
-<ul>
-<li><a href="http://www.sixapart.jp/jobs/2005/09/13-0007.html">Movable Type開発エンジニア</a></li>
-<li><a href="http://www.sixapart.jp/jobs/2005/09/13-0004.html">TypePad開発エンジニア</a></li>
-<li><a href="http://www.sixapart.jp/jobs/2005/09/13-0003.html">カスタマーサポート・ディレクター</a></li>
-<li><a href="http://www.sixapart.jp/jobs/2005/09/13-0002.html">マーケティング・広報アシスタント</a></li>
-<li><a href="http://www.sixapart.jp/jobs/2005/09/13-0001.html">開発アシスタント</a></li>
-</ul>
-
-<p>拡大を続ける、日本のブログ市場を積極的にリードする人材を、シックス・アパートは募集しています。上記以外の職種につきましても、お気軽にお問い合わせください。詳しい募集要項や応募方法については、<a href="/jobs/">求人情報のページ</a>をご覧ください。<br />
-</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/27-0906.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/27-0906.html</guid>
-<category>news</category>
-<pubDate>Tue, 27 Sep 2005 09:06:10 +0900</pubDate>
-</item>
-<item>
-<title>サイト接続不具合に関するお詫びと復旧のお知らせ</title>
-<description><![CDATA[<p>9月24日(土)の14:45ごろから、同日18:30ごろまで、シックス・アパート社のウェブサイトが不安定になっており、断続的に接続できない不具合が発生しておりました。このため、この期間中にウェブサイトの閲覧や製品のダウンロードができませんでした。</p>
-
-<p>なお現在は不具合は解消しております。みなさまにご迷惑をおかけしたことをお詫びいたします。</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/26-1000.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/26-1000.html</guid>
-<category>news</category>
-<pubDate>Mon, 26 Sep 2005 10:00:56 +0900</pubDate>
-</item>
-<item>
-<title>企業ブログ向けパッケージ「TypePad Promotion」を新発売</title>
-<description><![CDATA[<p>シックス・アパートは、ウェブログ・サービスTypePadの企業ブログ向けパッケージ「TypePad Promotion」(タイプパッド・プロモーションの発売を10月下旬から開始いたします。</p>
-
-<p>詳しくは、<a href="http://www.sixapart.jp/press_releases/2005/09/20-1500.html" title="プレスリリース: 「TypePad Promotion」新発売">プレスリリース</a>をご参照下さい。</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/20-1500.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/20-1500.html</guid>
-<category>news</category>
-<pubDate>Tue, 20 Sep 2005 15:00:01 +0900</pubDate>
-</item>
-<item>
-<title>シックス・アパートが、法人向けブログパッケージ「TypePad Promotion」を発売</title>
-<description><![CDATA[<p><プレスリリース資料><br />
-<a href="http://www.sixapart.jp/sixapart20050920.pdf">印刷用(PDF版)</a></p>
-
-<p><br />
-<strong>シックス・アパートが、法人向けブログパッケージ「TypePad Promotion」を発売<br />
-~PR/IRサイトやキャンペーンサイトなど企業のプロモーションニーズに特化~<br />
-</strong><br />
-2005年9月20日<br />
-シックス・アパート株式会社</p>
-
-<p>ブログ・サービス大手のシックス・アパート株式会社(本社:東京都港区、代表取締役:関 信浩)は、法人向けプロモーションブログ・パッケージ「TypePad Promotion(タイプパッド・プロモーション)」(URL:<a href="http://www.sixapart.jp/typepad/typepad_promotion.html">http://www.sixapart.jp/typepad/typepad_promotion.html</a>)を10月下旬より販売開始いたします。</p>]]></description>
-<link>http://www.sixapart.jp/press_releases/2005/09/20-1500.html</link>
-<guid>http://www.sixapart.jp/press_releases/2005/09/20-1500.html</guid>
-<category>Press Releases</category>
-<pubDate>Tue, 20 Sep 2005 15:00:00 +0900</pubDate>
-</item>
-<item>
-<title>Six [days] Apart Week</title>
-<description><![CDATA[<p>本日、9月16日はSix Apartの創業者ミナ・トロットの誕生日です。<br />
-私たちの会社は、創業者のトロット夫妻(ベンとミナ)の誕生日が、6日離れていることからSix  [days] Apart →Six Apartという風に名付けられています。本日から22日までの6日間を社名の由来となる Six [days] Apart Weekとして、私たちのプロダクトをご紹介させていただきます。</p>
-
-<p>今日は、ブログ・サービスのTypePad(タイプパッド)をご紹介します。<br />
-<img alt="tp-logo.gif" src="http://www.sixapart.jp/tp-logo.gif" width="227" height="52" /></p>
-
-<p>TypePadは、米国PC MAGAZINE誌の2003年EDITOR'S CHOICE とBEST OF THE YEARに選ばれております。<br />
-<img alt="pcmag-ad.gif" src="http://www.sixapart.jp/pcmag-ad.gif" width="297" height="100" /><br />
-</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/16-1941.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/16-1941.html</guid>
-<category>news</category>
-<pubDate>Fri, 16 Sep 2005 19:41:47 +0900</pubDate>
-</item>
-<item>
-<title>ハイパーワークスが商用フォントを利用できるMovable Typeホスティングサービスを開始</title>
-<description><![CDATA[<p>ソフト開発会社の<a href="http://www.hyperwrx.co.jp/">有限会社ハイパーワークス</a>は、商用フォントなど多彩なフォントをブログ上で利用できるブログ・サービス「<a href="http://glyph-on.jp/">Glyph-On!(グリフォン) Movable Type ホスティング サービス</a>」の提供を開始しました。<br />
-</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/14-1700.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/14-1700.html</guid>
-<category>news</category>
-<pubDate>Wed, 14 Sep 2005 17:00:00 +0900</pubDate>
-</item>
-<item>
-<title>Movable Type開発エンジニアの募集</title>
-<description><![CDATA[<p>
-勤務形態: フルタイム<br />
-勤務地: 東京 (赤坂)<br />
-職種: ソフトウェア・エンジニア<br />
-職務内容: Movable Typeの開発業務全般<br />
-募集人数: 若干名
-</p>]]></description>
-<link>http://www.sixapart.jp/jobs/2005/09/13-0007.html</link>
-<guid>http://www.sixapart.jp/jobs/2005/09/13-0007.html</guid>
-<category>Jobs</category>
-<pubDate>Tue, 13 Sep 2005 00:07:00 +0900</pubDate>
-</item>
-<item>
-<title>TypePad開発エンジニアの募集</title>
-<description><![CDATA[<p>
-勤務形態: フルタイム<br />
-勤務地: 東京 (赤坂)<br />
-職種: アプリケーション・エンジニア<br />
-職務内容: TypePadのカスタマイズ、周辺開発<br />
-募集人数: 若干名
-</p>]]></description>
-<link>http://www.sixapart.jp/jobs/2005/09/13-0004.html</link>
-<guid>http://www.sixapart.jp/jobs/2005/09/13-0004.html</guid>
-<category>Jobs</category>
-<pubDate>Tue, 13 Sep 2005 00:04:00 +0900</pubDate>
-</item>
-<item>
-<title>カスタマーサポート・ディレクターの募集</title>
-<description><![CDATA[<p>勤務形態: フルタイム<br />
-勤務地: 東京(赤坂)<br />
-職種: カスタマーサポート・ディレクター<br />
-職務内容: TypePadやMovable Typeのカスタマーサポート業務の統括<br />
-募集人数: 若干名
-</p>
-]]></description>
-<link>http://www.sixapart.jp/jobs/2005/09/13-0003.html</link>
-<guid>http://www.sixapart.jp/jobs/2005/09/13-0003.html</guid>
-<category>Jobs</category>
-<pubDate>Tue, 13 Sep 2005 00:03:30 +0900</pubDate>
-</item>
-<item>
-<title>アルバイト(マーケティング・広報アシスタント)の募集</title>
-<description><![CDATA[<p>勤務形態: アルバイト<br />
-勤務地: 東京(港区)<br />
-職種:マーケティング・PRのアシスタント業務<br />
-募集人数: 若干名<br />
-時給:1000円~(但し、試用期間終了後に応相談)。交通費支給<br />
-時間:平日10時30分~18時30分まで。週3日以上(応相談)<br />
-</p>]]></description>
-<link>http://www.sixapart.jp/jobs/2005/09/13-0002.html</link>
-<guid>http://www.sixapart.jp/jobs/2005/09/13-0002.html</guid>
-<category>Jobs</category>
-<pubDate>Tue, 13 Sep 2005 00:02:00 +0900</pubDate>
-</item>
-<item>
-<title>アルバイト(開発アシスタント)の募集</title>
-<description><![CDATA[<p>勤務形態: アルバイト<br />
-勤務地: 東京(港区)<br />
-職種: アプリケーション開発のアシスタント業務<br />
-募集人数: 若干名<br />
-時給:1000円~(但し、試用期間終了後に応相談)。交通費支給<br />
-時間:平日10時30分~18時30分まで。週3日以上(応相談)
-</p>]]></description>
-<link>http://www.sixapart.jp/jobs/2005/09/13-0001.html</link>
-<guid>http://www.sixapart.jp/jobs/2005/09/13-0001.html</guid>
-<category>Jobs</category>
-<pubDate>Tue, 13 Sep 2005 00:01:00 +0900</pubDate>
-</item>
-<item>
-<title>TypePad Japan がバージョンアップしました。</title>
-<description><![CDATA[<p><a href="http://www.sixapart.jp/typepad/">「TypePad Japan(タイプパッドジャパン)」</a>において、本日、「TypePad 1.6 日本語版」へのバージョンアップを行いました。最新版となる「TypePad 1.6 日本語版」では、ブログデザインの機能強化、ポッドキャスティング対応、モブログ対応に加え、今回新たに大幅な容量アップが行われております。皆様、新しくなった<a href="http://www.sixapart.jp/typepad/">TypePad Japan</a>にどうぞご期待ください。</p>
-
-<p>なお、TypePadの携帯対応強化に関しましては、本日よりTypePad Japanのお客様を対象にオープン・ベータを開始しております。</p>
-
-<p>2005年9月5日発表のTypePad日本語版 1.6プレスリリースは<a href="http://www.sixapart.jp/press_releases/2005/09/05-1420.html">こちら</a>をご覧下さい。</p>]]></description>
-<link>http://www.sixapart.jp/news/2005/09/12-1953.html</link>
-<guid>http://www.sixapart.jp/news/2005/09/12-1953.html</guid>
-<category>news</category>
-<pubDate>Mon, 12 Sep 2005 19:53:07 +0900</pubDate>
-</item>
-
-
-</channel>
-</rss>
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/samples/technorati.feed b/plugins/OStatus/extlib/XML/Feed/samples/technorati.feed
deleted file mode 100755 (executable)
index 6274a32..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<rss version="2.0"
-    xmlns:tapi="http://api.technorati.com/dtd/tapi-002.xml">
-    <channel>
-        <title>[Technorati] Tag results for greenbelt</title>
-        <link>http://www.technorati.com/tag/greenbelt</link>
-        <description>Posts tagged with "greenbelt" on Technorati.</description>
-        <pubDate>Mon, 08 Aug 2005 15:15:08 GMT</pubDate>
-        <category domain="http://www.technorati.com/tag">greenbelt</category>
-        <tapi:inboundblogs>2</tapi:inboundblogs>
-        <tapi:inboundlinks>2</tapi:inboundlinks>
-        <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" />
-        <generator>Technorati v1.0</generator>
-        <image>
-            <url>http://static.technorati.com/pix/logos/logo_reverse_sm.gif</url>
-            <title>Technorati logo</title>
-            <link>http://www.technorati.com</link>
-        </image>
-        <skipHours>
-            <hour>1</hour>
-            <hour>7</hour>
-            <hour>9</hour>
-        </skipHours>
-        <webMaster>support@technorati.com (Technorati Support)</webMaster>
-        <docs>http://blogs.law.harvad.edu/tech/rss</docs>
-        <ttl>60</ttl>
-        <item>
-            <title>Greenbelt</title>
-            <link>http://maggidawn.typepad.com/maggidawn/2005/07/greenbelt.html</link>
-            <description>So if the plan goes according to plan (!)... I'll be speaking at Greenbelt at these times: Slot 1...</description>
-            <guid isPermaLink="true">http://maggidawn.typepad.com/maggidawn/2005/07/greenbelt.html</guid>
-            <pubDate>Mon, 18 Jul 2005 02:11:42 GMT</pubDate>
-            <category>James</category>
-            <tapi:linkcreated>2005-07-11 02:08:12</tapi:linkcreated>
-            <comments>http://www.technorati.com/cosmos/search.html?url=http%3A%2F%2Fmaggidawn.typepad.com%2Fmaggidawn%2F2005%2F07%2Fgreenbelt.html</comments>
-            <tapi:inboundblogs>190</tapi:inboundblogs>
-            <tapi:inboundlinks>237</tapi:inboundlinks>
-            <source url="http://maggidawn.typepad.com/maggidawn/index.rdf">maggi dawn</source>
-        </item>
-
-        <item>
-            <title>Walking along the Greenbelt</title>
-            <link>http://pictureshomeless.blogspot.com/2005/06/walking-along-greenbelt.html</link>
-            <description>[IMG] Photo of homeless man walking near the greenbelt in Boise, Idaho Tags: photo homeless greenbelt Boise Idaho picture</description>
-            <guid isPermaLink="true">http://pictureshomeless.blogspot.com/2005/06/walking-along-greenbelt.html</guid>
-            <pubDate>Tue, 28 Jun 2005 01:41:24 GMT</pubDate>
-            <tapi:linkcreated>2005-06-26 17:24:03</tapi:linkcreated>
-            <comments>http://www.technorati.com/cosmos/search.html?url=http%3A%2F%2Fpictureshomeless.blogspot.com%2F2005%2F06%2Fwalking-along-greenbelt.html</comments>
-            <tapi:inboundblogs>2</tapi:inboundblogs>
-            <tapi:inboundlinks>2</tapi:inboundlinks>
-        </item>
-
-    </channel>
-</rss>
diff --git a/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc
deleted file mode 100755 (executable)
index e662d26..0000000
+++ /dev/null
@@ -1,338 +0,0 @@
-# -*- rnc -*-
-# RELAX NG Compact Syntax Grammar for the
-# Atom Format Specification Version 11
-
-namespace atom = "http://www.w3.org/2005/Atom"
-namespace xhtml = "http://www.w3.org/1999/xhtml"
-namespace s = "http://www.ascc.net/xml/schematron"
-namespace local = ""
-
-start = atomFeed | atomEntry
-
-# Common attributes
-
-atomCommonAttributes =
-   attribute xml:base { atomUri }?,
-   attribute xml:lang { atomLanguageTag }?,
-   undefinedAttribute*
-
-# Text Constructs
-
-atomPlainTextConstruct =
-   atomCommonAttributes,
-   attribute type { "text" | "html" }?,
-   text
-
-atomXHTMLTextConstruct =
-   atomCommonAttributes,
-   attribute type { "xhtml" },
-   xhtmlDiv
-
-atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct
-
-# Person Construct
-
-atomPersonConstruct =
-   atomCommonAttributes,
-   (element atom:name { text }
-    & element atom:uri { atomUri }?
-    & element atom:email { atomEmailAddress }?
-    & extensionElement*)
-
-# Date Construct
-
-atomDateConstruct =
-   atomCommonAttributes,
-   xsd:dateTime
-
-# atom:feed
-
-atomFeed =
-   [
-      s:rule [
-         context = "atom:feed"
-         s:assert [
-            test = "atom:author or not(atom:entry[not(atom:author)])"
-            "An atom:feed must have an atom:author unless all "
-            ~ "of its atom:entry children have an atom:author."
-         ]
-      ]
-   ]
-   element atom:feed {
-      atomCommonAttributes,
-      (atomAuthor*
-       & atomCategory*
-       & atomContributor*
-       & atomGenerator?
-       & atomIcon?
-       & atomId
-       & atomLink*
-       & atomLogo?
-       & atomRights?
-       & atomSubtitle?
-       & atomTitle
-       & atomUpdated
-       & extensionElement*),
-      atomEntry*
-   }
-
-# atom:entry
-
-atomEntry =
-   [
-      s:rule [
-         context = "atom:entry"
-         s:assert [
-            test = "atom:link[@rel='alternate'] "
-            ~ "or atom:link[not(@rel)] "
-            ~ "or atom:content"
-            "An atom:entry must have at least one atom:link element "
-            ~ "with a rel attribute of 'alternate' "
-            ~ "or an atom:content."
-         ]
-      ]
-      s:rule [
-         context = "atom:entry"
-         s:assert [
-            test = "atom:author or "
-            ~ "../atom:author or atom:source/atom:author"
-            "An atom:entry must have an atom:author "
-            ~ "if its feed does not."
-         ]
-      ]
-   ]
-   element atom:entry {
-      atomCommonAttributes,
-      (atomAuthor*
-       & atomCategory*
-       & atomContent?
-       & atomContributor*
-       & atomId
-       & atomLink*
-       & atomPublished?
-       & atomRights?
-       & atomSource?
-       & atomSummary?
-       & atomTitle
-       & atomUpdated
-       & extensionElement*)
-   }
-
-# atom:content
-
-atomInlineTextContent =
-   element atom:content {
-      atomCommonAttributes,
-      attribute type { "text" | "html" }?,
-      (text)*
-   }
-
-atomInlineXHTMLContent =
-   element atom:content {
-      atomCommonAttributes,
-      attribute type { "xhtml" },
-      xhtmlDiv
-   }
-
-atomInlineOtherContent =
-   element atom:content {
-      atomCommonAttributes,
-      attribute type { atomMediaType }?,
-      (text|anyElement)*
-   }
-
-atomOutOfLineContent =
-   element atom:content {
-      atomCommonAttributes,
-      attribute type { atomMediaType }?,
-      attribute src { atomUri },
-      empty
-   }
-
-atomContent = atomInlineTextContent
- | atomInlineXHTMLContent
- | atomInlineOtherContent
- | atomOutOfLineContent
-
-# atom:author
-
-atomAuthor = element atom:author { atomPersonConstruct }
-
-# atom:category
-
-atomCategory =
-   element atom:category {
-      atomCommonAttributes,
-      attribute term { text },
-      attribute scheme { atomUri }?,
-      attribute label { text }?,
-      undefinedContent
-   }
-
-# atom:contributor
-
-atomContributor = element atom:contributor { atomPersonConstruct }
-
-# atom:generator
-
-atomGenerator = element atom:generator {
-   atomCommonAttributes,
-   attribute uri { atomUri }?,
-   attribute version { text }?,
-   text
-}
-
-# atom:icon
-
-atomIcon = element atom:icon {
-   atomCommonAttributes,
-   (atomUri)
-}
-
-# atom:id
-
-atomId = element atom:id {
-   atomCommonAttributes,
-   (atomUri)
-}
-
-# atom:logo
-
-atomLogo = element atom:logo {
-   atomCommonAttributes,
-   (atomUri)
-}
-
-# atom:link
-
-atomLink =
-   element atom:link {
-      atomCommonAttributes,
-      attribute href { atomUri },
-      attribute rel { atomNCName | atomUri }?,
-      attribute type { atomMediaType }?,
-      attribute hreflang { atomLanguageTag }?,
-      attribute title { text }?,
-      attribute length { text }?,
-      undefinedContent
-   }
-
-# atom:published
-
-atomPublished = element atom:published { atomDateConstruct }
-
-# atom:rights
-
-atomRights = element atom:rights { atomTextConstruct }
-
-# atom:source
-
-atomSource =
-   element atom:source {
-      atomCommonAttributes,
-      (atomAuthor*
-       & atomCategory*
-       & atomContributor*
-       & atomGenerator?
-       & atomIcon?
-       & atomId?
-       & atomLink*
-       & atomLogo?
-       & atomRights?
-       & atomSubtitle?
-       & atomTitle?
-       & atomUpdated?
-       & extensionElement*)
-   }
-
-# atom:subtitle
-
-atomSubtitle = element atom:subtitle { atomTextConstruct }
-
-# atom:summary
-
-atomSummary = element atom:summary { atomTextConstruct }
-
-# atom:title
-
-atomTitle = element atom:title { atomTextConstruct }
-
-# atom:updated
-
-atomUpdated = element atom:updated { atomDateConstruct }
-
-# Low-level simple types
-
-atomNCName = xsd:string { minLength = "1" pattern = "[^:]*" }
-
-# Whatever a media type is, it contains at least one slash
-atomMediaType = xsd:string { pattern = ".+/.+" }
-
-# As defined in RFC 3066
-atomLanguageTag = xsd:string {
-   pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*"
-}
-
-# Unconstrained; it's not entirely clear how IRI fit into
-# xsd:anyURI so let's not try to constrain it here
-atomUri = text
-
-# Whatever an email address is, it contains at least one @
-atomEmailAddress = xsd:string { pattern = ".+@.+" }
-
-# Simple Extension
-
-simpleExtensionElement =
-   element * - atom:* {
-      text
-   }
-
-# Structured Extension
-
-structuredExtensionElement =
-   element * - atom:* {
-      (attribute * { text }+,
-         (text|anyElement)*)
-    | (attribute * { text }*,
-       (text?, anyElement+, (text|anyElement)*))
-   }
-
-# Other Extensibility
-
-extensionElement =
-   simpleExtensionElement | structuredExtensionElement
-
-undefinedAttribute =
-  attribute * - (xml:base | xml:lang | local:*) { text }
-
-undefinedContent = (text|anyForeignElement)*
-
-anyElement =
-   element * {
-      (attribute * { text }
-       | text
-       | anyElement)*
-   }
-
-anyForeignElement =
-   element * - atom:* {
-      (attribute * { text }
-       | text
-       | anyElement)*
-   }
-
-# XHTML
-
-anyXHTML = element xhtml:* {
-   (attribute * { text }
-    | text
-    | anyXHTML)*
-}
-
-xhtmlDiv = element xhtml:div {
-   (attribute * { text }
-    | text
-    | anyXHTML)*
-}
-
-# EOF
\ No newline at end of file
diff --git a/plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc
deleted file mode 100755 (executable)
index 7250947..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- http://www.xml.com/lpt/a/2002/01/23/relaxng.html -->
-<!-- http://www.oasis-open.org/committees/relax-ng/tutorial-20011203.html -->
-<!-- http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_wildcards_st8.html -->
-
-<grammar xmlns='http://relaxng.org/ns/structure/1.0'
-        xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
-        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
-        ns='http://purl.org/rss/1.0/'
-        datatypeLibrary='http://www.w3.org/2001/XMLSchema-datatypes'>
-
-    <start>
-        <element name='RDF' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-            <ref name='RDFContent'/>
-        </element>
-    </start>   
-
-    <define name='RDFContent' ns='http://purl.org/rss/1.0/'>
-        <interleave>
-            <element name='channel'>
-                <ref name='channelContent'/>
-            </element>
-            <optional>
-                <element name='image'><ref name='imageContent'/></element>
-            </optional>
-            <oneOrMore>
-                <element name='item'><ref name='itemContent'/></element>
-            </oneOrMore>
-        </interleave>
-    </define>
-
-     <define name='channelContent' combine="interleave">
-        <interleave>
-            <element name='title'><data type='string'/></element>
-            <element name='link'><data type='anyURI'/></element>
-            <element name='description'><data type='string'/></element>
-            <element name='image'>
-                <attribute name='resource' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                    <data type='anyURI'/>
-                </attribute>
-            </element>
-            <element name='items'>
-                    <ref name='itemsContent'/>
-            </element>
-            <attribute name='about' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                <data type='anyURI'/>
-            </attribute>
-        </interleave>
-    </define>
-    
-        <define name="itemsContent">
-            <element name="Seq" ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                <oneOrMore>
-                    <element name="li" ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                        <choice>
-                            <attribute name='resource'>    <!-- Why doesn't RDF/RSS1.0 ns qualify this attribute? -->
-                                <data type='anyURI'/>
-                            </attribute>
-                            <attribute name='resource' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                                <data type='anyURI'/>
-                            </attribute>
-                        </choice>
-                    </element>
-                </oneOrMore>
-            </element>
-        </define>
-        
-    <define name='imageContent'>
-        <interleave>
-            <element name='title'><data type='string'/></element>
-            <element name='link'><data type='anyURI'/></element>
-            <element name='url'><data type='anyURI'/></element>
-            <attribute name='about' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                <data type='anyURI'/>
-            </attribute>
-        </interleave>
-    </define>
-
-    <define name='itemContent'>
-        <interleave>
-            <element name='title'><data type='string'/></element>
-            <element name='link'><data type='anyURI'/></element>
-            <optional><element name='description'><data type='string'/></element></optional>
-            <ref name="anyThing"/>
-            <attribute name='about' ns='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-                <data type='anyURI'/>
-            </attribute>
-        </interleave>
-    </define>            
-            
-
-        <define name='anyThing'>
-            <zeroOrMore>
-                <choice>
-                    <text/>
-                    <element>
-                        <anyName>
-                            <except>
-                                <nsName/>
-                            </except>
-                        </anyName>
-                        <ref name='anyThing'/>
-                        <zeroOrMore>
-                            <attribute>
-                              <anyName/>
-                            </attribute>
-                        </zeroOrMore>
-                    </element>
-                </choice>
-            </zeroOrMore>
-            </define>
-            
-</grammar>
diff --git a/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc
deleted file mode 100755 (executable)
index c863376..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  RELAX NG Compact Schema for RSS 1.1
-  Sean B. Palmer, inamidst.com
-  Christopher Schmidt, crschmidt.net
-  License: This schema is in the public domain
--->
-<grammar xmlns:rss="http://purl.org/net/rss1.1#" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ns="http://purl.org/net/rss1.1#" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
-  <start>
-    <ref name="Channel"/>
-  </start>
-  <define name="Channel">
-    <a:documentation>http://purl.org/net/rss1.1#Channel</a:documentation>
-    <element name="Channel">
-      <ref name="Channel.content"/>
-
-    </element>
-  </define>
-  <define name="Channel.content">
-    <optional>
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <optional>
-      <ref name="AttrXMLBase"/>
-    </optional>
-
-    <ref name="AttrRDFAbout"/>
-    <interleave>
-      <ref name="title"/>
-      <ref name="link"/>
-      <ref name="description"/>
-      <optional>
-        <ref name="image"/>
-      </optional>
-      <zeroOrMore>
-
-        <ref name="Any"/>
-      </zeroOrMore>
-      <ref name="items"/>
-    </interleave>
-  </define>
-  <define name="title">
-    <a:documentation>http://purl.org/net/rss1.1#title</a:documentation>
-    <element name="title">
-
-      <ref name="title.content"/>
-    </element>
-  </define>
-  <define name="title.content">
-    <optional>
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <text/>
-  </define>
-
-  <define name="link">
-    <a:documentation>http://purl.org/net/rss1.1#link</a:documentation>
-    <element name="link">
-      <ref name="link.content"/>
-    </element>
-  </define>
-  <define name="link.content">
-    <data type="anyURI"/>
-
-  </define>
-  <define name="description">
-    <a:documentation>http://purl.org/net/rss1.1#description</a:documentation>
-    <element name="description">
-      <ref name="description.content"/>
-    </element>
-  </define>
-  <define name="description.content">
-
-    <optional>
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <text/>
-  </define>
-  <define name="image">
-    <a:documentation>http://purl.org/net/rss1.1#image</a:documentation>
-    <element name="image">
-
-      <ref name="image.content"/>
-    </element>
-  </define>
-  <define name="image.content">
-    <optional>
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <ref name="AttrRDFResource"/>
-    <interleave>
-
-      <ref name="title"/>
-      <optional>
-        <ref name="link"/>
-      </optional>
-      <ref name="url"/>
-      <zeroOrMore>
-        <ref name="Any"/>
-      </zeroOrMore>
-    </interleave>
-
-  </define>
-  <define name="url">
-    <a:documentation>http://purl.org/net/rss1.1#url</a:documentation>
-    <element name="url">
-      <ref name="url.content"/>
-    </element>
-  </define>
-  <define name="url.content">
-
-    <data type="anyURI"/>
-  </define>
-  <define name="items">
-    <a:documentation>http://purl.org/net/rss1.1#items</a:documentation>
-    <element name="items">
-      <ref name="items.content"/>
-    </element>
-  </define>
-
-  <define name="items.content">
-    <optional>
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <ref name="AttrRDFCollection"/>
-    <zeroOrMore>
-      <ref name="item"/>
-    </zeroOrMore>
-  </define>
-
-  <define name="item">
-    <a:documentation>http://purl.org/net/rss1.1#item</a:documentation>
-    <element name="item">
-      <ref name="item.content"/>
-    </element>
-  </define>
-  <define name="item.content">
-    <optional>
-
-      <ref name="AttrXMLLang"/>
-    </optional>
-    <ref name="AttrRDFAbout"/>
-    <interleave>
-      <ref name="title"/>
-      <ref name="link"/>
-      <optional>
-        <ref name="description"/>
-      </optional>
-
-      <optional>
-        <ref name="image"/>
-      </optional>
-      <zeroOrMore>
-        <ref name="Any"/>
-      </zeroOrMore>
-    </interleave>
-  </define>
-  <define name="Any">
-
-    <a:documentation>http://purl.org/net/rss1.1#Any</a:documentation>
-    <element>
-      <anyName>
-        <except>
-          <nsName/>
-        </except>
-      </anyName>
-      <ref name="Any.content"/>
-
-    </element>
-  </define>
-  <define name="Any.content">
-    <zeroOrMore>
-      <attribute>
-        <anyName>
-          <except>
-            <nsName/>
-            <nsName ns=""/>
-
-          </except>
-        </anyName>
-      </attribute>
-    </zeroOrMore>
-    <mixed>
-      <zeroOrMore>
-        <ref name="Any"/>
-      </zeroOrMore>
-    </mixed>
-
-  </define>
-  <define name="AttrXMLLang">
-    <attribute name="xml:lang">
-      <data type="language"/>
-    </attribute>
-  </define>
-  <define name="AttrXMLBase">
-    <attribute name="xml:base">
-      <data type="anyURI"/>
-
-    </attribute>
-  </define>
-  <define name="AttrRDFAbout">
-    <attribute name="rdf:about">
-      <data type="anyURI"/>
-    </attribute>
-  </define>
-  <define name="AttrRDFResource">
-    <attribute name="rdf:parseType">
-
-      <value>Resource</value>
-    </attribute>
-  </define>
-  <define name="AttrRDFCollection">
-    <attribute name="rdf:parseType">
-      <value>Collection</value>
-    </attribute>
-  </define>
-
-</grammar>
diff --git a/plugins/OStatus/extlib/hkit/hcard.profile.php b/plugins/OStatus/extlib/hkit/hcard.profile.php
new file mode 100644 (file)
index 0000000..6ec0dc8
--- /dev/null
@@ -0,0 +1,105 @@
+<?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
new file mode 100644 (file)
index 0000000..c3a54cf
--- /dev/null
@@ -0,0 +1,475 @@
+<?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
diff --git a/plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch b/plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch
deleted file mode 100644 (file)
index c53bd97..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/htdocs/lib/pear/XML/Feed/Parser/RSS2.php b/htdocs/lib/pear/XML/Feed/Parser/RSS2.php
-index c5d79d1..308a4ab 100644
---- a/htdocs/lib/pear/XML/Feed/Parser/RSS2.php
-+++ b/htdocs/lib/pear/XML/Feed/Parser/RSS2.php
-@@ -321,7 +321,8 @@ class XML_Feed_Parser_RSS2 extends XML_Feed_Parser_Type
-      */
-     function getLink($offset, $attribute = 'href', $params = array())
-     {
--        $links = $this->model->getElementsByTagName('link');
-+        $xPath = new DOMXPath($this->model);
-+        $links = $xPath->query('//link');
-         if ($links->length <= $offset) {
-             return false;
index 67179555820bfb035945be1591b0b6a0eeabfee6..bd29b5c0cf8fa41c1cd5a6efc279d74be43e2153 100644 (file)
@@ -1,6 +1,38 @@
+/*
+ * 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/>.
+ *
+ * @category  OStatus UI interaction
+ * @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/
+ * @note      Everything in here should eventually migrate over to /js/util.js's SN.
+ */
+
+SN.Init.OStatusCookie = function() {
+    if (SN.U.StatusNetInstance.Get() === null) {
+        SN.U.StatusNetInstance.Set({RemoteProfile: null});
+    }
+};
+
 SN.U.DialogBox = {
     Subscribe: function(a) {
-        var f = a.parent().find('#form_ostatus_connect');
+        var f = a.parent().find('.form_settings');
         if (f.length > 0) {
             f.show();
         }
@@ -8,7 +40,7 @@ SN.U.DialogBox = {
             $.ajax({
                 type: 'GET',
                 dataType: 'xml',
-                url: a[0].href+'&ajax=1',
+                url: a[0].href + ((a[0].href.match(/[\\?]/) === null)?'?':'&') + 'ajax=1',
                 beforeSend: function(formData) {
                     a.addClass('processing');
                 },
@@ -19,7 +51,7 @@ SN.U.DialogBox = {
                     if (typeof($('form', data)[0]) != 'undefined') {
                         a.after(document._importNode($('form', data)[0], true));
 
-                        var form = a.parent().find('#form_ostatus_connect');
+                        var form = a.parent().find('.form_settings');
 
                         form
                             .addClass('dialogbox')
@@ -39,7 +71,17 @@ SN.U.DialogBox = {
                             return false;
                         });
 
-                        form.find('#acct').focus();
+                        form.find('#profile').focus();
+
+                        if (form.attr('id') == 'form_ostatus_connect') {
+                            SN.Init.OStatusCookie();
+                            form.find('#profile').val(SN.U.StatusNetInstance.Get().RemoteProfile);
+
+                            form.find("[type=submit]").bind('click', function() {
+                                SN.U.StatusNetInstance.Set({RemoteProfile: form.find('#profile').val()});
+                                return true;
+                            });
+                        }
                     }
 
                     a.removeClass('processing');
@@ -50,11 +92,11 @@ SN.U.DialogBox = {
 };
 
 SN.Init.Subscribe = function() {
-    $('.entity_subscribe a').live('click', function() { SN.U.DialogBox.Subscribe($(this)); return false; });
+    $('.entity_subscribe .entity_remote_subscribe').live('click', function() { SN.U.DialogBox.Subscribe($(this)); return false; });
 };
 
 $(document).ready(function() {
-    if ($('.entity_subscribe .entity_remote_subscribe').length > 0) {
-        SN.Init.Subscribe();
-    }
+    SN.Init.Subscribe();
+
+    $('.form_remote_authorize').bind('submit', function() { $(this).addClass(SN.C.S.Processing); return true; });
 });
diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php
deleted file mode 100644 (file)
index f137946..0000000
+++ /dev/null
@@ -1,448 +0,0 @@
-<?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  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/
- */
-
-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';
-
-    /**
-     * 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($element, $rel, $type=null)
-    {
-        $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK);
-
-        foreach ($links as $link) {
-
-            $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;
-    }
-
-    /**
-     * 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($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($element, $tag, $namespace=self::ATOM)
-    {
-        $el = self::child($element, $tag, $namespace);
-
-        if (empty($el)) {
-            return null;
-        } else {
-            return $el->textContent;
-        }
-    }
-}
-
-/**
- * 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 CONTENT = 'content';
-    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;
-
-    /**
-     * 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)
-    {
-        $this->element = $element;
-
-        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->content = $this->_childContent($element, self::CONTENT);
-
-            $this->source  = $this->_getSource($element);
-
-            $this->link = ActivityUtils::getPermalink($element);
-
-            // XXX: grab PoCo stuff
-        }
-
-        // Some per-type attributes...
-        if ($this->type == self::PERSON || $this->type == self::GROUP) {
-            $this->displayName = $this->title;
-
-            // @fixme we may have multiple avatars with different resolutions specified
-            $this->avatar = ActivityUtils::getLink($element, 'avatar');
-        }
-    }
-
-    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');
-            }
-        }
-    }
-}
-
-/**
- * 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';
-}
-
-/**
- * An activity in the ActivityStrea.ms world
- *
- * An activity is kind of like a sentence: someone did something
- * to something else.
- *
- * 'someone' is the 'actor'; 'did something' is the verb;
- * 'something else' is the object.
- *
- * @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 Activity
-{
-    const SPEC   = 'http://activitystrea.ms/spec/1.0/';
-    const SCHEMA = 'http://activitystrea.ms/schema/1.0/';
-
-    const VERB       = 'verb';
-    const OBJECT     = 'object';
-    const ACTOR      = 'actor';
-    const SUBJECT    = 'subject';
-    const OBJECTTYPE = 'object-type';
-    const CONTEXT    = 'context';
-    const TARGET     = 'target';
-
-    const ATOM = 'http://www.w3.org/2005/Atom';
-
-    const AUTHOR    = 'author';
-    const PUBLISHED = 'published';
-    const UPDATED   = 'updated';
-
-    public $actor;   // an ActivityObject
-    public $verb;    // a string (the URL)
-    public $object;  // an ActivityObject
-    public $target;  // an ActivityObject
-    public $context; // an ActivityObject
-    public $time;    // Time of the activity
-    public $link;    // an ActivityObject
-    public $entry;   // the source entry
-    public $feed;    // the source feed
-
-    /**
-     * Turns a regular old Atom <entry> into a magical activity
-     *
-     * @param DOMElement $entry Atom entry to poke at
-     * @param DOMElement $feed  Atom feed, for context
-     */
-
-    function __construct($entry, $feed = null)
-    {
-        $this->entry = $entry;
-        $this->feed  = $feed;
-
-        $pubEl = $this->_child($entry, self::PUBLISHED, self::ATOM);
-
-        if (!empty($pubEl)) {
-            $this->time = strtotime($pubEl->textContent);
-        } else {
-            // XXX technically an error; being liberal. Good idea...?
-            $updateEl = $this->_child($entry, self::UPDATED, self::ATOM);
-            if (!empty($updateEl)) {
-                $this->time = strtotime($updateEl->textContent);
-            } else {
-                $this->time = null;
-            }
-        }
-
-        $this->link = ActivityUtils::getPermalink($entry);
-
-        $verbEl = $this->_child($entry, self::VERB);
-
-        if (!empty($verbEl)) {
-            $this->verb = trim($verbEl->textContent);
-        } else {
-            $this->verb = ActivityVerb::POST;
-            // XXX: do other implied stuff here
-        }
-
-        $objectEl = $this->_child($entry, self::OBJECT);
-
-        if (!empty($objectEl)) {
-            $this->object = new ActivityObject($objectEl);
-        } else {
-            $this->object = new ActivityObject($entry);
-        }
-
-        $actorEl = $this->_child($entry, self::ACTOR);
-
-        if (!empty($actorEl)) {
-
-            $this->actor = new ActivityObject($actorEl);
-
-        } else if (!empty($feed) &&
-                   $subjectEl = $this->_child($feed, self::SUBJECT)) {
-
-            $this->actor = new ActivityObject($subjectEl);
-
-        } else if ($authorEl = $this->_child($entry, self::AUTHOR, self::ATOM)) {
-
-            $this->actor = new ActivityObject($authorEl);
-
-        } else if (!empty($feed) && $authorEl = $this->_child($feed, self::AUTHOR,
-                                                              self::ATOM)) {
-
-            $this->actor = new ActivityObject($authorEl);
-        }
-
-        $contextEl = $this->_child($entry, self::CONTEXT);
-
-        if (!empty($contextEl)) {
-            $this->context = new ActivityObject($contextEl);
-        }
-
-        $targetEl = $this->_child($entry, self::TARGET);
-
-        if (!empty($targetEl)) {
-            $this->target = new ActivityObject($targetEl);
-        }
-    }
-
-    /**
-     * Returns an Atom <entry> based on this activity
-     *
-     * @return DOMElement Atom entry
-     */
-
-    function toAtomEntry()
-    {
-        return null;
-    }
-
-    private function _child($element, $tag, $namespace=self::SPEC)
-    {
-        return ActivityUtils::child($element, $tag, $namespace);
-    }
-}
\ No newline at end of file
diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php
new file mode 100644 (file)
index 0000000..f8449b3
--- /dev/null
@@ -0,0 +1,310 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * A sample module to show best practices for StatusNet plugins
+ *
+ * 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/>.
+ *
+ * @package   StatusNet
+ * @author    James Walker <james@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+/**
+ * This class implements LRDD-based service discovery based on the "Hammer Draft"
+ * (including webfinger)
+ *
+ * @see http://groups.google.com/group/webfinger/browse_thread/thread/9f3d93a479e91bbf
+ */
+class Discovery
+{
+
+    const LRDD_REL = 'lrdd';
+    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()
+    {
+        $this->registerMethod('Discovery_LRDD_Host_Meta');
+        $this->registerMethod('Discovery_LRDD_Link_Header');
+        $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.
+     */
+    public static function normalize($user_id)
+    {
+        if (substr($user_id, 0, 5) == 'http:' ||
+            substr($user_id, 0, 6) == 'https:' ||
+            substr($user_id, 0, 5) == 'acct:') {
+            return $user_id;
+        }
+
+        if (strpos($user_id, '@') !== FALSE) {
+            return 'acct:' . $user_id;
+        }
+
+        return 'http://' . $user_id;
+    }
+
+    public static function isWebfinger($user_id)
+    {
+        $uri = Discovery::normalize($user_id);
+        
+        return (substr($uri, 0, 5) == 'acct:');
+    }
+
+    /**
+     * This implements the actual lookup procedure
+     */
+    public function lookup($id)
+    {
+        // Normalize the incoming $id to make sure we have a uri
+        $uri = $this->normalize($id);
+
+        foreach ($this->methods as $class) {
+            $links = call_user_func(array($class, 'discover'), $uri);
+            if ($link = Discovery::getService($links, Discovery::LRDD_REL)) {
+                // Load the LRDD XRD
+                if (!empty($link['template'])) {
+                    $xrd_uri = Discovery::applyTemplate($link['template'], $uri);
+                } else {
+                    $xrd_uri = $link['href'];
+                }
+                
+                $xrd = $this->fetchXrd($xrd_uri);
+                if ($xrd) {
+                    return $xrd;
+                }
+            }
+        }
+
+        throw new Exception('Unable to find services for '. $id);
+    }
+
+    public static function getService($links, $service) {
+        if (!is_array($links)) {
+            return false;
+        }
+        
+        foreach ($links as $link) {
+            if ($link['rel'] == $service) {
+                return $link;
+            }
+        }
+    }
+    
+
+    public static function applyTemplate($template, $id)
+    {
+        $template = str_replace('{uri}', urlencode($id), $template);
+
+        return $template;
+    }
+
+    
+    public static function fetchXrd($url)
+    {
+        try {
+            $client = new HTTPClient();
+            $response = $client->get($url);
+        } catch (HTTP_Request2_Exception $e) {
+            return false;
+        }
+
+        if ($response->getStatus() != 200) {
+            return false;
+        }
+
+        return XRD::parse($response->getBody());
+    }
+}
+
+interface Discovery_LRDD
+{
+    public function discover($uri);
+}
+
+class Discovery_LRDD_Host_Meta implements Discovery_LRDD
+{
+    public function discover($uri)
+    {
+        if (!Discovery::isWebfinger($uri)) {
+            return false;
+        }
+
+        // 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);
+
+        if ($xrd) {
+            if ($xrd->host != $domain) {
+                return false;
+            }
+            
+            return $xrd->links;
+        }
+    }
+}
+
+class Discovery_LRDD_Link_Header implements Discovery_LRDD
+{
+    public function discover($uri)
+    {
+        try {
+            $client = new HTTPClient();
+            $response = $client->get($uri);
+        } catch (HTTP_Request2_Exception $e) {
+            return false;
+        }
+             
+        if ($response->getStatus() != 200) {
+            return false;
+        }
+
+        $link_header = $response->getHeader('Link');
+        if (!$link_header) {
+            //            return false;
+        }
+        
+        return 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);
+
+        return $links;
+    }
+}
+
+class Discovery_LRDD_Link_HTML implements Discovery_LRDD
+{
+    public function discover($uri)
+    {
+        try {
+            $client = new HTTPClient();
+            $response = $client->get($uri);
+        } catch (HTTP_Request2_Exception $e) {
+            return false;
+        }
+
+        if ($response->getStatus() != 200) {
+            return false;
+        }
+
+        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;
+    }
+}
index 39985fc90278012dc15f9cc77382f13ad96e554e..7afb71bdc16044ad8ec763e64f2b2d442df5a0ae 100644 (file)
@@ -48,6 +48,14 @@ class FeedSubNoFeedException extends FeedSubException
 {
 }
 
+class FeedSubBadXmlException extends FeedSubException
+{
+}
+
+class FeedSubNoHubException extends FeedSubException
+{
+}
+
 /**
  * Given a web page or feed URL, discover the final location of the feed
  * and return its current contents.
@@ -57,21 +65,25 @@ class FeedSubNoFeedException extends FeedSubException
  *   if ($feed->discoverFromURL($url)) {
  *     print $feed->uri;
  *     print $feed->type;
- *     processFeed($feed->body);
+ *     processFeed($feed->feed); // DOMDocument
  *   }
  */
 class FeedDiscovery
 {
     public $uri;
     public $type;
-    public $body;
+    public $feed;
 
+    /** Post-initialize query helper... */
+    public function getLink($rel, $type=null)
+    {
+        // @fixme check for non-Atom links in RSS2 feeds as well
+        return self::getAtomLink($rel, $type);
+    }
 
-    public function feedMunger()
+    public function getAtomLink($rel, $type=null)
     {
-        require_once 'XML/Feed/Parser.php';
-        $feed = new XML_Feed_Parser($this->body, false, false, true); // @fixme
-        return new FeedMunger($feed, $this->uri);
+        return ActivityUtils::getLink($this->feed->documentElement, $rel, $type);
     }
 
     /**
@@ -90,6 +102,7 @@ class FeedDiscovery
             $client = new HTTPClient();
             $response = $client->get($url);
         } catch (HTTP_Request2_Exception $e) {
+            common_log(LOG_ERR, __METHOD__ . " Failure for $url - " . $e->getMessage());
             throw new FeedSubBadURLException($e);
         }
 
@@ -107,7 +120,12 @@ class FeedDiscovery
         
         return $this->initFromResponse($response);
     }
-    
+
+    function discoverFromFeedURL($url)
+    {
+        return $this->discoverFromURL($url, false);
+    }
+
     function initFromResponse($response)
     {
         if (!$response->isOk()) {
@@ -122,16 +140,26 @@ class FeedDiscovery
 
         $type = $response->getHeader('Content-Type');
         if (preg_match('!^(text/xml|application/xml|application/(rss|atom)\+xml)!i', $type)) {
-            $this->uri = $sourceurl;
-            $this->type = $type;
-            $this->body = $body;
-            return true;
+            return $this->init($sourceurl, $type, $body);
         } else {
             common_log(LOG_WARNING, "Unrecognized feed type $type for $sourceurl");
             throw new FeedSubUnrecognizedTypeException($type);
         }
     }
 
+    function init($sourceurl, $type, $body)
+    {
+        $feed = new DOMDocument();
+        if ($feed->loadXML($body)) {
+            $this->uri = $sourceurl;
+            $this->type = $type;
+            $this->feed = $feed;
+            return $this->uri;
+        } else {
+            throw new FeedSubBadXmlException($url);
+        }
+    }
+
     /**
      * @param string $url source URL, used to resolve relative links
      * @param string $body HTML body text
diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php
deleted file mode 100644 (file)
index e8c46de..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @package FeedSubPlugin
- * @maintainer Brion Vibber <brion@status.net>
- */
-
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
-
-class FeedSubPreviewNotice extends Notice
-{
-    protected $fetched = true;
-
-    function __construct($profile)
-    {
-        $this->profile = $profile;
-        $this->profile_id = 0;
-    }
-    
-    function getProfile()
-    {
-        return $this->profile;
-    }
-    
-    function find()
-    {
-        return true;
-    }
-    
-    function fetch()
-    {
-        $got = $this->fetched;
-        $this->fetched = false;
-        return $got;
-    }
-}
-
-class FeedSubPreviewProfile extends Profile
-{
-    function getAvatar($width, $height=null)
-    {
-        return new FeedSubPreviewAvatar($width, $height, $this->avatar);
-    }
-}
-
-class FeedSubPreviewAvatar extends Avatar
-{
-    function __construct($width, $height, $remote)
-    {
-        $this->remoteImage = $remote;
-    }
-
-    function displayUrl() {
-        return $this->remoteImage;
-    }
-}
-
-class FeedMunger
-{
-    /**
-     * @param XML_Feed_Parser $feed
-     */
-    function __construct($feed, $url=null)
-    {
-        $this->feed = $feed;
-        $this->url = $url;
-    }
-    
-    function ostatusProfile()
-    {
-        $profile = new Ostatus_profile();
-        $profile->feeduri = $this->url;
-        $profile->homeuri = $this->feed->link;
-        $profile->huburi = $this->getHubLink();
-        $salmon = $this->getSalmonLink();
-        if ($salmon) {
-            $profile->salmonuri = $salmon;
-        }
-        return $profile;
-    }
-
-    function getAtomLink($item, $attribs=array())
-    {
-        // XML_Feed_Parser gets confused by multiple <link> elements.
-        $dom = $item->model;
-
-        // Note that RSS feeds would embed an <atom:link> so this should work for both.
-        /// http://code.google.com/p/pubsubhubbub/wiki/RssFeeds
-        // <link rel='hub' href='http://pubsubhubbub.appspot.com/'/>
-        $links = $dom->getElementsByTagNameNS('http://www.w3.org/2005/Atom', 'link');
-        for ($i = 0; $i < $links->length; $i++) {
-            $node = $links->item($i);
-            if ($node->hasAttributes()) {
-                $href = $node->attributes->getNamedItem('href');
-                if ($href) {
-                    $matches = 0;
-                    foreach ($attribs as $name => $val) {
-                        $attrib = $node->attributes->getNamedItem($name);
-                        if ($attrib && $attrib->value == $val) {
-                            $matches++;
-                        }
-                    }
-                    if ($matches == count($attribs)) {
-                        return $href->value;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    function getRssLink($item)
-    {
-        // XML_Feed_Parser gets confused by multiple <link> elements.
-        $dom = $item->model;
-
-        // Note that RSS feeds would embed an <atom:link> so this should work for both.
-        /// http://code.google.com/p/pubsubhubbub/wiki/RssFeeds
-        // <link rel='hub' href='http://pubsubhubbub.appspot.com/'/>
-        $links = $dom->getElementsByTagName('link');
-        for ($i = 0; $i < $links->length; $i++) {
-            $node = $links->item($i);
-            if (!$node->hasAttributes()) {
-                return $node->textContent;
-            }
-        }
-        return false;
-    }
-
-    function getAltLink($item)
-    {
-        // Check for an atom link...
-        $link = $this->getAtomLink($item, array('rel' => 'alternate', 'type' => 'text/html'));
-        if (!$link) {
-            $link = $this->getRssLink($item);
-        }
-        return $link;
-    }
-
-    function getHubLink()
-    {
-        return $this->getAtomLink($this->feed, array('rel' => 'hub'));
-    }
-
-    function getSalmonLink()
-    {
-        return $this->getAtomLink($this->feed, array('rel' => 'salmon'));
-    }
-
-    function getSelfLink()
-    {
-        return $this->getAtomLink($this->feed, array('rel' => 'self'));
-    }
-
-    /**
-     * Get an appropriate avatar image source URL, if available.
-     * @return mixed string or false
-     */
-    function getAvatar()
-    {
-        $logo = $this->feed->logo;
-        if ($logo) {
-            return $logo;
-        }
-        $icon = $this->feed->icon;
-        if ($icon) {
-            return $icon;
-        }
-        return common_path('plugins/OStatus/images/48px-Feed-icon.svg.png');
-    }
-
-    function profile($preview=false)
-    {
-        if ($preview) {
-            $profile = new FeedSubPreviewProfile();
-        } else {
-            $profile = new Profile();
-        }
-        
-        // @todo validate/normalize nick?
-        $profile->nickname   = $this->feed->title;
-        $profile->fullname   = $this->feed->title;
-        $profile->homepage   = $this->getAltLink($this->feed);
-        $profile->bio        = $this->feed->description;
-        $profile->profileurl = $this->getAltLink($this->feed);
-
-        if ($preview) {
-            $profile->avatar = $this->getAvatar();
-        }
-        
-        // @todo tags from categories
-        // @todo lat/lon/location?
-
-        return $profile;
-    }
-
-    function notice($index=1, $preview=false)
-    {
-        $entry = $this->feed->getEntryByOffset($index);
-        if (!$entry) {
-            return null;
-        }
-
-        if ($preview) {
-            $notice = new FeedSubPreviewNotice($this->profile(true));
-            $notice->id = -1;
-        } else {
-            $notice = new Notice();
-            $notice->profile_id = $this->profileIdForEntry($index);
-        }
-
-        $link = $this->getAltLink($entry);
-        if (empty($link)) {
-            if (preg_match('!^https?://!', $entry->id)) {
-                $link = $entry->id;
-                common_log(LOG_DEBUG, "No link on entry, using URL from id: $link");
-            }
-        }
-        $notice->uri = $link;
-        $notice->url = $link;
-        $notice->content = $this->noticeFromEntry($entry);
-        $notice->rendered = common_render_content($notice->content, $notice); // @fixme this is failing on group posts
-        $notice->created = common_sql_date($entry->updated); // @fixme
-        $notice->is_local = Notice::GATEWAY;
-        $notice->source = 'feed';
-
-        $location = $this->getLocation($entry);
-        if ($location) {
-            if ($location->location_id) {
-                $notice->location_ns = $location->location_ns;
-                $notice->location_id = $location->location_id;
-            }
-            $notice->lat = $location->lat;
-            $notice->lon = $location->lon;
-        }
-
-        return $notice;
-    }
-
-    function profileIdForEntry($index=1)
-    {
-        // hack hack hack
-        // should get profile for this entry's author...
-        $feeduri = $this->getSelfLink();
-        $remote = Ostatus_profile::staticGet('feeduri', $feeduri);
-        if ($remote) {
-            return $remote->profile_id;
-        } else {
-            throw new Exception("Can't find feed profile for $feeduri");
-        }
-    }
-
-    /**
-     * 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($entry)
-    {
-        $dom = $entry->model;
-        $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point');
-        
-        for ($i = 0; $i < $points->length; $i++) {
-            $point = $points->item(0)->textContent;
-            $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");
-                    return Location::fromLatLon($lat, $lon);
-                }
-            }
-            common_log(LOG_ERR, "Ignoring bogus georss:point value $point");
-        }
-
-        return false;
-    }
-
-    /**
-     * @param XML_Feed_Type $entry
-     * @return string notice text, within post size limit
-     */
-    function noticeFromEntry($entry)
-    {
-        $max = Notice::maxContent();
-        $ellipsis = "\xe2\x80\xa6"; // U+2026 HORIZONTAL ELLIPSIS
-        $title = $entry->title;
-        $link = $entry->link;
-
-        // @todo We can get <category> entries like this:
-        // $cats = $entry->getCategory('category', array(0, true));
-        // but it feels like an awful hack. If it's accessible cleanly,
-        // try adding #hashtags from the categories/tags on a post.
-
-        $title = $entry->title;
-        $link = $this->getAltLink($entry);
-        if ($link) {
-            // Blog post or such...
-            // @todo Should we force a language here?
-            $format = _m('New post: "%1$s" %2$s');
-            $out = sprintf($format, $title, $link);
-
-            // Trim link if needed...
-            if (mb_strlen($out) > $max) {
-                $link = common_shorten_url($link);
-                $out = sprintf($format, $title, $link);
-            }
-
-            // Trim title if needed...
-            if (mb_strlen($out) > $max) {
-                $used = mb_strlen($out) - mb_strlen($title);
-                $available = $max - $used - mb_strlen($ellipsis);
-                $title = mb_substr($title, 0, $available) . $ellipsis;
-                $out = sprintf($format, $title, $link);
-            }
-        } else {
-            // No link? Consider a bare status update.
-            if (mb_strlen($title) > $max) {
-                $available = $max - mb_strlen($ellipsis);
-                $out = mb_substr($title, 0, $available) . $ellipsis;
-            } else {
-                $out = $title;
-            }
-        }
-        
-        return $out;
-    }
-}
diff --git a/plugins/OStatus/lib/hubconfqueuehandler.php b/plugins/OStatus/lib/hubconfqueuehandler.php
new file mode 100644 (file)
index 0000000..c8e0b72
--- /dev/null
@@ -0,0 +1,54 @@
+<?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/>.
+ */
+
+/**
+ * Send a PuSH subscription verification from our internal hub.
+ * @package Hub
+ * @author Brion Vibber <brion@status.net>
+ */
+class HubConfQueueHandler extends QueueHandler
+{
+    function transport()
+    {
+        return 'hubconf';
+    }
+
+    function handle($data)
+    {
+        $sub = $data['sub'];
+        $mode = $data['mode'];
+        $token = $data['token'];
+
+        assert($sub instanceof HubSub);
+        assert($mode === 'subscribe' || $mode === 'unsubscribe');
+
+        common_log(LOG_INFO, __METHOD__ . ": $mode $sub->callback $sub->topic");
+        try {
+            $sub->verify($mode, $token);
+        } catch (Exception $e) {
+            common_log(LOG_ERR, "Failed PuSH $mode verify to $sub->callback for $sub->topic: " .
+                                $e->getMessage());
+            // @fixme schedule retry?
+            // @fixme just kill it?
+        }
+
+        return true;
+    }
+}
+
diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php
deleted file mode 100644 (file)
index 245a57f..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-<?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/>.
- */
-
-/**
- * Send a PuSH subscription verification from our internal hub.
- * Queue up final distribution for 
- * @package Hub
- * @author Brion Vibber <brion@status.net>
- */
-class HubDistribQueueHandler extends QueueHandler
-{
-    function transport()
-    {
-        return 'hubdistrib';
-    }
-
-    function handle($notice)
-    {
-        assert($notice instanceof Notice);
-
-        $this->pushUser($notice);
-        foreach ($notice->getGroups() as $group) {
-            $this->pushGroup($notice, $group->group_id);
-        }
-        return true;
-    }
-    
-    function pushUser($notice)
-    {
-        // See if there's any PuSH subscriptions, including OStatus clients.
-        // @fixme handle group subscriptions as well
-        // http://identi.ca/api/statuses/user_timeline/1.atom
-        $feed = common_local_url('ApiTimelineUser',
-                                 array('id' => $notice->profile_id,
-                                       'format' => 'atom'));
-        $this->pushFeed($feed, array($this, 'userFeedForNotice'), $notice);
-    }
-
-    function pushGroup($notice, $group_id)
-    {
-        $feed = common_local_url('ApiTimelineGroup',
-                                 array('id' => $group_id,
-                                       'format' => 'atom'));
-        $this->pushFeed($feed, array($this, 'groupFeedForNotice'), $group_id, $notice);
-    }
-
-    /**
-     * @param string $feed URI to the feed
-     * @param callable $callback function to generate Atom feed update if needed
-     *        any additional params are passed to the callback.
-     */
-    function pushFeed($feed, $callback)
-    {
-        $hub = common_config('ostatus', 'hub');
-        if ($hub) {
-            $this->pushFeedExternal($feed, $hub);
-        }
-
-        $sub = new HubSub();
-        $sub->topic = $feed;
-        if ($sub->find()) {
-            $args = array_slice(func_get_args(), 2);
-            $atom = call_user_func_array($callback, $args);
-            $this->pushFeedInternal($atom, $sub);
-        } else {
-            common_log(LOG_INFO, "No PuSH subscribers for $feed");
-        }
-        return true;
-    }
-
-    /**
-     * Ping external hub about this update.
-     * The hub will pull the feed and check for new items later.
-     * Not guaranteed safe in an environment with database replication.
-     *
-     * @param string $feed feed topic URI
-     * @param string $hub PuSH hub URI
-     * @fixme can consolidate pings for user & group posts
-     */
-    function pushFeedExternal($feed, $hub)
-    {
-        $client = new HTTPClient();
-        try {
-            $data = array('hub.mode' => 'publish',
-                          'hub.url' => $feed);
-            $response = $client->post($hub, array(), $data);
-            if ($response->getStatus() == 204) {
-                common_log(LOG_INFO, "PuSH ping to hub $hub for $feed ok");
-                return true;
-            } else {
-                common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed with HTTP " .
-                                    $response->getStatus() . ': ' .
-                                    $response->getBody());
-            }
-        } catch (Exception $e) {
-            common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed: " . $e->getMessage());
-            return false;
-        }
-    }
-
-    /**
-     * Queue up direct feed update pushes to subscribers on our internal hub.
-     * @param string $atom update feed, containing only new/changed items
-     * @param HubSub $sub open query of subscribers
-     */
-    function pushFeedInternal($atom, $sub)
-    {
-        common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $sub->topic");
-        $qm = QueueManager::get();
-        while ($sub->fetch()) {
-            common_log(LOG_INFO, "Prepping PuSH distribution to $sub->callback for $sub->topic");
-            $data = array('sub' => clone($sub),
-                          'atom' => $atom);
-            $qm->enqueue($data, 'hubout');
-        }
-    }
-
-    /**
-     * Build a single-item version of the sending user's Atom feed.
-     * @param Notice $notice
-     * @return string
-     */
-    function userFeedForNotice($notice)
-    {
-        // @fixme this feels VERY hacky...
-        // should probably be a cleaner way to do it
-
-        ob_start();
-        $api = new ApiTimelineUserAction();
-        $api->prepare(array('id' => $notice->profile_id,
-                            'format' => 'atom',
-                            'max_id' => $notice->id,
-                            'since_id' => $notice->id - 1));
-        $api->showTimeline();
-        $feed = ob_get_clean();
-        
-        // ...and override the content-type back to something normal... eww!
-        // hope there's no other headers that got set while we weren't looking.
-        header('Content-Type: text/html; charset=utf-8');
-
-        common_log(LOG_DEBUG, $feed);
-        return $feed;
-    }
-
-    function groupFeedForNotice($group_id, $notice)
-    {
-        // @fixme this feels VERY hacky...
-        // should probably be a cleaner way to do it
-
-        ob_start();
-        $api = new ApiTimelineGroupAction();
-        $args = array('id' => $group_id,
-                      'format' => 'atom',
-                      'max_id' => $notice->id,
-                      'since_id' => $notice->id - 1);
-        $api->prepare($args);
-        $api->handle($args);
-        $feed = ob_get_clean();
-        
-        // ...and override the content-type back to something normal... eww!
-        // hope there's no other headers that got set while we weren't looking.
-        header('Content-Type: text/html; charset=utf-8');
-
-        common_log(LOG_DEBUG, $feed);
-        return $feed;
-    }
-
-}
-
index 0791c7e5db16c4fd186ba5158bddc93546172770..3ad94646e6ddd98e51b0674b1b3536cd69a3e619 100644 (file)
@@ -33,6 +33,7 @@ class HubOutQueueHandler extends QueueHandler
     {
         $sub = $data['sub'];
         $atom = $data['atom'];
+        $retries = $data['retries'];
 
         assert($sub instanceof HubSub);
         assert(is_string($atom));
@@ -40,13 +41,20 @@ class HubOutQueueHandler extends QueueHandler
         try {
             $sub->push($atom);
         } catch (Exception $e) {
-            common_log(LOG_ERR, "Failed PuSH to $sub->callback for $sub->topic: " .
-                                $e->getMessage());
-            // @fixme Reschedule a later delivery?
-            return true;
+            $retries--;
+            $msg = "Failed PuSH to $sub->callback for $sub->topic: " .
+                   $e->getMessage();
+            if ($retries > 0) {
+                common_log(LOG_ERR, "$msg; scheduling for $retries more tries");
+
+                // @fixme when we have infrastructure to schedule a retry
+                // after a delay, use it.
+                $sub->distribute($atom, $retries);
+            } else {
+                common_log(LOG_ERR, "$msg; discarding");
+            }
         }
 
         return true;
     }
 }
-
diff --git a/plugins/OStatus/lib/hubverifyqueuehandler.php b/plugins/OStatus/lib/hubverifyqueuehandler.php
deleted file mode 100644 (file)
index 125d13a..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?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/>.
- */
-
-/**
- * Send a PuSH subscription verification from our internal hub.
- * @package Hub
- * @author Brion Vibber <brion@status.net>
- */
-class HubVerifyQueueHandler extends QueueHandler
-{
-    function transport()
-    {
-        return 'hubverify';
-    }
-
-    function handle($data)
-    {
-        $sub = $data['sub'];
-        $mode = $data['mode'];
-
-        assert($sub instanceof HubSub);
-        assert($mode === 'subscribe' || $mode === 'unsubscribe');
-
-        common_log(LOG_INFO, __METHOD__ . ": $mode $sub->callback $sub->topic");
-        try {
-            $sub->verify($mode);
-        } catch (Exception $e) {
-            common_log(LOG_ERR, "Failed PuSH $mode verify to $sub->callback for $sub->topic: " .
-                                $e->getMessage());
-            // @fixme schedule retry?
-            // @fixme just kill it?
-        }
-
-        return true;
-    }
-}
-
diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php
new file mode 100644 (file)
index 0000000..230d81b
--- /dev/null
@@ -0,0 +1,201 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * A sample module to show best practices for StatusNet plugins
+ *
+ * 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/>.
+ *
+ * @package   StatusNet
+ * @author    James Walker <james@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+class MagicEnvelope
+{
+    const ENCODING = 'base64url';
+
+    const NS = 'http://salmon-protocol.org/ns/magic-env';
+    
+    private function normalizeUser($user_id)
+    {
+        if (substr($user_id, 0, 5) == 'http:' ||
+            substr($user_id, 0, 6) == 'https:' ||
+            substr($user_id, 0, 5) == 'acct:') {
+            return $user_id;
+        }
+
+        if (strpos($user_id, '@') !== FALSE) {
+            return 'acct:' . $user_id;
+        }
+
+        return 'http://' . $user_id;
+    }
+
+    public function getKeyPair($signer_uri)
+    {
+        $disco = new Discovery();
+
+        try {
+            $xrd = $disco->lookup($signer_uri);
+        } catch (Exception $e) {
+            return false;
+        }
+        if ($xrd->links) {
+            if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) {
+                list($type, $keypair) = explode(';', $link['href']);
+                return $keypair;
+            }
+        }
+        throw new Exception('Unable to locate signer public key');
+    }
+
+
+    public function signMessage($text, $mimetype, $keypair)
+    {
+        $signature_alg = Magicsig::fromString($keypair);
+        $armored_text = base64_encode($text);
+
+        return array(
+            'data' => $armored_text,
+            'encoding' => MagicEnvelope::ENCODING,
+            'data_type' => $mimetype,
+            'sig' => $signature_alg->sign($armored_text),
+            'alg' => $signature_alg->getName()
+        );
+            
+            
+    }
+
+    public function toXML($env) {
+        $dom = new DOMDocument();
+
+        $envelope = $dom->createElementNS(MagicEnvelope::NS, 'me:env');
+        $envelope->setAttribute('xmlns:me', MagicEnvelope::NS);
+        $data = $dom->createElementNS(MagicEnvelope::NS, 'me:data', $env['data']);
+        $data->setAttribute('type', $env['data_type']);
+        $envelope->appendChild($data);
+        $enc = $dom->createElementNS(MagicEnvelope::NS, 'me:encoding', $env['encoding']);
+        $envelope->appendChild($enc);
+        $alg = $dom->createElementNS(MagicEnvelope::NS, 'me:alg', $env['alg']);
+        $envelope->appendChild($alg);
+        $sig = $dom->createElementNS(MagicEnvelope::NS, 'me:sig', $env['sig']);
+        $envelope->appendChild($sig);
+
+        $dom->appendChild($envelope);
+        
+        
+        return $dom->saveXML();
+    }
+
+    
+    public function unfold($env)
+    {
+        $dom = new DOMDocument();
+        $dom->loadXML(base64_decode($env['data']));
+
+        if ($dom->documentElement->tagName != 'entry') {
+            return false;
+        }
+
+        $prov = $dom->createElementNS(MagicEnvelope::NS, 'me:provenance');
+        $prov->setAttribute('xmlns:me', MagicEnvelope::NS);
+        $data = $dom->createElementNS(MagicEnvelope::NS, 'me:data', $env['data']);
+        $data->setAttribute('type', $env['data_type']);
+        $prov->appendChild($data);
+        $enc = $dom->createElementNS(MagicEnvelope::NS, 'me:encoding', $env['encoding']);
+        $prov->appendChild($enc);
+        $alg = $dom->createElementNS(MagicEnvelope::NS, 'me:alg', $env['alg']);
+        $prov->appendChild($alg);
+        $sig = $dom->createElementNS(MagicEnvelope::NS, 'me:sig', $env['sig']);
+        $prov->appendChild($sig);
+
+        $dom->documentElement->appendChild($prov);
+
+        return $dom->saveXML();
+    }
+    
+    public function getAuthor($text) {
+        $doc = new DOMDocument();
+        if (!$doc->loadXML($text)) {
+            return FALSE;
+        }
+
+        if ($doc->documentElement->tagName == 'entry') {
+            $authors = $doc->documentElement->getElementsByTagName('author');
+            foreach ($authors as $author) {
+                $uris = $author->getElementsByTagName('uri');
+                foreach ($uris as $uri) {
+                    return $this->normalizeUser($uri->nodeValue);
+                }
+            }
+        }
+    }
+    
+    public function checkAuthor($text, $signer_uri)
+    {
+        return ($this->getAuthor($text) == $signer_uri);
+    }
+    
+    public function verify($env)
+    {
+        if ($env['alg'] != 'RSA-SHA256') {
+            return false;
+        }
+
+        if ($env['encoding'] != MagicEnvelope::ENCODING) {
+            return false;
+        }
+
+        $text = base64_decode($env['data']);
+        $signer_uri = $this->getAuthor($text);
+
+        $verifier = Magicsig::fromString($this->getKeyPair($signer_uri));
+
+        return $verifier->verify($env['data'], $env['sig']);
+    }
+
+    public function parse($text)
+    {
+        $dom = DOMDocument::loadXML($text);
+        return $this->fromDom($dom);
+    }
+
+    public function fromDom($dom)
+    {
+        if ($dom->documentElement->tagName == 'entry') {
+            $env_element = $dom->getElementsByTagNameNS(MagicEnvelope::NS, 'provenance')->item(0);
+        } else if ($dom->documentElement->tagName == 'me:env') {
+            $env_element = $dom->documentElement;
+        } else {
+            return false;
+        }
+
+        $data_element = $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'data')->item(0);
+        
+        return array(
+            'data' => trim($data_element->nodeValue),
+            'data_type' => $data_element->getAttribute('type'),
+            'encoding' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'encoding')->item(0)->nodeValue,
+            'alg' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'alg')->item(0)->nodeValue,
+            'sig' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'sig')->item(0)->nodeValue,
+        );
+    }
+
+}
diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php
new file mode 100644 (file)
index 0000000..6ca31c4
--- /dev/null
@@ -0,0 +1,211 @@
+<?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/>.
+ */
+
+/**
+ * Prepare PuSH and Salmon distributions for an outgoing message.
+ *
+ * @package OStatusPlugin
+ * @author Brion Vibber <brion@status.net>
+ */
+class OStatusQueueHandler extends QueueHandler
+{
+    function transport()
+    {
+        return 'ostatus';
+    }
+
+    function handle($notice)
+    {
+        assert($notice instanceof Notice);
+
+        $this->notice = $notice;
+        $this->user = User::staticGet($notice->profile_id);
+
+        $this->pushUser();
+
+        foreach ($notice->getGroups() as $group) {
+            $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+            if ($oprofile) {
+                $this->pingReply($oprofile);
+            } else {
+                $this->pushGroup($group->id);
+            }
+        }
+
+        foreach ($notice->getReplies() as $profile_id) {
+            $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
+            if ($oprofile) {
+                $this->pingReply($oprofile);
+            }
+        }
+
+        return true;
+    }
+
+    function pushUser()
+    {
+        if ($this->user) {
+            // For local posts, ping the PuSH hub to update their feed.
+            // http://identi.ca/api/statuses/user_timeline/1.atom
+            $feed = common_local_url('ApiTimelineUser',
+                                     array('id' => $this->user->id,
+                                           'format' => 'atom'));
+            $this->pushFeed($feed, array($this, 'userFeedForNotice'));
+        }
+    }
+
+    function pushGroup($group_id)
+    {
+        // For a local group, ping the PuSH hub to update its feed.
+        // Updates may come from either a local or a remote user.
+        $feed = common_local_url('ApiTimelineGroup',
+                                 array('id' => $group_id,
+                                       'format' => 'atom'));
+        $this->pushFeed($feed, array($this, 'groupFeedForNotice'), $group_id);
+    }
+
+    function pingReply($oprofile)
+    {
+        if ($this->user) {
+            // For local posts, send a Salmon ping to the mentioned
+            // remote user or group.
+            // @fixme as an optimization we can skip this if the
+            // remote profile is subscribed to the author.
+            $oprofile->notifyDeferred($this->notice, $this->user);
+        }
+    }
+
+    /**
+     * @param string $feed URI to the feed
+     * @param callable $callback function to generate Atom feed update if needed
+     *        any additional params are passed to the callback.
+     */
+    function pushFeed($feed, $callback)
+    {
+        $hub = common_config('ostatus', 'hub');
+        if ($hub) {
+            $this->pushFeedExternal($feed, $hub);
+        }
+
+        $sub = new HubSub();
+        $sub->topic = $feed;
+        if ($sub->find()) {
+            $args = array_slice(func_get_args(), 2);
+            $atom = call_user_func_array($callback, $args);
+            $this->pushFeedInternal($atom, $sub);
+        } else {
+            common_log(LOG_INFO, "No PuSH subscribers for $feed");
+        }
+        return true;
+    }
+
+    /**
+     * Ping external hub about this update.
+     * The hub will pull the feed and check for new items later.
+     * Not guaranteed safe in an environment with database replication.
+     *
+     * @param string $feed feed topic URI
+     * @param string $hub PuSH hub URI
+     * @fixme can consolidate pings for user & group posts
+     */
+    function pushFeedExternal($feed, $hub)
+    {
+        $client = new HTTPClient();
+        try {
+            $data = array('hub.mode' => 'publish',
+                          'hub.url' => $feed);
+            $response = $client->post($hub, array(), $data);
+            if ($response->getStatus() == 204) {
+                common_log(LOG_INFO, "PuSH ping to hub $hub for $feed ok");
+                return true;
+            } else {
+                common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed with HTTP " .
+                                    $response->getStatus() . ': ' .
+                                    $response->getBody());
+            }
+        } catch (Exception $e) {
+            common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed: " . $e->getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * Queue up direct feed update pushes to subscribers on our internal hub.
+     * @param string $atom update feed, containing only new/changed items
+     * @param HubSub $sub open query of subscribers
+     */
+    function pushFeedInternal($atom, $sub)
+    {
+        common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $sub->topic");
+        while ($sub->fetch()) {
+            $sub->distribute($atom);
+        }
+    }
+
+    /**
+     * Build a single-item version of the sending user's Atom feed.
+     * @return string
+     */
+    function userFeedForNotice()
+    {
+        // @fixme this feels VERY hacky...
+        // should probably be a cleaner way to do it
+
+        ob_start();
+        $api = new ApiTimelineUserAction();
+        $api->prepare(array('id' => $this->notice->profile_id,
+                            'format' => 'atom',
+                            'max_id' => $this->notice->id,
+                            'since_id' => $this->notice->id - 1));
+        $api->showTimeline();
+        $feed = ob_get_clean();
+        
+        // ...and override the content-type back to something normal... eww!
+        // hope there's no other headers that got set while we weren't looking.
+        header('Content-Type: text/html; charset=utf-8');
+
+        common_log(LOG_DEBUG, $feed);
+        return $feed;
+    }
+
+    function groupFeedForNotice($group_id)
+    {
+        // @fixme this feels VERY hacky...
+        // should probably be a cleaner way to do it
+
+        ob_start();
+        $api = new ApiTimelineGroupAction();
+        $args = array('id' => $group_id,
+                      'format' => 'atom',
+                      'max_id' => $this->notice->id,
+                      'since_id' => $this->notice->id - 1);
+        $api->prepare($args);
+        $api->handle($args);
+        $feed = ob_get_clean();
+        
+        // ...and override the content-type back to something normal... eww!
+        // hope there's no other headers that got set while we weren't looking.
+        header('Content-Type: text/html; charset=utf-8');
+
+        common_log(LOG_DEBUG, $feed);
+        return $feed;
+    }
+
+}
+
diff --git a/plugins/OStatus/lib/pushinqueuehandler.php b/plugins/OStatus/lib/pushinqueuehandler.php
new file mode 100644 (file)
index 0000000..1fd29ae
--- /dev/null
@@ -0,0 +1,53 @@
+<?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/>.
+ */
+
+/**
+ * Process a feed distribution POST from a PuSH hub.
+ * @package FeedSub
+ * @author Brion Vibber <brion@status.net>
+ */
+
+class PushInQueueHandler extends QueueHandler
+{
+    function transport()
+    {
+        return 'pushin';
+    }
+
+    function handle($data)
+    {
+        assert(is_array($data));
+
+        $feedsub_id = $data['feedsub_id'];
+        $post = $data['post'];
+        $hmac = $data['hmac'];
+
+        $feedsub = FeedSub::staticGet('id', $feedsub_id);
+        if ($feedsub) {
+            try {
+                $feedsub->receive($post, $hmac);
+            } catch(Exception $e) {
+                common_log(LOG_ERR, "Exception during PuSH input processing for $feedsub->uri: " . $e->getMessage());
+            }
+        } else {
+            common_log(LOG_ERR, "Discarding POST to unknown feed subscription id $feedsub_id");
+        }
+        return true;
+    }
+}
index 8c77222a6284ea6c63a85135510e76b0834be0be..3d3341bc63fafeef24cc011f6e7296c8b09a5947 100644 (file)
  */
 class Salmon
 {
-    public function post($endpoint_uri, $xml)
+
+    const NS_REPLIES = "http://salmon-protocol.org/ns/salmon-replies";
+
+    const NS_MENTIONS = "http://salmon-protocol.org/ns/salmon-mention";
+    
+    /**
+     * Sign and post the given Atom entry as a Salmon message.
+     *
+     * @fixme pass through the actor for signing?
+     *
+     * @param string $endpoint_uri
+     * @param string $xml
+     * @return boolean success
+     */
+    public function post($endpoint_uri, $xml, $actor)
     {
         if (empty($endpoint_uri)) {
-            return FALSE;
+            return false;
+        }
+
+        try {
+            $xml = $this->createMagicEnv($xml, $actor);
+        } catch (Exception $e) {
+            common_log(LOG_ERR, "Salmon unable to sign: " . $e->getMessage());
+            return false;
         }
 
-        $headers = array('Content-type: application/atom+xml');
+        $headers = array('Content-Type: application/magic-envelope+xml');
 
         try {
             $client = new HTTPClient();
             $client->setBody($xml);
             $response = $client->post($endpoint_uri, $headers);
         } catch (HTTP_Request2_Exception $e) {
+            common_log(LOG_ERR, "Salmon post to $endpoint_uri failed: " . $e->getMessage());
             return false;
         }
         if ($response->getStatus() != 200) {
+            common_log(LOG_ERR, "Salmon at $endpoint_uri returned status " .
+                $response->getStatus() . ': ' . $response->getBody());
             return false;
         }
-
+        return true;
     }
 
-    public function createMagicEnv($text, $userid)
+    public function createMagicEnv($text, $actor)
     {
+        $magic_env = new MagicEnvelope();
 
+        $user = User::staticGet('id', $actor->id);
+        if ($user->id) {
+            // Use local key
+            $magickey = Magicsig::staticGet('user_id', $user->id);
+            if (!$magickey) {
+                // No keypair yet, let's generate one.
+                $magickey = new Magicsig();
+                $magickey->generate($user->id);
+            } 
+        } else {
+            throw new Exception("Salmon invalid actor for signing");
+        }
 
+        try {
+            $env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString());
+        } catch (Exception $e) {
+            return $text;
+        }
+        return $magic_env->toXML($env);
     }
 
 
-    public function verifyMagicEnv($env)
+    public function verifyMagicEnv($text)
     {
+        $magic_env = new MagicEnvelope();
+        
+        $env = $magic_env->parse($text);
 
-
+        return $magic_env->verify($env);
     }
 }
diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php
new file mode 100644 (file)
index 0000000..fa9dc3b
--- /dev/null
@@ -0,0 +1,196 @@
+<?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/>.
+ */
+
+/**
+ * @package OStatusPlugin
+ * @author James Walker <james@status.net>
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class SalmonAction extends Action
+{
+    var $xml      = null;
+    var $activity = null;
+
+    function prepare($args)
+    {
+        StatusNet::setApi(true); // Send smaller error pages
+
+        parent::prepare($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(_m('This method requires a POST.'));
+        }
+
+        if (empty($_SERVER['CONTENT_TYPE']) || $_SERVER['CONTENT_TYPE'] != 'application/magic-envelope+xml') {
+            $this->clientError(_m('Salmon requires application/magic-envelope+xml'));
+        }
+
+        $xml = file_get_contents('php://input');
+
+
+        // Check the signature
+        $salmon = new Salmon;
+        if (!$salmon->verifyMagicEnv($xml)) {
+            common_log(LOG_DEBUG, "Salmon signature verification failed.");
+            $this->clientError(_m('Salmon signature verification failed.'));
+        } else {
+            $magic_env = new MagicEnvelope();
+            $env = $magic_env->parse($xml);
+            $xml = $magic_env->unfold($env);
+        }
+        
+
+        $dom = DOMDocument::loadXML($xml);
+        if ($dom->documentElement->namespaceURI != Activity::ATOM ||
+            $dom->documentElement->localName != 'entry') {
+            common_log(LOG_DEBUG, "Got invalid Salmon post: $xml");
+            $this->clientError(_m('Salmon post must be an Atom entry.'));
+        }
+
+        $this->act = new Activity($dom->documentElement);
+        return true;
+    }
+
+    /**
+     * Check the posted activity type and break out to appropriate processing.
+     */
+
+    function handle($args)
+    {
+        StatusNet::setApi(true); // Send smaller error pages
+
+        common_log(LOG_DEBUG, "Got a " . $this->act->verb);
+        if (Event::handle('StartHandleSalmon', array($this->activity))) {
+            switch ($this->act->verb)
+            {
+            case ActivityVerb::POST:
+                $this->handlePost();
+                break;
+            case ActivityVerb::SHARE:
+                $this->handleShare();
+                break;
+            case ActivityVerb::FAVORITE:
+                $this->handleFavorite();
+                break;
+            case ActivityVerb::UNFAVORITE:
+                $this->handleUnfavorite();
+                break;
+            case ActivityVerb::FOLLOW:
+            case ActivityVerb::FRIEND:
+                $this->handleFollow();
+                break;
+            case ActivityVerb::UNFOLLOW:
+                $this->handleUnfollow();
+                break;
+            case ActivityVerb::JOIN:
+                $this->handleJoin();
+                break;
+            case ActivityVerb::LEAVE:
+                $this->handleLeave();
+                break;
+            case ActivityVerb::UPDATE_PROFILE:
+                $this->handleUpdateProfile();
+                break;
+            default:
+                throw new ClientException(_m("Unrecognized activity type."));
+            }
+            Event::handle('EndHandleSalmon', array($this->activity));
+        }
+    }
+
+    function handlePost()
+    {
+        throw new ClientException(_m("This target doesn't understand posts."));
+    }
+
+    function handleFollow()
+    {
+        throw new ClientException(_m("This target doesn't understand follows."));
+    }
+
+    function handleUnfollow()
+    {
+        throw new ClientException(_m("This target doesn't understand unfollows."));
+    }
+
+    function handleFavorite()
+    {
+        throw new ClientException(_m("This target doesn't understand favorites."));
+    }
+
+    function handleUnfavorite()
+    {
+        throw new ClientException(_m("This target doesn't understand unfavorites."));
+    }
+
+    function handleShare()
+    {
+        throw new ClientException(_m("This target doesn't understand share events."));
+    }
+
+    function handleJoin()
+    {
+        throw new ClientException(_m("This target doesn't understand joins."));
+    }
+
+    function handleLeave()
+    {
+        throw new ClientException(_m("This target doesn't understand leave events."));
+    }
+
+    /**
+     * Remote user sent us an update to their profile.
+     * If we already know them, accept the updates.
+     */
+    function handleUpdateProfile()
+    {
+        $oprofile = Ostatus_profile::getActorProfile($this->act);
+        if ($oprofile) {
+            common_log(LOG_INFO, "Got a profile-update ping from $oprofile->uri");
+            $oprofile->updateFromActivityObject($this->act->actor);
+        } else {
+            common_log(LOG_INFO, "Ignoring profile-update ping from unknown " . $this->act->actor->id);
+        }
+    }
+
+    /**
+     * @return Ostatus_profile
+     */
+    function ensureProfile()
+    {
+        $actor = $this->act->actor;
+        if (empty($actor->id)) {
+            common_log(LOG_ERR, "broken actor: " . var_export($actor, true));
+            common_log(LOG_ERR, "activity with no actor: " . var_export($this->act, true));
+            throw new Exception("Received a salmon slap from unidentified actor.");
+        }
+
+        return Ostatus_profile::ensureActivityObjectProfile($actor);
+    }
+
+    function saveNotice()
+    {
+        $oprofile = $this->ensureProfile();
+        return $oprofile->processPost($this->act, 'salmon');
+    }
+}
diff --git a/plugins/OStatus/lib/salmonqueuehandler.php b/plugins/OStatus/lib/salmonqueuehandler.php
new file mode 100644 (file)
index 0000000..7eeb5f8
--- /dev/null
@@ -0,0 +1,46 @@
+<?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/>.
+ */
+
+/**
+ * Send a Salmon notification in the background.
+ * @package OStatusPlugin
+ * @author Brion Vibber <brion@status.net>
+ */
+class SalmonQueueHandler extends QueueHandler
+{
+    function transport()
+    {
+        return 'salmon';
+    }
+
+    function handle($data)
+    {
+        assert(is_array($data));
+        assert(is_string($data['salmonuri']));
+        assert(is_string($data['entry']));
+
+        $actor = Profile::staticGet($data['actor']);
+        
+        $salmon = new Salmon();
+        $salmon->post($data['salmonuri'], $data['entry'], $actor);
+
+        // @fixme detect failure and attempt to resend
+        return true;
+    }
+}
diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php
deleted file mode 100644 (file)
index 417d549..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2010, StatusNet, Inc.
- *
- * A sample module to show best practices for StatusNet plugins
- *
- * 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/>.
- *
- * @package   StatusNet
- * @author    James Walker <james@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-
-define('WEBFINGER_SERVICE_REL_VALUE', 'lrdd');
-
-/**
- * Implement the webfinger protocol.
- */
-class Webfinger
-{
-    /**
-     * Perform a webfinger lookup given an account.
-     */ 
-    public function lookup($id)
-    {
-        $id = $this->normalize($id);
-        list($name, $domain) = explode('@', $id);
-
-        $links = $this->getServiceLinks($domain);
-        if (!$links) {
-            return false;
-        }
-        
-        $services = array();
-        foreach ($links as $link) {
-            if ($link['template']) {
-                return $this->getServiceDescription($link['template'], $id);
-            }
-            if ($link['href']) {
-                return $this->getServiceDescription($link['href'], $id);
-            }
-        }
-    }
-
-    /**
-     * Normalize an account ID
-     */
-    function normalize($id)
-    {
-        if (substr($id, 0, 7) == 'acct://') {
-            return substr($id, 7); 
-        } else if (substr($id, 0, 5) == 'acct:') {
-            return substr($id, 5);
-        }
-
-        return $id;
-    }
-
-    function getServiceLinks($domain)
-    {
-        $url = 'http://'. $domain .'/.well-known/host-meta';
-        $content = $this->fetchURL($url);
-        if (empty($content)) {
-            common_log(LOG_DEBUG, 'Error fetching host-meta');
-            return false;
-        }
-        $result = XRD::parse($content);
-
-        // Ensure that the host == domain (spec may include signing later)
-        if ($result->host != $domain) {
-            return false;
-        }
-        
-        $links = array();
-        foreach ($result->links as $link) {
-            if ($link['rel'] == WEBFINGER_SERVICE_REL_VALUE) {
-                $links[] = $link;
-            }
-
-        }
-        return $links;
-    }
-
-    function getServiceDescription($template, $id)
-    {
-        $url = $this->applyTemplate($template, 'acct:' . $id);
-
-        $content = $this->fetchURL($url);
-
-        return XRD::parse($content);
-    }
-
-    function fetchURL($url)
-    {
-        try {
-            $client = new HTTPClient();
-            $response = $client->get($url);
-        } catch (HTTP_Request2_Exception $e) {
-            return false;
-        }
-
-        if ($response->getStatus() != 200) {
-            return false;
-        }
-
-        return $response->getBody();
-    }
-
-    function applyTemplate($template, $id)
-    {
-        $template = str_replace('{uri}', urlencode($id), $template);
-
-        return $template;
-    }
-
-    function getHostMeta($domain, $template) {
-        $xrd = new XRD();
-        $xrd->host = $domain;
-        $xrd->links[] = array('rel' => 'lrdd',
-                              'template' => $template,
-                              'title' => array('Resource Descriptor'));
-
-        return $xrd->toXML();
-    }
-}
-
-
index 16d27f8eb7f66072d24f1f5b98ba8606d85c9563..85df26c54cb752605c9babb4bccd4ef65f690085 100644 (file)
@@ -53,17 +53,22 @@ class XRD
         $xrd = new XRD();
 
         $dom = new DOMDocument();
-        $dom->loadXML($xml);
+        if (!$dom->loadXML($xml)) {
+            throw new Exception("Invalid XML");
+        }
         $xrd_element = $dom->getElementsByTagName('XRD')->item(0);
 
         // Check for host-meta host
-        $host = $xrd_element->getElementsByTagName('Host')->item(0)->nodeValue;
+        $host = $xrd_element->getElementsByTagName('Host')->item(0);
         if ($host) {
-            $xrd->host = $host;
+            $xrd->host = $host->nodeValue;
         }
 
         // Loop through other elements
         foreach ($xrd_element->childNodes as $node) {
+            if (!($node instanceof DOMElement)) {
+                continue;
+            }
             switch ($node->tagName) {
             case 'Expires':
                 $xrd->expires = $node->nodeValue;
@@ -156,20 +161,20 @@ class XRD
     function saveLink($doc, $link)
     {
         $link_element = $doc->createElement('Link');
-        if ($link['rel']) {
+        if (!empty($link['rel'])) {
             $link_element->setAttribute('rel', $link['rel']);
         }
-        if ($link['type']) {
+        if (!empty($link['type'])) {
             $link_element->setAttribute('type', $link['type']);
         }
-        if ($link['href']) {
+        if (!empty($link['href'])) {
             $link_element->setAttribute('href', $link['href']);
         }
-        if ($link['template']) {
+        if (!empty($link['template'])) {
             $link_element->setAttribute('template', $link['template']);
         }
 
-        if (is_array($link['title'])) {
+        if (!empty($link['title']) && is_array($link['title'])) {
             foreach($link['title'] as $title) {
                 $title = $doc->createElement('Title', $title);
                 $link_element->appendChild($title);
index dedc018e3fbd7200d7e2a07f427a86fc6ce23b7f..7e33a0eed69382696e95a653ddfed922a6056f94 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:38-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -16,89 +16,297 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: tests/gettext-speedtest.php:57 FeedSubPlugin.php:76
-msgid "Feeds"
+#: actions/groupsalmon.php:51
+msgid "Can't accept remote posts for a remote group."
+msgstr ""
+
+#: actions/groupsalmon.php:123
+msgid "Can't read profile to set up group membership."
 msgstr ""
 
-#: FeedSubPlugin.php:77
-msgid "Feed subscription options"
+#: actions/groupsalmon.php:126 actions/groupsalmon.php:169
+msgid "Groups can't join groups."
 msgstr ""
 
-#: feedmunger.php:215
+#: actions/groupsalmon.php:153
 #, php-format
-msgid "New post: \"%1$s\" %2$s"
+msgid "Could not join remote user %1$s to group %2$s."
 msgstr ""
 
-#: actions/feedsubsettings.php:41
-msgid "Feed subscriptions"
+#: actions/groupsalmon.php:166
+msgid "Can't read profile to cancel group membership."
 msgstr ""
 
-#: actions/feedsubsettings.php:52
-msgid ""
-"You can subscribe to feeds from other sites; updates will appear in your "
-"personal timeline."
+#: actions/groupsalmon.php:182
+#, php-format
+msgid "Could not remove remote user %1$s from group %2$s."
+msgstr ""
+
+#: actions/ostatusinit.php:40
+msgid "You can use the local subscription!"
+msgstr ""
+
+#: actions/ostatusinit.php:61
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#: actions/ostatusinit.php:79 actions/ostatussub.php:439
+msgid "Subscribe to user"
+msgstr ""
+
+#: actions/ostatusinit.php:97
+#, php-format
+msgid "Subscribe to %s"
 msgstr ""
 
-#: actions/feedsubsettings.php:96
+#: actions/ostatusinit.php:102
+msgid "User nickname"
+msgstr ""
+
+#: actions/ostatusinit.php:103
+msgid "Nickname of the user you want to follow"
+msgstr ""
+
+#: actions/ostatusinit.php:106
+msgid "Profile Account"
+msgstr ""
+
+#: actions/ostatusinit.php:107
+msgid "Your account id (i.e. user@identi.ca)"
+msgstr ""
+
+#: actions/ostatusinit.php:110 actions/ostatussub.php:115
+#: OStatusPlugin.php:205
 msgid "Subscribe"
 msgstr ""
 
-#: actions/feedsubsettings.php:98
+#: actions/ostatusinit.php:128
+msgid "Must provide a remote profile."
+msgstr ""
+
+#: actions/ostatusinit.php:138
+msgid "Couldn't look up OStatus account profile."
+msgstr ""
+
+#: actions/ostatusinit.php:153
+msgid "Couldn't confirm remote profile address."
+msgstr ""
+
+#: actions/ostatusinit.php:171
+msgid "OStatus Connect"
+msgstr ""
+
+#: actions/ostatussub.php:68
+msgid "Address or profile URL"
+msgstr ""
+
+#: actions/ostatussub.php:70
+msgid "Enter the profile URL of a PubSubHubbub-enabled feed"
+msgstr ""
+
+#: actions/ostatussub.php:74
 msgid "Continue"
 msgstr ""
 
-#: actions/feedsubsettings.php:151
-msgid "Empty feed URL!"
+#: actions/ostatussub.php:112 OStatusPlugin.php:503
+msgid "Join"
+msgstr ""
+
+#: actions/ostatussub.php:113
+msgid "Join this group"
+msgstr ""
+
+#: actions/ostatussub.php:116
+msgid "Subscribe to this user"
+msgstr ""
+
+#: actions/ostatussub.php:137
+msgid "You are already subscribed to this user."
+msgstr ""
+
+#: actions/ostatussub.php:165
+msgid "You are already a member of this group."
 msgstr ""
 
-#: actions/feedsubsettings.php:161
+#: actions/ostatussub.php:286
+msgid "Empty remote profile URL!"
+msgstr ""
+
+#: actions/ostatussub.php:297
+msgid "Invalid address format."
+msgstr ""
+
+#: actions/ostatussub.php:302
 msgid "Invalid URL or could not reach server."
 msgstr ""
 
-#: actions/feedsubsettings.php:164
+#: actions/ostatussub.php:304
 msgid "Cannot read feed; server returned error."
 msgstr ""
 
-#: actions/feedsubsettings.php:167
+#: actions/ostatussub.php:306
 msgid "Cannot read feed; server returned an empty page."
 msgstr ""
 
-#: actions/feedsubsettings.php:170
+#: actions/ostatussub.php:308
 msgid "Bad HTML, could not find feed link."
 msgstr ""
 
-#: actions/feedsubsettings.php:173
+#: actions/ostatussub.php:310
 msgid "Could not find a feed linked from this URL."
 msgstr ""
 
-#: actions/feedsubsettings.php:176
+#: actions/ostatussub.php:312
 msgid "Not a recognized feed type."
 msgstr ""
 
-#: actions/feedsubsettings.php:180
-msgid "Bad feed URL."
+#: actions/ostatussub.php:315
+#, php-format
+msgid "Bad feed URL: %s %s"
+msgstr ""
+
+#. TRANS: OStatus remote group subscription dialog error.
+#: actions/ostatussub.php:336
+msgid "Already a member!"
 msgstr ""
 
-#: actions/feedsubsettings.php:188
-msgid "Feed is not PuSH-enabled; cannot subscribe."
+#. TRANS: OStatus remote group subscription dialog error.
+#: actions/ostatussub.php:346
+msgid "Remote group join failed!"
 msgstr ""
 
-#: actions/feedsubsettings.php:208
-msgid "Feed subscription failed! Bad response from hub."
+#. TRANS: OStatus remote group subscription dialog error.
+#: actions/ostatussub.php:350
+msgid "Remote group join aborted!"
 msgstr ""
 
-#: actions/feedsubsettings.php:218
+#. TRANS: OStatus remote subscription dialog error.
+#: actions/ostatussub.php:356
 msgid "Already subscribed!"
 msgstr ""
 
-#: actions/feedsubsettings.php:220
-msgid "Feed subscribed!"
+#. TRANS: OStatus remote subscription dialog error.
+#: actions/ostatussub.php:361
+msgid "Remote subscription failed!"
 msgstr ""
 
-#: actions/feedsubsettings.php:222
-msgid "Feed subscription failed!"
+#. TRANS: Page title for OStatus remote subscription form
+#: actions/ostatussub.php:459
+msgid "Authorize subscription"
+msgstr ""
+
+#: actions/ostatussub.php:470
+msgid ""
+"You can subscribe to users from other supported sites. Paste their address "
+"or profile URI below:"
+msgstr ""
+
+#: classes/Ostatus_profile.php:789
+#, php-format
+msgid "Tried to update avatar for unsaved remote profile %s"
 msgstr ""
 
-#: actions/feedsubsettings.php:231
-msgid "Previewing feed:"
+#: classes/Ostatus_profile.php:797
+#, php-format
+msgid "Unable to fetch avatar from %s"
+msgstr ""
+
+#: lib/salmonaction.php:41
+msgid "This method requires a POST."
+msgstr ""
+
+#: lib/salmonaction.php:45
+msgid "Salmon requires application/magic-envelope+xml"
+msgstr ""
+
+#: lib/salmonaction.php:55
+msgid "Salmon signature verification failed."
+msgstr ""
+
+#: lib/salmonaction.php:67
+msgid "Salmon post must be an Atom entry."
+msgstr ""
+
+#: lib/salmonaction.php:115
+msgid "Unrecognized activity type."
+msgstr ""
+
+#: lib/salmonaction.php:123
+msgid "This target doesn't understand posts."
+msgstr ""
+
+#: lib/salmonaction.php:128
+msgid "This target doesn't understand follows."
+msgstr ""
+
+#: lib/salmonaction.php:133
+msgid "This target doesn't understand unfollows."
+msgstr ""
+
+#: lib/salmonaction.php:138
+msgid "This target doesn't understand favorites."
+msgstr ""
+
+#: lib/salmonaction.php:143
+msgid "This target doesn't understand unfavorites."
+msgstr ""
+
+#: lib/salmonaction.php:148
+msgid "This target doesn't understand share events."
+msgstr ""
+
+#: lib/salmonaction.php:153
+msgid "This target doesn't understand joins."
+msgstr ""
+
+#: lib/salmonaction.php:158
+msgid "This target doesn't understand leave events."
+msgstr ""
+
+#: OStatusPlugin.php:319
+#, php-format
+msgid "Sent from %s via OStatus"
+msgstr ""
+
+#: OStatusPlugin.php:371
+msgid "Could not set up remote subscription."
+msgstr ""
+
+#: OStatusPlugin.php:487
+msgid "Could not set up remote group membership."
+msgstr ""
+
+#: OStatusPlugin.php:504
+#, php-format
+msgid "%s has joined group %s."
+msgstr ""
+
+#: OStatusPlugin.php:512
+msgid "Failed joining remote group."
+msgstr ""
+
+#: OStatusPlugin.php:553
+msgid "Leave"
+msgstr ""
+
+#: OStatusPlugin.php:554
+#, php-format
+msgid "%s has left group %s."
+msgstr ""
+
+#: OStatusPlugin.php:685
+msgid "Subscribe to remote user"
+msgstr ""
+
+#: OStatusPlugin.php:726
+msgid "Profile update"
+msgstr ""
+
+#: OStatusPlugin.php:727
+#, php-format
+msgid "%s has updated their profile page."
+msgstr ""
+
+#: tests/gettext-speedtest.php:57
+msgid "Feeds"
 msgstr ""
diff --git a/plugins/OStatus/scripts/updateostatus.php b/plugins/OStatus/scripts/updateostatus.php
new file mode 100644 (file)
index 0000000..d553a7d
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
+
+$shortoptions = 'i:n:a';
+$longoptions = array('id=', 'nickname=', 'all');
+
+$helptext = <<<END_OF_UPDATEOSTATUS_HELP
+updateostatus.php [options]
+update the OMB subscriptions of a user to use OStatus if possible
+
+  -i --id       ID of user to update
+  -n --nickname nickname of the user to update
+  -a --all      update all
+
+END_OF_UPDATEOSTATUS_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+try {
+    $user = null;
+
+    if (have_option('i', 'id')) {
+        $id = get_option_value('i', 'id');
+        $user = User::staticGet('id', $id);
+        if (empty($user)) {
+            throw new Exception("Can't find user with id '$id'.");
+        }
+        updateProfileURL($user);
+    } else if (have_option('n', 'nickname')) {
+        $nickname = get_option_value('n', 'nickname');
+        $user = User::staticGet('nickname', $nickname);
+        if (empty($user)) {
+            throw new Exception("Can't find user with nickname '$nickname'");
+        }
+        updateProfileURL($user);
+    } else if (have_option('a', 'all')) {
+        $user = new User();
+        if ($user->find()) {
+            while ($user->fetch()) {
+                updateOStatus($user);
+            }
+        }
+    } else {
+        show_help();
+        exit(1);
+    }
+} catch (Exception $e) {
+    print $e->getMessage()."\n";
+    exit(1);
+}
+
+function updateOStatus($user)
+{
+    if (!have_option('q', 'quiet')) {
+        echo "{$user->nickname}...";
+    }
+
+    $up = $user->getProfile();
+
+    $sp = $user->getSubscriptions();
+
+    $rps = array();
+
+    while ($sp->fetch()) {
+        $remote = Remote_profile::staticGet('id', $sp->id);
+
+        if (!empty($remote)) {
+            $rps[] = clone($sp);
+        }
+    }
+
+    if (!have_option('q', 'quiet')) {
+        echo count($rps) . "\n";
+    }
+
+    foreach ($rps as $rp) {
+        try {
+            if (!have_option('q', 'quiet')) {
+                echo "Checking {$rp->nickname}...";
+            }
+
+            $op = Ostatus_profile::ensureProfile($rp->profileurl);
+
+            if (empty($op)) {
+                echo "can't convert.\n";
+                continue;
+            } else {
+                if (!have_option('q', 'quiet')) {
+                    echo "Converting...";
+                }
+                Subscription::cancel($up, $rp);
+                Subscription::start($up, $op->localProfile());
+                if (!have_option('q', 'quiet')) {
+                    echo "done.\n";
+                }
+            }
+
+        } catch (Exception $e) {
+            if (!have_option('q', 'quiet')) {
+                echo "fail.\n";
+            }
+            continue;
+            common_log(LOG_WARNING, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname .
+                       ") to OStatus: " . $e->getMessage());
+            continue;
+        }
+    }
+}
diff --git a/plugins/OStatus/tests/ActivityParseTests.php b/plugins/OStatus/tests/ActivityParseTests.php
deleted file mode 100644 (file)
index fa8bcdd..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-    print "This script must be run from the command line\n";
-    exit();
-}
-
-// XXX: we should probably have some common source for this stuff
-
-define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
-define('STATUSNET', true);
-
-require_once INSTALLDIR . '/lib/common.php';
-require_once INSTALLDIR . '/plugins/OStatus/lib/activity.php';
-
-class ActivityParseTests extends PHPUnit_Framework_TestCase
-{
-    public function testExample1()
-    {
-        global $_example1;
-        $dom = DOMDocument::loadXML($_example1);
-        $act = new Activity($dom->documentElement);
-
-        $this->assertFalse(empty($act));
-        $this->assertEquals($act->time, 1243860840);
-        $this->assertEquals($act->verb, ActivityVerb::POST);
-    }
-
-    public function testExample3()
-    {
-        global $_example3;
-        $dom = DOMDocument::loadXML($_example3);
-
-        $feed = $dom->documentElement;
-
-        $entries = $feed->getElementsByTagName('entry');
-
-        $entry = $entries->item(0);
-
-        $act = new Activity($entry, $feed);
-
-        $this->assertFalse(empty($act));
-        $this->assertEquals($act->time, 1071340202);
-        $this->assertEquals($act->link, 'http://example.org/2003/12/13/atom03.html');
-
-        $this->assertEquals($act->verb, ActivityVerb::POST);
-
-        $this->assertFalse(empty($act->actor));
-        $this->assertEquals($act->actor->type, ActivityObject::PERSON);
-        $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->assertTrue(empty($act->context));
-        $this->assertTrue(empty($act->target));
-
-        $this->assertEquals($act->entry, $entry);
-        $this->assertEquals($act->feed, $feed);
-    }
-}
-
-$_example1 = <<<EXAMPLE1
-<?xml version='1.0' encoding='UTF-8'?>
-<entry xmlns='http://www.w3.org/2005/Atom' xmlns:activity='http://activitystrea.ms/spec/1.0/'>
-  <id>tag:versioncentral.example.org,2009:/commit/1643245</id>
-  <published>2009-06-01T12:54:00Z</published>
-  <title>Geraldine committed a change to yate</title>
-  <content type="xhtml">Geraldine just committed a change to yate on VersionCentral</content>
-  <link rel="alternate" type="text/html"
-        href="http://versioncentral.example.org/geraldine/yate/commit/1643245" />
-  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
-  <activity:verb>http://versioncentral.example.org/activity/commit</activity:verb>
-  <activity:object>
-    <activity:object-type>http://versioncentral.example.org/activity/changeset</activity:object-type>
-    <id>tag:versioncentral.example.org,2009:/change/1643245</id>
-    <title>Punctuation Changeset</title>
-    <summary>Fixing punctuation because it makes it more readable.</summary>
-    <link rel="alternate" type="text/html" href="..." />
-  </activity:object>
-</entry>
-EXAMPLE1;
-
-$_example2 = <<<EXAMPLE2
-<?xml version='1.0' encoding='UTF-8'?>
-<entry xmlns='http://www.w3.org/2005/Atom' xmlns:activity='http://activitystrea.ms/spec/1.0/'>
-  <id>tag:photopanic.example.com,2008:activity01</id>
-  <title>Geraldine posted a Photo on PhotoPanic</title>
-  <published>2008-11-02T15:29:00Z</published>
-  <link rel="alternate" type="text/html" href="/geraldine/activities/1" />
-  <activity:verb>
-  http://activitystrea.ms/schema/1.0/post
-  </activity:verb>
-  <activity:object>
-    <id>tag:photopanic.example.com,2008:photo01</id>
-    <title>My Cat</title>
-    <published>2008-11-02T15:29:00Z</published>
-    <link rel="alternate" type="text/html" href="/geraldine/photos/1" />
-    <activity:object-type>
-      tag:atomactivity.example.com,2008:photo
-    </activity:object-type>
-    <source>
-      <title>Geraldine's Photos</title>
-      <link rel="self" type="application/atom+xml" href="/geraldine/photofeed.xml" />
-      <link rel="alternate" type="text/html" href="/geraldine/" />
-    </source>
-  </activity:object>
-  <content type="html">
-     &lt;p&gt;Geraldine posted a Photo on PhotoPanic&lt;/p&gt;
-     &lt;img src="/geraldine/photo1.jpg"&gt;
-  </content>
-</entry>
-EXAMPLE2;
-
-$_example3 = <<<EXAMPLE3
-<?xml version="1.0" encoding="utf-8"?>
-
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-       <title>Example Feed</title>
-       <subtitle>A subtitle.</subtitle>
-       <link href="http://example.org/feed/" rel="self" />
-       <link href="http://example.org/" />
-       <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
-       <updated>2003-12-13T18:30:02Z</updated>
-       <author>
-               <name>John Doe</name>
-               <email>johndoe@example.com</email>
-       </author>
-
-       <entry>
-               <title>Atom-Powered Robots Run Amok</title>
-               <link href="http://example.org/2003/12/13/atom03" />
-               <link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>
-               <link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
-               <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
-               <updated>2003-12-13T18:30:02Z</updated>
-               <summary>Some text.</summary>
-       </entry>
-
-</feed>
-EXAMPLE3;
diff --git a/plugins/OStatus/tests/FeedMungerTest.php b/plugins/OStatus/tests/FeedMungerTest.php
deleted file mode 100644 (file)
index 0ce24c9..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-    print "This script must be run from the command line\n";
-    exit();
-}
-
-define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
-define('STATUSNET', true);
-define('LACONICA', true);
-
-require_once INSTALLDIR . '/lib/common.php';
-require_once INSTALLDIR . '/plugins/FeedSub/feedsub.php';
-
-require_once 'XML/Feed/Parser.php';
-
-class FeedMungerTest extends PHPUnit_Framework_TestCase
-{
-    /**
-     * @dataProvider profileProvider
-     *
-     */
-    public function testProfiles($xml, $expected)
-    {
-        $feed = new XML_Feed_Parser($xml, false, false, true);
-        
-        $munger = new FeedMunger($feed);
-        $profile = $munger->profile();
-
-        foreach ($expected as $field => $val) {
-            $this->assertEquals($expected[$field], $profile->$field, "profile->$field");
-        }
-    }
-
-    static public function profileProvider()
-    {
-        return array(
-                     array(self::samplefeed(),
-                           array('nickname' => 'leŭksman', // @todo does this need to be asciified?
-                                 'fullname' => 'leŭksman',
-                                 'bio' => 'reticula, electronica, & oddities',
-                                 'homepage' => 'http://leuksman.com/log')));
-    }
-
-    /**
-     * @dataProvider noticeProvider
-     *
-     */
-    public function testNotices($xml, $entryIndex, $expected)
-    {
-        $feed = new XML_Feed_Parser($xml, false, false, true);
-        $entry = $feed->getEntryByOffset($entryIndex);
-
-        $munger = new FeedMunger($feed);
-        $notice = $munger->noticeFromEntry($entry);
-
-        $this->assertTrue(mb_strlen($notice) <= Notice::maxContent());
-        $this->assertEquals($expected, $notice);
-    }
-
-    static public function noticeProvider()
-    {
-        return array(
-                     array('<rss version="2.0"><channel><item><title>A fairly short title</title><link>http://example.com/short/link</link></item></channel></rss>', 0,
-                           'New post: "A fairly short title" http://example.com/short/link'),
-                     // Requires URL shortening ...
-                     array('<rss version="2.0"><channel><item><title>A fairly short title</title><link>http://example.com/but/a/very/long/link/indeed/this/is/far/too/long/for/mere/humans/to/comprehend/oh/my/gosh</link></item></channel></rss>', 0,
-                           'New post: "A fairly short title" http://ur1.ca/g2o1'),
-                     array('<rss version="2.0"><channel><item><title>A fairly long title in this case, which will have to get cut down at some point alongside its very long link. Really who even makes titles this long? It\'s just ridiculous imo...</title><link>http://example.com/but/a/very/long/link/indeed/this/is/far/too/long/for/mere/humans/to/comprehend/oh/my/gosh</link></item></channel></rss>', 0,
-                           'New post: "A fairly long title in this case, which will have to get cut down at some point alongside its very long li…" http://ur1.ca/g2o1'),
-                     // Some real sample feeds
-                     array(self::samplefeed(), 0,
-                           'New post: "Compiling PHP on Snow Leopard" http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/'),
-                     array(self::samplefeedBlogspot(), 0,
-                           'New post: "I love posting" http://briontest.blogspot.com/2009/11/i-love-posting.html'),
-                     array(self::samplefeedBlogspot(), 1,
-                           'New post: "Hey dude" http://briontest.blogspot.com/2009/11/hey-dude.html'),
-        );
-    }
-
-    static protected function samplefeed()
-    {
-        $xml = '<' . '?xml version="1.0" encoding="UTF-8"?' . ">\n";
-        $samplefeed = $xml . <<<END
-<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/"
-       >
-
-<channel>
-       <title>leŭksman</title>
-       <atom:link href="http://leuksman.com/log/feed/" rel="self" type="application/rss+xml" />
-       <link>http://leuksman.com/log</link>
-       <description>reticula, electronica, &#38; oddities</description>
-
-       <lastBuildDate>Thu, 12 Nov 2009 17:44:42 +0000</lastBuildDate>
-       <generator>http://wordpress.org/?v=2.8.6</generator>
-       <language>en</language>
-       <sy:updatePeriod>hourly</sy:updatePeriod>
-       <sy:updateFrequency>1</sy:updateFrequency>
-                       <item>
-
-               <title>Compiling PHP on Snow Leopard</title>
-               <link>http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/</link>
-               <comments>http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/#comments</comments>
-               <pubDate>Thu, 12 Nov 2009 17:44:42 +0000</pubDate>
-               <dc:creator>brion</dc:creator>
-                               <category><![CDATA[apple]]></category>
-
-               <category><![CDATA[devel]]></category>
-
-               <guid isPermaLink="false">http://leuksman.com/log/?p=649</guid>
-               <description><![CDATA[If you&#8217;ve been having trouble compiling your own PHP installations on Mac OS X 10.6, here&#8217;s the secret to making it not suck! After running the configure script, edit the generated Makefile and make these fixes:
-
-Find the EXTRA_LIBS definition and add -lresolv to the end
-Find the EXE_EXT definition and remove .dSYM
-
-Standard make and make install [...]]]></description>
-                       <content:encoded><![CDATA[<p>If you&#8217;ve been having trouble compiling your own PHP installations on Mac OS X 10.6, here&#8217;s the secret to making it not suck! After running the configure script, edit the generated Makefile and make these fixes:</p>
-<ul>
-<li>Find the <strong>EXTRA_LIBS</strong> definition and add <strong>-lresolv</strong> to the end</li>
-<li>Find the <strong>EXE_EXT</strong> definition and remove <strong>.dSYM</strong></li>
-</ul>
-<p>Standard make and make install should work from here&#8230;</p>
-<p>For reference, here&#8217;s the whole configure line I currently use; MySQL is installed from the downloadable installer; other deps from MacPorts:</p>
-<p>&#8216;./configure&#8217; &#8216;&#8211;prefix=/opt/php52&#8242; &#8216;&#8211;with-mysql=/usr/local/mysql&#8217; &#8216;&#8211;with-zlib&#8217; &#8216;&#8211;with-bz2&#8242; &#8216;&#8211;enable-mbstring&#8217; &#8216;&#8211;enable-exif&#8217; &#8216;&#8211;enable-fastcgi&#8217; &#8216;&#8211;with-xmlrpc&#8217; &#8216;&#8211;with-xsl&#8217; &#8216;&#8211;with-readline=/opt/local&#8217; &#8211;without-iconv &#8211;with-gd &#8211;with-png-dir=/opt/local &#8211;with-jpeg-dir=/opt/local &#8211;with-curl &#8211;with-gettext=/opt/local &#8211;with-mysqli=/usr/local/mysql/bin/mysql_config &#8211;with-tidy=/opt/local &#8211;enable-pcntl &#8211;with-openssl</p>
-]]></content:encoded>
-                       <wfw:commentRss>http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/feed/</wfw:commentRss>
-               <slash:comments>0</slash:comments>
-               </item>
-</channel>
-</rss>
-END;
-        return $samplefeed;
-    }
-    
-    static protected function samplefeedBlogspot()
-    {
-        return <<<END
-<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-7780083508531697167</id><updated>2009-11-19T12:56:11.233-08:00</updated><title type='text'>Brion's Cool Test Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://briontest.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7780083508531697167/posts/default'/><link rel='alternate' type='text/html' href='http://briontest.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>brion</name><uri>http://www.blogger.com/profile/12932299467049762017</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7780083508531697167.post-8456671879000290677</id><published>2009-11-19T12:55:00.000-08:00</published><updated>2009-11-19T12:56:11.241-08:00</updated><title type='text'>I love posting</title><content type='html'>It's pretty awesome, if you like that sort of thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7780083508531697167-8456671879000290677?l=briontest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://briontest.blogspot.com/feeds/8456671879000290677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://briontest.blogspot.com/2009/11/i-love-posting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7780083508531697167/posts/default/8456671879000290677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7780083508531697167/posts/default/8456671879000290677'/><link rel='alternate' type='text/html' href='http://briontest.blogspot.com/2009/11/i-love-posting.html' title='I love posting'/><author><name>brion</name><uri>http://www.blogger.com/profile/12932299467049762017</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05912464053145602436'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7780083508531697167.post-8202296917897346633</id><published>2009-11-18T13:52:00.001-08:00</published><updated>2009-11-18T13:52:48.444-08:00</updated><title type='text'>Hey dude</title><content type='html'>testingggggggggg&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7780083508531697167-8202296917897346633?l=briontest.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://briontest.blogspot.com/feeds/8202296917897346633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://briontest.blogspot.com/2009/11/hey-dude.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7780083508531697167/posts/default/8202296917897346633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7780083508531697167/posts/default/8202296917897346633'/><link rel='alternate' type='text/html' href='http://briontest.blogspot.com/2009/11/hey-dude.html' title='Hey dude'/><author><name>brion</name><uri>http://www.blogger.com/profile/12932299467049762017</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05912464053145602436'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>
-END;
-    }
-}
index 9bc90a7315b0903ef9b51e855eb162b7d82421a0..13e30ef5df01df55a4d96c44a10ab1069ca9da96 100644 (file)
@@ -7,24 +7,42 @@
  * @link      http://status.net/
  */
 
-#form_ostatus_connect.dialogbox {
+#form_ostatus_connect.dialogbox,
+#form_ostatus_sub.dialogbox {
 width:70%;
 background-image:none;
 }
-#form_ostatus_connect.dialogbox .form_data label {
+#form_ostatus_sub.dialogbox {
+width:65%;
+}
+#form_ostatus_connect.dialogbox .form_data label,
+#form_ostatus_sub.dialogbox .form_data label {
 width:34%;
 }
-#form_ostatus_connect.dialogbox .form_data input {
+#form_ostatus_connect.dialogbox .form_data input,
+#form_ostatus_sub.dialogbox .form_data input {
 width:57%;
 }
-#form_ostatus_connect.dialogbox .form_data .form_guide {
+#form_ostatus_connect.dialogbox .form_data .form_guide,
+#form_ostatus_sub.dialogbox .form_data .form_guide {
 margin-left:36%;
 }
 
-#form_ostatus_connect.dialogbox #ostatus_nickname {
+#form_ostatus_connect.dialogbox #ostatus_nickname,
+#form_ostatus_sub.dialogbox #ostatus_nickname {
 display:none;
 }
 
-#form_ostatus_connect.dialogbox .submit_dialogbox  {
+#form_ostatus_connect.dialogbox .submit_dialogbox,
+#form_ostatus_sub.dialogbox .submit_dialogbox {
 min-width:96px;
 }
+
+#entity_remote_subscribe {
+padding:0;
+float:right;
+}
+
+#all #entity_remote_subscribe {
+margin-top:-52px;
+}
index 248afe3fa88e92e32c2782c5c907b45055345530..6b35ec3e142f2f1503f7df6476e94691fb1d1d2f 100644 (file)
@@ -235,9 +235,14 @@ class OpenIDPlugin extends Plugin
         switch ($name)
         {
          case 'register':
-            $instr = '(Have an [OpenID](http://openid.net/)? ' .
-              'Try our [OpenID registration]'.
-              '(%%action.openidlogin%%)!)';
+            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':
             $instr = '(Have an [OpenID](http://openid.net/)? ' .
index c741e36741d97134feb09b992df984fce9459bae..f2dc610a55d0db2bda34add93b5f6bce5e6251dd 100644 (file)
@@ -3,7 +3,7 @@
 If you already have an account on %%site.name%%, you can [login](%%action.login%%) with your username and password as usual.
 To use OpenID in the future, you can [add an OpenID to your account](%%action.openidsettings%%) after you have logged in normally.
 
-There are many [Public OpenID providers](http://wiki.openid.net/Public_OpenID_providers), and you may already have an OpenID-enabled account on another service.
+There are many [Public OpenID providers](http://wiki.openid.net/OpenID-Providers), and you may already have an OpenID-enabled account on another service.
 
 * On wikis: If you have an account on an OpenID-enabled wiki, like [Wikitravel](http://wikitravel.org/), [wikiHow](http://www.wikihow.com/), [Vinismo](http://vinismo.com/), [AboutUs](http://aboutus.org/) or [Keiki](http://kei.ki/), you can log in to %%site.name%% by entering the **full URL** of your user page on that other wiki in the box above. For example, *http://kei.ki/en/User:Evan*.
 * [Yahoo!](http://openid.yahoo.com/) : If you have an account with Yahoo!, you can log in to this site by entering your Yahoo!-provided OpenID in the box above. Yahoo! OpenID URLs have the form *https://me.yahoo.com/yourusername*.
index 34738bc7504d8a040151dd81a6b2e11f2fadf04a..7ed8798355dea8d103202e782c839b31bd9fc5e8 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:38-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -16,73 +16,152 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: openidlogin.php:30 finishopenidlogin.php:34
+#: finishaddopenid.php:67
+msgid "Not logged in."
+msgstr ""
+
+#: finishaddopenid.php:88 finishopenidlogin.php:149
+msgid "OpenID authentication cancelled."
+msgstr ""
+
+#: finishaddopenid.php:92 finishopenidlogin.php:153
+#, php-format
+msgid "OpenID authentication failed: %s"
+msgstr ""
+
+#: finishaddopenid.php:112
+msgid "You already have this OpenID!"
+msgstr ""
+
+#: finishaddopenid.php:114
+msgid "Someone else already has this OpenID."
+msgstr ""
+
+#: finishaddopenid.php:126
+msgid "Error connecting user."
+msgstr ""
+
+#: finishaddopenid.php:131
+msgid "Error updating profile"
+msgstr ""
+
+#: finishaddopenid.php:170 openidlogin.php:95
+msgid "OpenID Login"
+msgstr ""
+
+#: finishopenidlogin.php:34 openidlogin.php:30
 msgid "Already logged in."
 msgstr ""
 
-#: openidlogin.php:37 openidsettings.php:194 finishopenidlogin.php:38
+#: finishopenidlogin.php:38 openidlogin.php:37 openidsettings.php:194
 msgid "There was a problem with your session token. Try again, please."
 msgstr ""
 
-#: openidlogin.php:66
+#: finishopenidlogin.php:43
+msgid "You can't register if you don't agree to the license."
+msgstr ""
+
+#: finishopenidlogin.php:52 openidsettings.php:208
+msgid "Something weird happened."
+msgstr ""
+
+#: finishopenidlogin.php:66
 #, php-format
 msgid ""
-"For security reasons, please re-login with your [OpenID](%%doc.openid%%) "
-"before changing your settings."
+"This is the first time you've logged into %s so we must connect your OpenID "
+"to a local account. You can either create a new account, or connect with "
+"your existing account, if you have one."
 msgstr ""
 
-#: openidlogin.php:70
-#, php-format
-msgid "Login with an [OpenID](%%doc.openid%%) account."
+#: finishopenidlogin.php:72
+msgid "OpenID Account Setup"
 msgstr ""
 
-#: openidlogin.php:95 finishaddopenid.php:170
-msgid "OpenID Login"
+#: finishopenidlogin.php:97
+msgid "Create new account"
 msgstr ""
 
-#: openidlogin.php:112
-msgid "OpenID login"
+#: finishopenidlogin.php:99
+msgid "Create a new user with this nickname."
 msgstr ""
 
-#: openidlogin.php:117 openidsettings.php:107
-msgid "OpenID URL"
+#: finishopenidlogin.php:102
+msgid "New nickname"
 msgstr ""
 
-#: openidlogin.php:119
-msgid "Your OpenID URL"
+#: finishopenidlogin.php:104
+msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
 msgstr ""
 
-#: openidlogin.php:122
-msgid "Remember me"
+#: finishopenidlogin.php:114
+msgid "My text and files are available under "
 msgstr ""
 
-#: openidlogin.php:123
-msgid "Automatically login in the future; not for shared computers!"
+#: finishopenidlogin.php:117
+msgid ""
+" except this private data: password, email address, IM address, phone number."
 msgstr ""
 
-#: openidlogin.php:127
-msgid "Login"
+#: finishopenidlogin.php:121
+msgid "Create"
 msgstr ""
 
-#: openidserver.php:106
-#, php-format
-msgid "You are not authorized to use the identity %s"
+#: finishopenidlogin.php:126
+msgid "Connect existing account"
 msgstr ""
 
-#: openidserver.php:126
-msgid "Just an OpenID provider. Nothing to see here, move along..."
+#: finishopenidlogin.php:128
+msgid ""
+"If you already have an account, login with your username and password to "
+"connect it to your OpenID."
 msgstr ""
 
-#: OpenIDPlugin.php:123 OpenIDPlugin.php:135
-msgid "OpenID"
+#: finishopenidlogin.php:131
+msgid "Existing nickname"
 msgstr ""
 
-#: OpenIDPlugin.php:124
-msgid "Login or register with OpenID"
+#: finishopenidlogin.php:134
+msgid "Password"
 msgstr ""
 
-#: OpenIDPlugin.php:136
-msgid "Add or remove OpenIDs"
+#: finishopenidlogin.php:137
+msgid "Connect"
+msgstr ""
+
+#: finishopenidlogin.php:215 finishopenidlogin.php:224
+msgid "Registration not allowed."
+msgstr ""
+
+#: finishopenidlogin.php:231
+msgid "Not a valid invitation code."
+msgstr ""
+
+#: finishopenidlogin.php:241
+msgid "Nickname must have only lowercase letters and numbers and no spaces."
+msgstr ""
+
+#: finishopenidlogin.php:246
+msgid "Nickname not allowed."
+msgstr ""
+
+#: finishopenidlogin.php:251
+msgid "Nickname already in use. Try another one."
+msgstr ""
+
+#: finishopenidlogin.php:258 finishopenidlogin.php:338
+msgid "Stored OpenID not found."
+msgstr ""
+
+#: finishopenidlogin.php:267
+msgid "Creating new account for OpenID that already has a user."
+msgstr ""
+
+#: finishopenidlogin.php:327
+msgid "Invalid username or password."
+msgstr ""
+
+#: finishopenidlogin.php:345
+msgid "Error connecting user to OpenID."
 msgstr ""
 
 #: openid.php:141
@@ -126,57 +205,65 @@ msgstr ""
 msgid "OpenID Auto-Submit"
 msgstr ""
 
-#: openidtrust.php:51
-msgid "OpenID Identity Verification"
-msgstr ""
-
-#: openidtrust.php:69
+#: openidlogin.php:66
+#, php-format
 msgid ""
-"This page should only be reached during OpenID processing, not directly."
+"For security reasons, please re-login with your [OpenID](%%doc.openid%%) "
+"before changing your settings."
 msgstr ""
 
-#: openidtrust.php:118
+#: openidlogin.php:70
 #, php-format
-msgid ""
-"%s  has asked to verify your identity. Click Continue to verify your "
-"identity and login without creating a new password."
+msgid "Login with an [OpenID](%%doc.openid%%) account."
 msgstr ""
 
-#: openidtrust.php:136
-msgid "Continue"
+#: openidlogin.php:112
+msgid "OpenID login"
 msgstr ""
 
-#: openidtrust.php:137
-msgid "Cancel"
+#: openidlogin.php:117 openidsettings.php:107
+msgid "OpenID URL"
 msgstr ""
 
-#: finishaddopenid.php:67
-msgid "Not logged in."
+#: openidlogin.php:119
+msgid "Your OpenID URL"
 msgstr ""
 
-#: finishaddopenid.php:88 finishopenidlogin.php:149
-msgid "OpenID authentication cancelled."
+#: openidlogin.php:122
+msgid "Remember me"
 msgstr ""
 
-#: finishaddopenid.php:92 finishopenidlogin.php:153
-#, php-format
-msgid "OpenID authentication failed: %s"
+#: openidlogin.php:123
+msgid "Automatically login in the future; not for shared computers!"
 msgstr ""
 
-#: finishaddopenid.php:112
-msgid "You already have this OpenID!"
+#: openidlogin.php:127
+msgid "Login"
 msgstr ""
 
-#: finishaddopenid.php:114
-msgid "Someone else already has this OpenID."
+#: OpenIDPlugin.php:123 OpenIDPlugin.php:135
+msgid "OpenID"
 msgstr ""
 
-#: finishaddopenid.php:126
-msgid "Error connecting user."
+#: OpenIDPlugin.php:124
+msgid "Login or register with OpenID"
 msgstr ""
 
-#: finishaddopenid.php:131
-msgid "Error updating profile"
+#: OpenIDPlugin.php:136
+msgid "Add or remove OpenIDs"
+msgstr ""
+
+#: OpenIDPlugin.php:324
+msgid "Use <a href=\"http://openid.net/\">OpenID</a> to login to the site."
+msgstr ""
+
+#: openidserver.php:106
+#, php-format
+msgid "You are not authorized to use the identity %s."
+msgstr ""
+
+#: openidserver.php:126
+msgid "Just an OpenID provider. Nothing to see here, move along..."
 msgstr ""
 
 #: openidsettings.php:59
@@ -224,10 +311,6 @@ msgstr ""
 msgid "Remove"
 msgstr ""
 
-#: openidsettings.php:208 finishopenidlogin.php:52
-msgid "Something weird happened."
-msgstr ""
-
 #: openidsettings.php:228
 msgid "No such OpenID."
 msgstr ""
@@ -240,105 +323,26 @@ msgstr ""
 msgid "OpenID removed."
 msgstr ""
 
-#: finishopenidlogin.php:43
-msgid "You can't register if you don't agree to the license."
-msgstr ""
-
-#: finishopenidlogin.php:66
-#, php-format
-msgid ""
-"This is the first time you've logged into %s so we must connect your OpenID "
-"to a local account. You can either create a new account, or connect with "
-"your existing account, if you have one."
-msgstr ""
-
-#: finishopenidlogin.php:72
-msgid "OpenID Account Setup"
-msgstr ""
-
-#: finishopenidlogin.php:97
-msgid "Create new account"
-msgstr ""
-
-#: finishopenidlogin.php:99
-msgid "Create a new user with this nickname."
-msgstr ""
-
-#: finishopenidlogin.php:102
-msgid "New nickname"
-msgstr ""
-
-#: finishopenidlogin.php:104
-msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
-msgstr ""
-
-#: finishopenidlogin.php:114
-msgid "My text and files are available under "
+#: openidtrust.php:51
+msgid "OpenID Identity Verification"
 msgstr ""
 
-#: finishopenidlogin.php:117
+#: openidtrust.php:69
 msgid ""
-" except this private data: password, email address, IM address, phone number."
-msgstr ""
-
-#: finishopenidlogin.php:121
-msgid "Create"
-msgstr ""
-
-#: finishopenidlogin.php:126
-msgid "Connect existing account"
+"This page should only be reached during OpenID processing, not directly."
 msgstr ""
 
-#: finishopenidlogin.php:128
+#: openidtrust.php:118
+#, php-format
 msgid ""
-"If you already have an account, login with your username and password to "
-"connect it to your OpenID."
-msgstr ""
-
-#: finishopenidlogin.php:131
-msgid "Existing nickname"
-msgstr ""
-
-#: finishopenidlogin.php:134
-msgid "Password"
-msgstr ""
-
-#: finishopenidlogin.php:137
-msgid "Connect"
-msgstr ""
-
-#: finishopenidlogin.php:215 finishopenidlogin.php:224
-msgid "Registration not allowed."
-msgstr ""
-
-#: finishopenidlogin.php:231
-msgid "Not a valid invitation code."
-msgstr ""
-
-#: finishopenidlogin.php:241
-msgid "Nickname must have only lowercase letters and numbers and no spaces."
-msgstr ""
-
-#: finishopenidlogin.php:246
-msgid "Nickname not allowed."
-msgstr ""
-
-#: finishopenidlogin.php:251
-msgid "Nickname already in use. Try another one."
-msgstr ""
-
-#: finishopenidlogin.php:258 finishopenidlogin.php:338
-msgid "Stored OpenID not found."
-msgstr ""
-
-#: finishopenidlogin.php:267
-msgid "Creating new account for OpenID that already has a user."
+"%s  has asked to verify your identity. Click Continue to verify your "
+"identity and login without creating a new password."
 msgstr ""
 
-#: finishopenidlogin.php:327
-msgid "Invalid username or password."
+#: openidtrust.php:136
+msgid "Continue"
 msgstr ""
 
-#: finishopenidlogin.php:345
-msgid "Error connecting user to OpenID."
+#: openidtrust.php:137
+msgid "Cancel"
 msgstr ""
index bd39124efeb1cbf76954b1ea60bae1bf7fbec8ae..8f8434a85d188baa3d8d6350b9edf7e89ea9f5ac 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-22 15:03-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -16,16 +16,16 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: PoweredByStatusNetPlugin.php:49
+#: PoweredByStatusNetPlugin.php:50
 #, php-format
 msgid "powered by %s"
 msgstr ""
 
-#: PoweredByStatusNetPlugin.php:51
+#: PoweredByStatusNetPlugin.php:52
 msgid "StatusNet"
 msgstr ""
 
-#: PoweredByStatusNetPlugin.php:64
+#: PoweredByStatusNetPlugin.php:65
 msgid ""
 "Outputs powered by <a href=\"http://status.net/\">StatusNet</a> after site "
 "name."
index e8c44a743ad2ac119bec1d8d9376367c338bc13d..b559d80c605a540aa333299fb3e25deb998a0f35 100644 (file)
@@ -244,8 +244,6 @@ class RealtimePlugin extends Plugin
         // of refactoring from within a plugin, so I'm just abusing
         // the ApiAction method. Don't do this unless you're me!
 
-        require_once(INSTALLDIR.'/lib/api.php');
-
         $act = new ApiAction('/dev/null');
 
         $arr = $act->twitterStatusArray($notice, true);
diff --git a/plugins/Realtime/icon_external.gif b/plugins/Realtime/icon_external.gif
deleted file mode 100644 (file)
index c4118d5..0000000
Binary files a/plugins/Realtime/icon_external.gif and /dev/null differ
diff --git a/plugins/Realtime/icon_pause.gif b/plugins/Realtime/icon_pause.gif
deleted file mode 100644 (file)
index ced0b64..0000000
Binary files a/plugins/Realtime/icon_pause.gif and /dev/null differ
diff --git a/plugins/Realtime/icon_play.gif b/plugins/Realtime/icon_play.gif
deleted file mode 100644 (file)
index 794ec85..0000000
Binary files a/plugins/Realtime/icon_play.gif and /dev/null differ
index 31e7c2ae6638c4b49537022c1b25f54d1230b6ca..f43c97de52e71bb8053b18ffaf38ed70899a6e9b 100644 (file)
@@ -64,18 +64,9 @@ float: left;
 }
 
 #realtime_play {
-background: url(icon_play.gif) no-repeat 47% 47%;
 margin-left: 4px;
 }
 
-#realtime_pause {
-background: url(icon_pause.gif) no-repeat 47% 47%;
-}
-
-#realtime_popup {
-background: url(icon_external.gif) no-repeat 0 30%;
-}
-
 #queued_counter {
 float:left;
 line-height:1.2;
diff --git a/plugins/RegisterThrottle/RegisterThrottlePlugin.php b/plugins/RegisterThrottle/RegisterThrottlePlugin.php
new file mode 100644 (file)
index 0000000..05709b7
--- /dev/null
@@ -0,0 +1,249 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Throttle registration by IP address
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Spam
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Throttle registration by IP address
+ *
+ * We a) record IP address of registrants and b) throttle registrations.
+ *
+ * @category  Spam
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+class RegisterThrottlePlugin extends Plugin
+{
+    /**
+     * Array of time spans in seconds to limits.
+     *
+     * Default is 3 registrations per hour, 5 per day, 10 per week.
+     */
+
+    public $regLimits = array(604800 => 10, // per week
+                              86400 => 5, // per day
+                              3600 => 3); // per hour
+
+    /**
+     * Database schema setup
+     *
+     * We store user registrations in a table registration_ip.
+     *
+     * @return boolean hook value; true means continue processing, false means stop.
+     */
+
+    function onCheckSchema()
+    {
+        $schema = Schema::get();
+
+        // For storing user-submitted flags on profiles
+
+        $schema->ensureTable('registration_ip',
+                             array(new ColumnDef('user_id', 'integer', null,
+                                                 false, 'PRI'),
+                                   new ColumnDef('ipaddress', 'varchar', 15, false, 'MUL'),
+                                   new ColumnDef('created', 'timestamp', null, false, 'MUL')));
+
+        return true;
+    }
+
+    /**
+     * Load related modules when needed
+     *
+     * @param string $cls Name of the class to be loaded
+     *
+     * @return boolean hook value; true means continue processing, false means stop.
+     */
+
+    function onAutoload($cls)
+    {
+        $dir = dirname(__FILE__);
+
+        switch ($cls)
+        {
+        case 'Registration_ip':
+            include_once $dir . '/'.$cls.'.php';
+            return false;
+        default:
+            return true;
+        }
+    }
+
+    /**
+     * Called when someone tries to register.
+     *
+     * We check the IP here to determine if it goes over any of our
+     * configured limits.
+     *
+     * @param Action $action Action that is being executed
+     *
+     * @return boolean hook value
+     *
+     */
+
+    function onStartRegistrationTry($action)
+    {
+        $ipaddress = $this->_getIpAddress();
+
+        if (empty($ipaddress)) {
+            throw new ServerException(_m('Cannot find IP address.'));
+        }
+
+        foreach ($this->regLimits as $seconds => $limit) {
+
+            $this->debug("Checking $seconds ($limit)");
+
+            $reg = $this->_getNthReg($ipaddress, $limit);
+
+            if (!empty($reg)) {
+                $this->debug("Got a {$limit}th registration.");
+                $regtime = strtotime($reg->created);
+                $now     = time();
+                $this->debug("Comparing {$regtime} to {$now}");
+                if ($now - $regtime < $seconds) {
+                    throw new Exception(_("Too many registrations. Take a break and try again later."));
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Called after someone registers.
+     *
+     * We record the successful registration and IP address.
+     *
+     * @param Action $action Action that is being executed
+     *
+     * @return boolean hook value
+     *
+     */
+
+    function onEndRegistrationTry($action)
+    {
+        $ipaddress = $this->_getIpAddress();
+
+        if (empty($ipaddress)) {
+            throw new ServerException(_m('Cannot find IP address.'));
+        }
+
+        $user = common_current_user();
+
+        if (empty($user)) {
+            throw new ServerException(_m('Cannot find user after successful registration.'));
+        }
+
+        $reg = new Registration_ip();
+
+        $reg->user_id   = $user->id;
+        $reg->ipaddress = $ipaddress;
+
+        $result = $reg->insert();
+
+        if (!$result) {
+            common_log_db_error($reg, 'INSERT', __FILE__);
+            // @todo throw an exception?
+        }
+
+        return true;
+    }
+
+    /**
+     * Check the version of the plugin.
+     *
+     * @param array &$versions Version array.
+     *
+     * @return boolean hook value
+     */
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'RegisterThrottle',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Evan Prodromou',
+                            'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle',
+                            'description' =>
+                            _m('Throttles excessive registration from a single IP.'));
+        return true;
+    }
+
+    /**
+     * Gets the current IP address.
+     *
+     * @return string IP address or null if not found.
+     */
+
+    private function _getIpAddress()
+    {
+        $keys = array('HTTP_X_FORWARDED_FOR',
+                      'CLIENT-IP',
+                      'REMOTE_ADDR');
+
+        foreach ($keys as $k) {
+            if (!empty($_SERVER[$k])) {
+                return $_SERVER[$k];
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Gets the Nth registration with the given IP address.
+     *
+     * @param string  $ipaddress Address to key on
+     * @param integer $n         Nth address
+     *
+     * @return Registration_ip nth registration or null if not found.
+     */
+
+    private function _getNthReg($ipaddress, $n)
+    {
+        $reg = new Registration_ip();
+
+        $reg->ipaddress = $ipaddress;
+
+        $reg->orderBy('created DESC');
+        $reg->limit($n - 1, 1);
+
+        if ($reg->find(true)) {
+            return $reg;
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/plugins/RegisterThrottle/Registration_ip.php b/plugins/RegisterThrottle/Registration_ip.php
new file mode 100644 (file)
index 0000000..7e61d08
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Data class for storing IP addresses of new registrants.
+ *
+ * PHP version 5
+ *
+ * @category Data
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+
+/**
+ * Data class for storing IP addresses of new registrants.
+ *
+ * @category Spam
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ */
+
+class Registration_ip extends Memcached_DataObject
+{
+    public $__table = 'registration_ip';     // table name
+    public $user_id;                         // int(4)  primary_key not_null
+    public $ipaddress;                       // varchar(15)
+    public $created;                         // timestamp
+
+    /**
+     * Get an instance by key
+     *
+     * @param string $k Key to use to lookup (usually 'user_id' for this class)
+     * @param mixed  $v Value to lookup
+     *
+     * @return User_greeting_count object found, or null for no hits
+     *
+     */
+
+    function staticGet($k, $v=null)
+    {
+        return Memcached_DataObject::staticGet('Registration_ip', $k, $v);
+    }
+
+    /**
+     * return table definition for DB_DataObject
+     *
+     * @return array array of column definitions
+     */
+
+    function table()
+    {
+        return array('user_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
+                     'ipaddress' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+                     'created' => DB_DATAOBJECT_MYSQLTIMESTAMP + DB_DATAOBJECT_NOTNULL);
+    }
+
+    /**
+     * return key definitions for DB_DataObject
+     *
+     * DB_DataObject needs to know about keys that the table has; this function
+     * defines them.
+     *
+     * @return array key definitions
+     */
+
+    function keys()
+    {
+        return array('user_id' => 'K');
+    }
+
+    /**
+     * return key definitions for Memcached_DataObject
+     *
+     * Our caching system uses the same key definitions, but uses a different
+     * method to get them.
+     *
+     * @return array key definitions
+     */
+
+    function keyTypes()
+    {
+        return $this->keys();
+    }
+
+    /**
+     * Magic formula for non-autoincrementing integer primary keys
+     *
+     * If a table has a single integer column as its primary key, DB_DataObject
+     * assumes that the column is auto-incrementing and makes a sequence table
+     * to do this incrementation. Since we don't need this for our class, we
+     * overload this method and return the magic formula that DB_DataObject needs.
+     *
+     * @return array magic three-false array that stops auto-incrementing.
+     */
+
+    function sequenceKey()
+    {
+        return array(false, false, false);
+    }
+}
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 0cfd8a1c3e9d9eb7e3f33a7e1830cc7ef437db13..dfbd0ad4f256ffa578a2a7cdde65a0e2cd4580de 100644 (file)
@@ -119,13 +119,15 @@ class HelloAction extends Action
     }
 
     /**
-     * show content in the content area
+     * Show content in the content area
      *
      * The default StatusNet page has a lot of decorations: menus,
      * logos, tabs, all that jazz. This method is used to show
      * content in the content area of the page; it's the main
      * thing you want to overload.
      *
+     * This method also demonstrates use of a plural localized string.
+     *
      * @return void
      */
 
@@ -138,7 +140,9 @@ class HelloAction extends Action
             $this->element('p', array('class' => 'greeting'),
                            sprintf(_m('Hello, %s'), $this->user->nickname));
             $this->element('p', array('class' => 'greeting_count'),
-                           sprintf(_m('I have greeted you %d time(s).'),
+                           sprintf(_m('I have greeted you %d time.',
+                                      'I have greeted you %d times.',
+                                      $this->gc->greeting_count),
                                    $this->gc->greeting_count));
         }
     }
diff --git a/plugins/Sample/locale/Sample.po b/plugins/Sample/locale/Sample.po
new file mode 100644 (file)
index 0000000..a52c4ec
--- /dev/null
@@ -0,0 +1,56 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: hello.php:115 SamplePlugin.php:266
+msgid "Hello"
+msgstr ""
+
+#: hello.php:117 hello.php:141
+#, php-format
+msgid "Hello, %s"
+msgstr ""
+
+#: hello.php:138
+msgid "Hello, stranger!"
+msgstr ""
+
+#: hello.php:143
+#, php-format
+msgid "I have greeted you %d time."
+msgid_plural "I have greeted you %d times."
+msgstr[0] ""
+msgstr[1] ""
+
+#: SamplePlugin.php:266
+msgid "A warm greeting"
+msgstr ""
+
+#: SamplePlugin.php:277
+msgid "A sample plugin to show basics of development for new hackers."
+msgstr ""
+
+#: User_greeting_count.php:163
+#, php-format
+msgid "Could not save new greeting count for %d"
+msgstr ""
+
+#: User_greeting_count.php:176
+#, php-format
+msgid "Could not increment greeting count for %d"
+msgstr ""
index 71f3308281163b9338efc660c3f156e986e61bd1..654b9c9d5beada8e83664c7a3a3138310e50466f 100644 (file)
@@ -75,7 +75,7 @@ class SphinxSearch extends SearchEngine
     {
         if ('chron' === $mode) {
             $this->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'created_ts');
-            return $this->target->orderBy('created desc');
+            return $this->target->orderBy('id desc');
         }
     }
 
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 d3bcda5984d7c432c93dbb80ca2d9ee4eb49ed5a..72278b32e6eac525ec38fd19422a66a0872c4975 100644 (file)
@@ -1,47 +1,89 @@
+Twitter Bridge Plugin
+=====================
+
 This Twitter "bridge" plugin allows you to integrate your StatusNet
 instance with Twitter.  Installing it will allow your users to:
 
-    - automatically post notices to thier Twitter accounts
+    - automatically post notices to their Twitter accounts
     - automatically subscribe to other Twitter users who are also using
       your StatusNet install, if possible (requires running a daemon)
     - import their Twitter friends' tweets (requires running a daemon)
+    - allow users to authenticate using Twitter ('Sign in with Twitter')
 
 Installation
 ------------
 
-To enable the plugin, add the following to your config.php:
-
-    addPlugin("TwitterBridge");
-
-OAuth is used to to access protected resources on Twitter (as opposed to
-HTTP Basic Auth)*.  To use Twitter bridging you will need to register
-your instance of StatusNet as an application on Twitter
-(http://twitter.com/apps), and update the following variables in your
-config.php with the consumer key and secret Twitter generates for you:
-
-    $config['twitter']['consumer_key']    = 'YOURKEY';
-    $config['twitter']['consumer_secret'] = 'YOURSECRET';
+OAuth 1.0a (http://oauth.net) is used to to access protected resources
+on Twitter (as opposed to HTTP Basic Auth)*.  To use Twitter bridging
+you will need to register your instance of StatusNet as an application
+on Twitter (http://twitter.com/apps).  During the application
+registration process your application will be assigned a "consumer" key
+and secret, which the plugin will use to make OAuth requests to Twitter.
+You can either pass the consumer key and secret in when you enable the
+plugin, or set it using the Twitter administration panel.
 
 When registering your application with Twitter set the type to "Browser"
 and your Callback URL to:
 
     http://example.org/mublog/twitter/authorization
 
-The default access type should be, "Read & Write".
+(Change "example.org" to your site domain and "mublog" to your site
+path.)
+
+The default access type should be "Read & Write".
+
+To enable the plugin, add the following to your config.php:
+
+    addPlugin(
+        'TwitterBridge',
+        array(
+            'consumer_key'    => 'YOUR_CONSUMER_KEY',
+            'consumer_secret' => 'YOUR_CONSUMER_SECRET'
+        )
+    );
 
 * Note: The plugin will still push notices to Twitter for users who
-  have previously setup the Twitter bridge using their Twitter name and
-  password under an older versions of StatusNet, but all new Twitter
+  have previously set up the Twitter bridge using their Twitter name and
+  password under an older version of StatusNet, but all new Twitter
   bridge connections will use OAuth.
 
-Deamons
+Administration panel
+--------------------
+
+As of StatusNet 0.9.0 there is a new administration panel that allows
+you to configure Twitter bridge settings within StatusNet itself,
+instead of having to specify them manually in your config.php.  To enable
+the administration panel, you will need to add it to the list of active
+administration panels.  You can do this via your config.php. E.g.:
+
+    $config['admin']['panels'][] = 'twitter';
+
+And to access it, you'll need to use a user with the "administrator"
+role (see: scripts/userrole.php).
+
+Sign in with Twitter
+--------------------
+
+With 0.9.0, StatusNet optionally allows users to register and
+authenticate using their Twitter credentials via the "Sign in with
+Twitter" pattern described here:
+
+    http://apiwiki.twitter.com/Sign-in-with-Twitter
+
+The option is _on_ by default when you install the plugin, but it can
+disabled via the Twitter bridge administration panel, or by adding the
+following line to your config.php:
+
+    $config['twitter']['signin'] = false;
+
+Daemons
 -------
 
-For friend syncing and importing notices running two additional daemon
-scripts is necessary (synctwitterfriends.php and
-twitterstatusfetcher.php).
+For friend syncing and importing Twitter tweets, running two
+additional daemon scripts is necessary: synctwitterfriends.php and
+twitterstatusfetcher.php.
 
-In the daemons subidrectory of the plugin are three scripts:
+In the daemons subdirectory of the plugin are three scripts:
 
 * Twitter Friends Syncing (daemons/synctwitterfriends.php)
 
@@ -51,13 +93,13 @@ subscribe to "friends" (people they "follow") on Twitter who also have
 accounts on your StatusNet system, and who have previously set up a link
 for automatically posting notices to Twitter.
 
-The plugin will try to start this daemon when you run
-scripts/startdaemons.sh.
+The plugin will start this daemon when you run scripts/startdaemons.sh.
 
 * Importing statuses from Twitter (daemons/twitterstatusfetcher.php)
 
-To allow your users to import their friends' Twitter statuses, you will
-need to enable the bidirectional Twitter bridge in your config.php:
+You can allow uses to enable importing of your friends' Twitter
+timelines either in the Twitter bridge administration panel or in your
+config.php using the following configuration line:
 
     $config['twitterimport']['enabled'] = true;
 
@@ -66,8 +108,9 @@ other daemons when you run scripts/startdaemons.sh.
 
 Additionally, you will want to set the integration source variable,
 which will keep notices posted to Twitter via StatusNet from looping
-back.  The integration source should be set to the name of your
-application, exactly as you specified it on the settings page for your
+back.  You can do this in the Twitter bridge administration panel, or
+via config.php. The integration source should be set to the name of your
+application _exactly_ as you specified it on the settings page for your
 StatusNet application on Twitter, e.g.:
 
     $config['integration']['source'] = 'YourApp';
@@ -79,7 +122,9 @@ set up Twitter bridging.
 
 It's not strictly necessary to run this queue handler, and sites that
 haven't enabled queuing are still able to push notices to Twitter, but
-for larger sites and sites that wish to improve performance, this
-script allows notices to be sent "offline" via a separate process.
+for larger sites and sites that wish to improve performance the script
+allows notices to be sent "offline" via a separate process.
 
-The plugin will start this script when you run scripts/startdaemons.sh.
+StatusNet will automatically use the TwitterQueueHandler if you have
+enabled the queuing subsystem.  See the "Queues and daemons" section of
+the main README file for more information about how to do that.
index c7f57ffc7753066f29b86d4020b072fe41ddd928..6ce69d5e2b3f5b2434b465b87afb9852372abb32 100644 (file)
@@ -23,7 +23,7 @@
  * @author    Julien C <chaumond@gmail.com>
  * @copyright 2009-2010 Control Yourself, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link      http://laconi.ca/
+ * @link      http://status.net/
  */
 
 if (!defined('STATUSNET')) {
@@ -32,8 +32,6 @@ if (!defined('STATUSNET')) {
 
 require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
 
-define('TWITTERBRIDGEPLUGIN_VERSION', '0.9');
-
 /**
  * Plugin for sending and importing Twitter statuses
  *
@@ -44,19 +42,41 @@ define('TWITTERBRIDGEPLUGIN_VERSION', '0.9');
  * @author   Zach Copley <zach@status.net>
  * @author   Julien C <chaumond@gmail.com>
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://laconi.ca/
+ * @link     http://status.net/
  * @link     http://twitter.com/
  */
 
 class TwitterBridgePlugin extends Plugin
 {
+
+    const VERSION = STATUSNET_VERSION;
+
     /**
      * Initializer for the plugin.
      */
 
-    function __construct()
+    function initialize()
     {
-        parent::__construct();
+        // Allow the key and secret to be passed in
+        // Control panel will override
+
+        if (isset($this->consumer_key)) {
+            $key = common_config('twitter', 'consumer_key');
+            if (empty($key)) {
+                Config::save('twitter', 'consumer_key', $this->consumer_key);
+            }
+        }
+
+        if (isset($this->consumer_secret)) {
+            $secret = common_config('twitter', 'consumer_secret');
+            if (empty($secret)) {
+                Config::save(
+                    'twitter',
+                    'consumer_secret',
+                    $this->consumer_secret
+                );
+            }
+        }
     }
 
     /**
@@ -71,10 +91,17 @@ class TwitterBridgePlugin extends Plugin
 
     function onRouterInitialized($m)
     {
-        $m->connect('twitter/authorization',
-                    array('action' => 'twitterauthorization'));
+        $m->connect(
+            'twitter/authorization',
+            array('action' => 'twitterauthorization')
+        );
         $m->connect('settings/twitter', array('action' => 'twittersettings'));
-        $m->connect('main/twitterlogin', array('action' => 'twitterlogin'));
+
+        if (common_config('twitter', 'signin')) {
+            $m->connect('main/twitterlogin', array('action' => 'twitterlogin'));
+        }
+
+        $m->connect('admin/twitter', array('action' => 'twitteradminpanel'));
 
         return true;
     }
@@ -88,13 +115,16 @@ class TwitterBridgePlugin extends Plugin
      */
     function onEndLoginGroupNav(&$action)
     {
-
         $action_name = $action->trimmed('action');
 
-        $action->menuItem(common_local_url('twitterlogin'),
-                                           _('Twitter'),
-                                           _('Login or register using Twitter'),
-                                             'twitterlogin' === $action_name);
+        if (common_config('twitter', 'signin')) {
+            $action->menuItem(
+                common_local_url('twitterlogin'),
+                _m('Twitter'),
+                _m('Login or register using Twitter'),
+                'twitterlogin' === $action_name
+            );
+        }
 
         return true;
     }
@@ -110,10 +140,12 @@ class TwitterBridgePlugin extends Plugin
     {
         $action_name = $action->trimmed('action');
 
-        $action->menuItem(common_local_url('twittersettings'),
-                          _m('Twitter'),
-                          _m('Twitter integration options'),
-                          $action_name === 'twittersettings');
+        $action->menuItem(
+            common_local_url('twittersettings'),
+            _m('Twitter'),
+            _m('Twitter integration options'),
+            $action_name === 'twittersettings'
+        );
 
         return true;
     }
@@ -132,6 +164,7 @@ class TwitterBridgePlugin extends Plugin
         case 'TwittersettingsAction':
         case 'TwitterauthorizationAction':
         case 'TwitterloginAction':
+        case 'TwitteradminpanelAction':
             include_once INSTALLDIR . '/plugins/TwitterBridge/' .
               strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
@@ -173,12 +206,18 @@ class TwitterBridgePlugin extends Plugin
      */
     function onGetValidDaemons($daemons)
     {
-        array_push($daemons, INSTALLDIR .
-                   '/plugins/TwitterBridge/daemons/synctwitterfriends.php');
+        array_push(
+            $daemons,
+            INSTALLDIR
+            . '/plugins/TwitterBridge/daemons/synctwitterfriends.php'
+        );
 
         if (common_config('twitterimport', 'enabled')) {
-            array_push($daemons, INSTALLDIR
-                . '/plugins/TwitterBridge/daemons/twitterstatusfetcher.php');
+            array_push(
+                $daemons,
+                INSTALLDIR
+                . '/plugins/TwitterBridge/daemons/twitterstatusfetcher.php'
+            );
         }
 
         return true;
@@ -197,17 +236,55 @@ class TwitterBridgePlugin extends Plugin
         return true;
     }
 
+    /**
+     * Add a Twitter tab to the admin panel
+     *
+     * @param Widget $nav Admin panel nav
+     *
+     * @return boolean hook value
+     */
+
+    function onEndAdminPanelNav($nav)
+    {
+        if (AdminPanelAction::canAdmin('twitter')) {
+
+            $action_name = $nav->action->trimmed('action');
+
+            $nav->out->menuItem(
+                common_local_url('twitteradminpanel'),
+                _m('Twitter'),
+                _m('Twitter bridge configuration'),
+                $action_name == 'twitteradminpanel',
+                'nav_twitter_admin_panel'
+            );
+        }
+
+        return true;
+    }
+
+    /**
+     * Plugin version data
+     *
+     * @param array &$versions array of version blocks
+     *
+     * @return boolean hook value
+     */
+
     function onPluginVersion(&$versions)
     {
-        $versions[] = array('name' => 'TwitterBridge',
-                            'version' => TWITTERBRIDGEPLUGIN_VERSION,
-                            'author' => 'Zach Copley',
-                            'homepage' => 'http://status.net/wiki/Plugin:TwitterBridge',
-                            'rawdescription' =>
-                            _m('The Twitter "bridge" plugin allows you to integrate ' .
-                               'your StatusNet instance with ' .
-                               '<a href="http://twitter.com/">Twitter</a>.'));
+        $versions[] = array(
+            'name' => 'TwitterBridge',
+            'version' => self::VERSION,
+            'author' => 'Zach Copley, Julien C',
+            'homepage' => 'http://status.net/wiki/Plugin:TwitterBridge',
+            'rawdescription' => _m(
+                'The Twitter "bridge" plugin allows you to integrate ' .
+                'your StatusNet instance with ' .
+                '<a href="http://twitter.com/">Twitter</a>.'
+            )
+        );
         return true;
     }
 
 }
+
index 14c30f1c9c0cfbc9f7f76f7e7c972147b1a169f7..eff1255799675bc8210fb6463d3586123c6ae8ec 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:38-0800\n"
+"POT-Creation-Date: 2010-03-01 14:58-0800\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"
@@ -16,23 +16,48 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: twitterauthorization.php:81
-msgid "Not logged in."
+#: twitter.php:320
+msgid "Your Twitter bridge has been disabled."
 msgstr ""
 
-#: twitterauthorization.php:131 twitterauthorization.php:150
-#: twitterauthorization.php:170 twitterauthorization.php:217
+#: twitter.php:324
+#, php-format
+msgid ""
+"Hi, %1$s. We're sorry to inform you that your link to Twitter has been "
+"disabled. We no longer seem to have permission to update your Twitter "
+"status. (Did you revoke %3$s's access?)\n"
+"\n"
+"You can re-enable your Twitter bridge by visiting your Twitter settings "
+"page:\n"
+"\n"
+"\t%2$s\n"
+"\n"
+"Regards,\n"
+"%3$s\n"
+msgstr ""
+
+#: twitterauthorization.php:181 twitterauthorization.php:229
 msgid "Couldn't link your Twitter account."
 msgstr ""
 
-#: TwitterBridgePlugin.php:89
+#: twitterauthorization.php:201
+msgid "Couldn't link your Twitter account: oauth_token mismatch."
+msgstr ""
+
+#: TwitterBridgePlugin.php:114
 msgid "Twitter"
 msgstr ""
 
-#: TwitterBridgePlugin.php:90
+#: TwitterBridgePlugin.php:115
 msgid "Twitter integration options"
 msgstr ""
 
+#: TwitterBridgePlugin.php:207
+msgid ""
+"The Twitter \"bridge\" plugin allows you to integrate your StatusNet "
+"instance with <a href=\"http://twitter.com/\">Twitter</a>."
+msgstr ""
+
 #: twittersettings.php:59
 msgid "Twitter settings"
 msgstr ""
@@ -51,78 +76,81 @@ msgstr ""
 msgid "Connected Twitter account"
 msgstr ""
 
-#: twittersettings.php:125
-msgid "Remove"
+#: twittersettings.php:128
+msgid "Disconnect my account from Twitter"
+msgstr ""
+
+#: twittersettings.php:133
+msgid "Disconnecting your Twitter could make it impossible to log in! Please "
+msgstr ""
+
+#: twittersettings.php:137
+msgid "set a password"
 msgstr ""
 
-#: twittersettings.php:131
+#: twittersettings.php:139
+msgid " first."
+msgstr ""
+
+#: twittersettings.php:143
+#, php-format
+msgid ""
+"Keep your %1$s account but disconnect from Twitter. You can use your %1$s "
+"password to log in."
+msgstr ""
+
+#: twittersettings.php:151
+msgid "Disconnect"
+msgstr ""
+
+#: twittersettings.php:158
 msgid "Preferences"
 msgstr ""
 
-#: twittersettings.php:135
+#: twittersettings.php:162
 msgid "Automatically send my notices to Twitter."
 msgstr ""
 
-#: twittersettings.php:142
+#: twittersettings.php:169
 msgid "Send local \"@\" replies to Twitter."
 msgstr ""
 
-#: twittersettings.php:149
+#: twittersettings.php:176
 msgid "Subscribe to my Twitter friends here."
 msgstr ""
 
-#: twittersettings.php:158
+#: twittersettings.php:185
 msgid "Import my Friends Timeline."
 msgstr ""
 
-#: twittersettings.php:174
+#: twittersettings.php:201
 msgid "Save"
 msgstr ""
 
-#: twittersettings.php:176
+#: twittersettings.php:203
 msgid "Add"
 msgstr ""
 
-#: twittersettings.php:201
+#: twittersettings.php:228
 msgid "There was a problem with your session token. Try again, please."
 msgstr ""
 
-#: twittersettings.php:211
+#: twittersettings.php:238
 msgid "Unexpected form submission."
 msgstr ""
 
-#: twittersettings.php:230
+#: twittersettings.php:257
 msgid "Couldn't remove Twitter user."
 msgstr ""
 
-#: twittersettings.php:234
-msgid "Twitter account removed."
+#: twittersettings.php:261
+msgid "Twitter account disconnected."
 msgstr ""
 
-#: twittersettings.php:255 twittersettings.php:265
+#: twittersettings.php:282 twittersettings.php:292
 msgid "Couldn't save Twitter preferences."
 msgstr ""
 
-#: twittersettings.php:269
+#: twittersettings.php:296
 msgid "Twitter preferences saved."
 msgstr ""
-
-#: twitter.php:333
-msgid "Your Twitter bridge has been disabled."
-msgstr ""
-
-#: twitter.php:337
-#, php-format
-msgid ""
-"Hi, %1$s. We're sorry to inform you that your link to Twitter has been "
-"disabled. We no longer seem to have permission to update your Twitter "
-"status. (Did you revoke %3$s's access?)\n"
-"\n"
-"You can re-enable your Twitter bridge by visiting your Twitter settings "
-"page:\n"
-"\n"
-"\t%2$s\n"
-"\n"
-"Regards,\n"
-"%3$s\n"
-msgstr ""
diff --git a/plugins/TwitterBridge/twitteradminpanel.php b/plugins/TwitterBridge/twitteradminpanel.php
new file mode 100644 (file)
index 0000000..b22e6d9
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Twitter bridge administration panel
+ *
+ * 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  Settings
+ * @package   StatusNet
+ * @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);
+}
+
+/**
+ * Administer global Twitter bridge settings
+ *
+ * @category Admin
+ * @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 TwitteradminpanelAction extends AdminPanelAction
+{
+    /**
+     * Returns the page title
+     *
+     * @return string page title
+     */
+
+    function title()
+    {
+        return _m('Twitter');
+    }
+
+    /**
+     * Instructions for using this form.
+     *
+     * @return string instructions
+     */
+
+    function getInstructions()
+    {
+        return _m('Twitter bridge settings');
+    }
+
+    /**
+     * Show the Twitter admin panel form
+     *
+     * @return void
+     */
+
+    function showForm()
+    {
+        $form = new TwitterAdminPanelForm($this);
+        $form->show();
+        return;
+    }
+
+    /**
+     * Save settings from the form
+     *
+     * @return void
+     */
+
+    function saveSettings()
+    {
+        static $settings = array(
+            'twitter'     => array('consumer_key', 'consumer_secret'),
+            'integration' => array('source')
+        );
+
+        static $booleans = array(
+            'twitter'       => array('signin'),
+            'twitterimport' => array('enabled')
+        );
+
+        $values = array();
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                $values[$section][$setting]
+                    = $this->trimmed($setting);
+            }
+        }
+
+        foreach ($booleans as $section => $parts) {
+            foreach ($parts as $setting) {
+                $values[$section][$setting]
+                    = ($this->boolean($setting)) ? 1 : 0;
+            }
+        }
+
+        // This throws an exception on validation errors
+
+        $this->validate($values);
+
+        // assert(all values are valid);
+
+        $config = new Config();
+
+        $config->query('BEGIN');
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                Config::save($section, $setting, $values[$section][$setting]);
+            }
+        }
+
+        foreach ($booleans as $section => $parts) {
+            foreach ($parts as $setting) {
+                Config::save($section, $setting, $values[$section][$setting]);
+            }
+        }
+
+        $config->query('COMMIT');
+
+        return;
+    }
+
+    function validate(&$values)
+    {
+        // Validate consumer key and secret (can't be too long)
+
+        if (mb_strlen($values['twitter']['consumer_key']) > 255) {
+            $this->clientError(
+                _m("Invalid consumer key. Max length is 255 characters.")
+            );
+        }
+
+        if (mb_strlen($values['twitter']['consumer_secret']) > 255) {
+            $this->clientError(
+                _m("Invalid consumer secret. Max length is 255 characters.")
+            );
+        }
+    }
+}
+
+class TwitterAdminPanelForm extends AdminForm
+{
+    /**
+     * ID of the form
+     *
+     * @return int ID of the form
+     */
+
+    function id()
+    {
+        return 'twitteradminpanel';
+    }
+
+    /**
+     * class of the form
+     *
+     * @return string class of the form
+     */
+
+    function formClass()
+    {
+        return 'form_settings';
+    }
+
+    /**
+     * Action of the form
+     *
+     * @return string URL of the action
+     */
+
+    function action()
+    {
+        return common_local_url('twitteradminpanel');
+    }
+
+    /**
+     * Data elements of the form
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->elementStart(
+            'fieldset',
+            array('id' => 'settings_twitter-application')
+        );
+        $this->out->element('legend', null, _m('Twitter application settings'));
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->li();
+        $this->input(
+            'consumer_key',
+            _m('Consumer key'),
+            _m('Consumer key assigned by Twitter'),
+            'twitter'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'consumer_secret',
+             _m('Consumer secret'),
+            _m('Consumer secret assigned by Twitter'),
+            'twitter'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'source',
+             _m('Integration source'),
+            _m('Name of your Twitter application'),
+            'integration'
+        );
+        $this->unli();
+
+        $this->out->elementEnd('ul');
+        $this->out->elementEnd('fieldset');
+
+        $this->out->elementStart(
+            'fieldset',
+            array('id' => 'settings_twitter-options')
+        );
+        $this->out->element('legend', null, _m('Options'));
+
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->li();
+
+        $this->out->checkbox(
+            'signin', _m('Enable "Sign-in with Twitter"'),
+            (bool) $this->value('signin', 'twitter'),
+            _m('Allow users to login with their Twitter credentials')
+        );
+        $this->unli();
+
+        $this->li();
+        $this->out->checkbox(
+            'enabled', _m('Enable Twitter import'),
+            (bool) $this->value('enabled', 'twitterimport'),
+            _m('Allow users to import their Twitter friends\' timelines')
+        );
+        $this->unli();
+
+        $this->out->elementEnd('ul');
+
+        $this->out->elementEnd('fieldset');
+    }
+
+    /**
+     * Action elements
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit('submit', _('Save'), 'submit', null, _('Save Twitter settings'));
+    }
+}
index cabf69d7a8b47a0e03dc0fad1cf2eb3c877a5ca9..c93f6666bcc3f718ae42e3ede404abd849005783 100644 (file)
@@ -47,7 +47,7 @@ require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
  * @author   Zach Copley <zach@status.net>
  * @author   Julien C <chaumond@gmail.com>
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://laconi.ca/
+ * @link     http://status.net/
  *
  */
 class TwitterauthorizationAction extends Action
index 882d744564dbb4c4398cf9741fe7d6eafc90d739..e0b5fc906be8c0e9fc79bb50d20496f8aa786cd7 100644 (file)
@@ -119,6 +119,9 @@ function newSub($i)
 
 function main($usercount, $noticeavg, $subsavg, $tagmax)
 {
+    global $config;
+    $config['site']['dupelimit'] = -1;
+
     $n = 1;
 
     newUser(0);
diff --git a/scripts/init_conversation.php b/scripts/init_conversation.php
new file mode 100755 (executable)
index 0000000..675e7ca
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+common_log(LOG_INFO, 'Initializing conversation table...');
+
+$notice = new Notice();
+$notice->query('select distinct conversation from notice');
+
+while ($notice->fetch()) {
+    $id = $notice->conversation;
+
+    if ($id) {
+        $uri = common_local_url('conversation', array('id' => $id));
+
+        // @fixme db_dataobject won't save our value for an autoincrement
+        // so we're bypassing the insert wrappers
+        $conv = new Conversation();
+        $sql = "insert into conversation (id,uri,created) values(%d,'%s','%s')";
+        $sql = sprintf($sql,
+                       $id,
+                       $conv->escape($uri),
+                       $conv->escape(common_sql_now()));
+        echo "$id ";
+        $conv->query($sql);
+        print "... ";
+    }
+}
+print "done.\n";
index f882f673a4d9d00025dcfe0154c7068ce60142c8..0bfa62a22e79d2c47a8bfb84094a6d3cb4c3bf5e 100755 (executable)
@@ -36,7 +36,11 @@ xgettext \
     --default-domain=$domain \
     --output=locale/$domain.po \
     --language=PHP \
-    --keyword="_m:1" \
+    --add-comments=TRANS \
+    --keyword="_m:1,1t" \
+    --keyword="_m:1c,2,2t" \
+    --keyword="_m:1,2,3t" \
+    --keyword="_m:1c,2,3,4t" \
     --keyword="pgettext:1c,2" \
     --keyword="npgettext:1c,2,3" \
     actions/*.php \
@@ -62,8 +66,12 @@ xgettext \
     --default-domain=$domain \
     --output=locale/$domain.po \
     --language=PHP \
+    --add-comments=TRANS \
     --keyword='' \
-    --keyword="_m:1" \
+    --keyword="_m:1,1t" \
+    --keyword="_m:1c,2,2t" \
+    --keyword="_m:1,2,3t" \
+    --keyword="_m:1c,2,3,4t" \
 
 END;
     foreach ($files as $file) {
@@ -186,6 +194,9 @@ foreach ($args as $arg) {
         $allplugins = true;
     } elseif (substr($arg, 0, 9) == "--plugin=") {
         $plugins[] = substr($arg, 9);
+    } elseif ($arg == '--help') {
+        echo "options: --all --core --plugins --plugin=Foo\n\n";
+        exit(0);
     }
 }
 
index 617c2e24c744233990b651010bb09fe45138d1ca..3b6681bae907a952b7314ad80f02a4bb24ac99db 100644 (file)
@@ -94,11 +94,11 @@ function updateAvatars($user)
                 }
             }
 
-            $orig = clone($avatar);
+            $orig_url = $avatar->url;
 
             $avatar->url = Avatar::url($avatar->filename);
 
-            if ($avatar->url != $orig->url) {
+            if ($avatar->url != $orig_url) {
                 $sql =
                   "UPDATE avatar SET url = '" . $avatar->url . "' ".
                   "WHERE profile_id = " . $avatar->profile_id . " ".
diff --git a/scripts/updateavatarurl_group.php b/scripts/updateavatarurl_group.php
new file mode 100644 (file)
index 0000000..ada42de
--- /dev/null
@@ -0,0 +1,99 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+$shortoptions = 'i:n:a';
+$longoptions = array('id=', 'nickname=', 'all');
+
+$helptext = <<<END_OF_UPDATEAVATARURL_HELP
+updateavatarurl_group.php [options]
+update the URLs of all group avatars in the system
+
+  -i --id       ID of group to update
+  -n --nickname nickname of the group to update
+  -a --all      update all
+
+END_OF_UPDATEAVATARURL_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+try {
+    $user = null;
+
+    if (have_option('i', 'id')) {
+        $id = get_option_value('i', 'id');
+        $group = User_group::staticGet('id', $id);
+        if (empty($group)) {
+            throw new Exception("Can't find group with id '$id'.");
+        }
+        updateGroupAvatars($group);
+    } else if (have_option('n', 'nickname')) {
+        $nickname = get_option_value('n', 'nickname');
+        $group = User_group::staticGet('nickname', $nickname);
+        if (empty($group)) {
+            throw new Exception("Can't find group with nickname '$nickname'");
+        }
+        updateGroupAvatars($group);
+    } else if (have_option('a', 'all')) {
+        $group = new User_group();
+        if ($group->find()) {
+            while ($group->fetch()) {
+                updateGroupAvatars($group);
+            }
+        }
+    } else {
+        show_help();
+        exit(1);
+    }
+} catch (Exception $e) {
+    print $e->getMessage()."\n";
+    exit(1);
+}
+
+function updateGroupAvatars($group)
+{
+    if (!have_option('q', 'quiet')) {
+        print "Updating avatars for group '".$group->nickname."' (".$group->id.")...";
+    }
+
+    if (empty($group->original_logo)) {
+        print "(none found)...";
+    } else {
+        // Using clone here was screwing up the group->find() iteration
+        $orig = User_group::staticGet('id', $group->id);
+
+        $group->original_logo = Avatar::url(basename($group->original_logo));
+        $group->homepage_logo = Avatar::url(basename($group->homepage_logo));
+        $group->stream_logo = Avatar::url(basename($group->stream_logo));
+        $group->mini_logo = Avatar::url(basename($group->mini_logo));
+
+        if (!$group->update($orig)) {
+            throw new Exception("Can't update avatars for group " . $group->nickname . ".");
+        }
+    }
+
+    if (have_option('v', 'verbose')) {
+        print "DONE.";
+    }
+    if (!have_option('q', 'quiet') || have_option('v', 'verbose')) {
+        print "\n";
+    }
+}
diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php
new file mode 100644 (file)
index 0000000..7bf9cec
--- /dev/null
@@ -0,0 +1,332 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+    print "This script must be run from the command line\n";
+    exit();
+}
+
+// XXX: we should probably have some common source for this stuff
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+
+require_once INSTALLDIR . '/lib/common.php';
+
+class ActivityParseTests extends PHPUnit_Framework_TestCase
+{
+    public function testExample1()
+    {
+        global $_example1;
+        $dom = DOMDocument::loadXML($_example1);
+        $act = new Activity($dom->documentElement);
+
+        $this->assertFalse(empty($act));
+
+        $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');
+    }
+
+    public function testExample3()
+    {
+        global $_example3;
+        $dom = DOMDocument::loadXML($_example3);
+
+        $feed = $dom->documentElement;
+
+        $entries = $feed->getElementsByTagName('entry');
+
+        $entry = $entries->item(0);
+
+        $act = new Activity($entry, $feed);
+
+        $this->assertFalse(empty($act));
+        $this->assertEquals($act->time, 1071340202);
+        $this->assertEquals($act->link, 'http://example.org/2003/12/13/atom03.html');
+
+        $this->assertEquals($act->verb, ActivityVerb::POST);
+
+        $this->assertFalse(empty($act->actor));
+        $this->assertEquals($act->actor->type, ActivityObject::PERSON);
+        $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->context));
+
+        $this->assertTrue(empty($act->target));
+
+        $this->assertEquals($act->entry, $entry);
+        $this->assertEquals($act->feed, $feed);
+    }
+
+    public function testExample4()
+    {
+        global $_example4;
+        $dom = DOMDocument::loadXML($_example4);
+
+        $entry = $dom->documentElement;
+
+        $act = new Activity($entry);
+
+        $this->assertFalse(empty($act));
+        $this->assertEquals(1266547958, $act->time);
+        $this->assertEquals('http://example.net/notice/14', $act->link);
+
+        $this->assertFalse(empty($act->context));
+        $this->assertEquals('http://example.net/notice/12', $act->context->replyToID);
+        $this->assertEquals('http://example.net/notice/12', $act->context->replyToUrl);
+        $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,
+                            '@<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));
+    }
+
+    public function testExample5()
+    {
+        global $_example5;
+        $dom = DOMDocument::loadXML($_example5);
+
+        $feed = $dom->documentElement;
+
+        // @todo Test feed elements
+
+        $entries = $feed->getElementsByTagName('entry');
+        $entry = $entries->item(0);
+
+        $act = new Activity($entry, $feed);
+
+        // Post
+        $this->assertEquals($act->verb, ActivityVerb::POST);
+        $this->assertFalse(empty($act->context));
+
+        // Actor w/Portable Contacts stuff
+        $this->assertFalse(empty($act->actor));
+        $this->assertEquals($act->actor->type, ActivityObject::PERSON);
+        $this->assertEquals($act->actor->title, 'Test User');
+        $this->assertEquals($act->actor->id, 'http://example.net/mysite/user/3');
+        $this->assertEquals($act->actor->link, 'http://example.net/mysite/testuser');
+
+        $avatars = $act->actor->avatarLinks;
+
+        $this->assertEquals(
+                $avatars[0]->url,
+                'http://example.net/mysite/avatar/3-96-20100224004207.jpeg'
+        );
+
+        $this->assertEquals($act->actor->displayName, 'Test User');
+
+        $poco = $act->actor->poco;
+        $this->assertEquals($poco->preferredUsername, 'testuser');
+        $this->assertEquals($poco->address->formatted, 'San Francisco, CA');
+        $this->assertEquals($poco->urls[0]->type, 'homepage');
+        $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');
+
+    }
+
+}
+
+$_example1 = <<<EXAMPLE1
+<?xml version='1.0' encoding='UTF-8'?>
+<entry xmlns='http://www.w3.org/2005/Atom' xmlns:activity='http://activitystrea.ms/spec/1.0/'>
+  <id>tag:versioncentral.example.org,2009:/commit/1643245</id>
+  <published>2009-06-01T12:54:00Z</published>
+  <title>Geraldine committed a change to yate</title>
+  <content type="xhtml">Geraldine just committed a change to yate on VersionCentral</content>
+  <link rel="alternate" type="text/html"
+        href="http://versioncentral.example.org/geraldine/yate/commit/1643245" />
+  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+  <activity:verb>http://versioncentral.example.org/activity/commit</activity:verb>
+  <activity:object>
+    <activity:object-type>http://versioncentral.example.org/activity/changeset</activity:object-type>
+    <id>tag:versioncentral.example.org,2009:/change/1643245</id>
+    <title>Punctuation Changeset</title>
+    <summary>Fixing punctuation because it makes it more readable.</summary>
+    <link rel="alternate" type="text/html" href="..." />
+  </activity:object>
+</entry>
+EXAMPLE1;
+
+$_example2 = <<<EXAMPLE2
+<?xml version='1.0' encoding='UTF-8'?>
+<entry xmlns='http://www.w3.org/2005/Atom' xmlns:activity='http://activitystrea.ms/spec/1.0/'>
+  <id>tag:photopanic.example.com,2008:activity01</id>
+  <title>Geraldine posted a Photo on PhotoPanic</title>
+  <published>2008-11-02T15:29:00Z</published>
+  <link rel="alternate" type="text/html" href="/geraldine/activities/1" />
+  <activity:verb>
+  http://activitystrea.ms/schema/1.0/post
+  </activity:verb>
+  <activity:object>
+    <id>tag:photopanic.example.com,2008:photo01</id>
+    <title>My Cat</title>
+    <published>2008-11-02T15:29:00Z</published>
+    <link rel="alternate" type="text/html" href="/geraldine/photos/1" />
+    <activity:object-type>
+      tag:atomactivity.example.com,2008:photo
+    </activity:object-type>
+    <source>
+      <title>Geraldine's Photos</title>
+      <link rel="self" type="application/atom+xml" href="/geraldine/photofeed.xml" />
+      <link rel="alternate" type="text/html" href="/geraldine/" />
+    </source>
+  </activity:object>
+  <content type="html">
+     &lt;p&gt;Geraldine posted a Photo on PhotoPanic&lt;/p&gt;
+     &lt;img src="/geraldine/photo1.jpg"&gt;
+  </content>
+</entry>
+EXAMPLE2;
+
+$_example3 = <<<EXAMPLE3
+<?xml version="1.0" encoding="utf-8"?>
+
+<feed xmlns="http://www.w3.org/2005/Atom">
+
+    <title>Example Feed</title>
+    <subtitle>A subtitle.</subtitle>
+    <link href="http://example.org/feed/" rel="self" />
+    <link href="http://example.org/" />
+    <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
+    <updated>2003-12-13T18:30:02Z</updated>
+    <author>
+        <name>John Doe</name>
+        <email>johndoe@example.com</email>
+    </author>
+
+    <entry>
+        <title>Atom-Powered Robots Run Amok</title>
+        <link href="http://example.org/2003/12/13/atom03" />
+        <link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>
+        <link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
+        <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
+        <updated>2003-12-13T18:30:02Z</updated>
+        <summary>Some text.</summary>
+    </entry>
+
+</feed>
+EXAMPLE3;
+
+$_example4 = <<<EXAMPLE4
+<?xml version='1.0' encoding='UTF-8'?>
+<entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:ostatus="http://ostatus.org/schema/1.0">
+ <title>@evan now is the time for all good men to come to the aid of their country. #thetime</title>
+ <summary>@evan now is the time for all good men to come to the aid of their country. #thetime</summary>
+<author>
+ <name>spock</name>
+ <uri>http://example.net/user/2</uri>
+</author>
+<activity:actor>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://example.net/user/2</id>
+ <title>spock</title>
+ <link type="image/png" rel="avatar" href="http://example.net/theme/identica/default-avatar-profile.png"></link>
+</activity:actor>
+ <link rel="alternate" type="text/html" href="http://example.net/notice/14"/>
+ <id>http://example.net/notice/14</id>
+ <published>2010-02-19T02:52:38+00:00</published>
+ <updated>2010-02-19T02:52:38+00:00</updated>
+ <link rel="related" href="http://example.net/notice/12"/>
+ <thr:in-reply-to ref="http://example.net/notice/12" href="http://example.net/notice/12"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://example.net/conversation/11"/>
+ <link rel="ostatus:attention" href="http://example.net/user/1"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://example.net/user/1&quot; class=&quot;url&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;evan&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; now is the time for all good men to come to the aid of their country. #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://example.net/tag/thetime&quot; rel=&quot;tag&quot;&gt;thetime&lt;/a&gt;&lt;/span&gt;</content>
+ <category term="thetime"></category>
+</entry>
+EXAMPLE4;
+
+$_example5 = <<<EXAMPLE5
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0">
+ <id>3</id>
+ <title>testuser timeline</title>
+ <subtitle>Updates from testuser on Zach Dev!</subtitle>
+ <logo>http://example.net/mysite/avatar/3-96-20100224004207.jpeg</logo>
+ <updated>2010-02-24T06:38:49+00:00</updated>
+<author>
+ <name>testuser</name>
+ <uri>http://example.net/mysite/user/3</uri>
+
+</author>
+ <link href="http://example.net/mysite/testuser" rel="alternate" type="text/html"/>
+ <link href="http://example.net/mysite/api/statuses/user_timeline/3.atom" rel="self" type="application/atom+xml"/>
+ <link href="http://example.net/mysite/main/sup#3" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="http://example.net/mysite/main/push/hub" rel="hub"/>
+ <link href="http://example.net/mysite/main/salmon/user/3" rel="salmon"/>
+<activity:subject>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://example.net/mysite/user/3</id>
+ <title>Test User</title>
+ <link rel="alternate" type="text/html" href="http://example.net/mysite/testuser"/>
+ <link type="image/jpeg" rel="avatar" href="http://example.net/mysite/avatar/3-96-20100224004207.jpeg"/>
+ <georss:point>37.7749295 -122.4194155</georss:point>
+
+<poco:preferredUsername>testuser</poco:preferredUsername>
+<poco:displayName>Test User</poco:displayName>
+<poco:note>Just another test user.</poco:note>
+<poco:address>
+ <poco:formatted>San Francisco, CA</poco:formatted>
+</poco:address>
+<poco:urls>
+ <poco:type>homepage</poco:type>
+ <poco:value>http://example.com/blog.html</poco:value>
+ <poco:primary>true</poco:primary>
+
+</poco:urls>
+</activity:subject>
+<entry>
+ <title>Hey man, is that Freedom Code?! #freedom #hippy</title>
+ <summary>Hey man, is that Freedom Code?! #freedom #hippy</summary>
+<author>
+ <name>testuser</name>
+ <uri>http://example.net/mysite/user/3</uri>
+</author>
+<activity:actor>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://example.net/mysite/user/3</id>
+ <title>Test User</title>
+ <link rel="alternate" type="text/html" href="http://example.net/mysite/testuser"/>
+ <link type="image/jpeg" rel="avatar" href="http://example.net/mysite/avatar/3-96-20100224004207.jpeg"/>
+ <georss:point>37.7749295 -122.4194155</georss:point>
+
+<poco:preferredUsername>testuser</poco:preferredUsername>
+<poco:displayName>Test User</poco:displayName>
+<poco:note>Just another test user.</poco:note>
+<poco:address>
+ <poco:formatted>San Francisco, CA</poco:formatted>
+</poco:address>
+<poco:urls>
+ <poco:type>homepage</poco:type>
+ <poco:value>http://example.com/blog.html</poco:value>
+ <poco:primary>true</poco:primary>
+
+</poco:urls>
+</activity:actor>
+ <link rel="alternate" type="text/html" href="http://example.net/mysite/notice/7"/>
+ <id>http://example.net/mysite/notice/7</id>
+ <published>2010-02-24T00:53:06+00:00</published>
+ <updated>2010-02-24T00:53:06+00:00</updated>
+ <link rel="ostatus:conversation" href="http://example.net/mysite/conversation/7"/>
+ <content type="html">Hey man, is that Freedom Code?! #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://example.net/mysite/tag/freedom&quot; rel=&quot;tag&quot;&gt;freedom&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://example.net/mysite/tag/hippy&quot; rel=&quot;tag&quot;&gt;hippy&lt;/a&gt;&lt;/span&gt;</content>
+ <georss:point>37.8313160 -122.2852473</georss:point>
+
+</entry>
+</feed>
+EXAMPLE5;
diff --git a/tests/TagURITest.php b/tests/TagURITest.php
new file mode 100644 (file)
index 0000000..d23f8bf
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+    print "This script must be run from the command line\n";
+    exit();
+}
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+
+require_once INSTALLDIR . '/lib/common.php';
+
+$config['site']['server'] = 'example.net';
+$config['site']['path']   = '/apps/statusnet';
+
+class TagURITest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testProduction($format, $args, $uri)
+    {
+        $minted = call_user_func_array(array('TagURI', 'mint'),
+                                       array_merge(array($format), $args));
+
+        $this->assertEquals($uri, $minted);
+    }
+
+    static public function provider()
+    {
+        return array(array('favorite:%d:%d',
+                           array(1, 3),
+                           'tag:example.net,'.date('Y-m-d').':apps:statusnet:favorite:1:3'));
+    }
+}
+
index 89fe810c6955b9082bb1270aa2d9ac1cecb949ad..f32c57ea451758aa48fa0017817deb74e00cf784 100644 (file)
@@ -799,8 +799,8 @@ list-style-type:none;
 display:inline;
 }
 .entity_tags li {
-float:left;
-margin-right:11px;
+display:inline;
+margin-right:7px;
 }
 
 .aside .section {
@@ -1035,6 +1035,7 @@ text-decoration:underline;
 
 .notice .entry-title {
 overflow:hidden;
+word-wrap:break-word;
 }
 .notice .entry-title.ov {
 overflow:visible;
@@ -1489,6 +1490,7 @@ text-align:center;
 }
 .aside .tag-cloud {
 font-size:0.8em;
+word-wrap:break-word;
 }
 .tag-cloud li {
 display:inline;
diff --git a/theme/base/images/icons/README b/theme/base/images/icons/README
new file mode 100644 (file)
index 0000000..ea58214
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * @author    Paul Jarvis http://code.google.com/p/twotiny/
+ * @license   http://dev.perl.org/licenses/ Artistic License/GPL
+ * @note
+        White left arrow with green background
+        White right arrow with green background
+        White clip with green background
+        White heart with green background
+        White reply with green background
+        White garbage with green background
+        White pencil with green background
+        White envelope with green background
+        White speech bubble with green background
+        White shield with green background
+        White asterisk with green background
+        White x with green background
+        White plus with green background
+        White minus with green background
+        White skull with green background
+        White recycle with green background
+        White external with green background
+        White key with green background
+        White flag with green background
+        White checkmark with green background
+        White reject with green background
+        White play with green background
+        White pause with green background
+ */
+
+
+/**
+ * @author    Sarven Capadisli <csarven@status.net>
+ * @copyright 2008-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/
+ * @note
+        Green clip with transparent background
+        Green heart with white background
+        White person with tie with green background
+        White sherif badge with green background
+        White boxes with green background
+        White speech bubble broken with green background
+        Green recycle with transparent background
+        Green pin with white background
+        White pin with green background
+        White underscore with green background
+        White C with green background
+ */
+
+Created by various authors
+* FOAF icon from http://iandavis.com/2006/foaf-icons/ with Public Domain license
+* Atom feed icon from http://intertwingly.net/wiki/pie/Icon with Public Domain license
+* RSS feed icon from http://www.feedicons.com/ (Mozilla, Microsoft, Matt Brett) with MPL/GPL/LGPL tri-license
+* Processing icon from/by Unknown with Unknown license //FIXME
diff --git a/theme/base/images/icons/icon_geo.png b/theme/base/images/icons/icon_geo.png
deleted file mode 100644 (file)
index 8df2456..0000000
Binary files a/theme/base/images/icons/icon_geo.png and /dev/null differ
index 6f284f023ee7c7c1fef480c26e7ccfd2b27ba32c..be884ff48944d2ec4694f426ada7644b0aa0e101 100644 (file)
Binary files a/theme/base/images/icons/icons-01.gif and b/theme/base/images/icons/icons-01.gif differ
index 726062e473f17b2b5c06c2803835800b3c4f0518..285c2ad836f88615faea0d1f8434c8358050bd25 100644 (file)
@@ -1628,15 +1628,23 @@ button.close,
 .form_user_unsubscribe input.submit,
 .form_group_join input.submit,
 .form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a,
 .entity_moderation p,
 .entity_sandbox input.submit,
 .entity_silence input.submit,
 .entity_delete input.submit,
 .notice-options .repeated,
-.form_notice a#notice_data-geo_name,
 .form_notice label[for=notice_data-geo],
-button.minimize {
+button.minimize,
+.form_reset_key input.submit,
+.entity_clear input.submit,
+.entity_flag input.submit,
+.entity_flag p,
+.entity_subscribe input.submit,
+#realtime_play,
+#realtime_pause,
+#realtime_popup {
 background-image:url(../../base/images/icons/icons-01.gif);
 background-repeat:no-repeat;
 background-color:transparent;
@@ -1899,6 +1907,31 @@ background-position: 5px -1445px;
 .entity_delete input.submit {
 background-position: 5px -1511px;
 }
+.form_reset_key input.submit {
+background-position: 5px -1973px;
+}
+.entity_clear input.submit {
+background-position: 5px -2039px;
+}
+.entity_flag input.submit,
+.entity_flag p {
+background-position: 5px -2105px;
+}
+.entity_subscribe input.accept {
+background-position: 5px -2171px;
+}
+.entity_subscribe input.reject {
+background-position: 5px -2237px;
+}
+#realtime_play {
+background-position: 0 -2308px;
+}
+#realtime_pause {
+background-position: 0 -2374px;
+}
+#realtime_popup {
+background-position: 0 -1714px;
+}
 
 
 /* NOTICES */
index a2f10134283210534a36c9f08a13cc25f9fcf31e..8ae2b4014199ef77d605a0f3c89e75b98bce7e81 100644 (file)
@@ -184,6 +184,7 @@ button.close,
 .form_user_unsubscribe input.submit,
 .form_group_join input.submit,
 .form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a,
 .entity_moderation p,
 .entity_sandbox input.submit,
@@ -196,7 +197,10 @@ button.minimize,
 .entity_clear input.submit,
 .entity_flag input.submit,
 .entity_flag p,
-.entity_subscribe input.submit {
+.entity_subscribe input.submit,
+#realtime_play,
+#realtime_pause,
+#realtime_popup {
 background-image:url(../../base/images/icons/icons-01.gif);
 background-repeat:no-repeat;
 background-color:transparent;
@@ -291,6 +295,7 @@ background-position:0 1px;
 .form_group_leave input.submit,
 .form_user_subscribe input.submit,
 .form_user_unsubscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a {
 background-color:#AAAAAA;
 color:#FFFFFF;
@@ -301,12 +306,13 @@ background-position:5px -1246px;
 }
 .form_group_join input.submit,
 .form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a {
 background-position:5px -1181px;
 }
 
 .entity_edit a {
-background-position: 5px -718px;
+background-position: 5px -719px;
 }
 .entity_send-a-message a {
 background-position: 5px -852px;
@@ -360,6 +366,16 @@ background-position: 5px -2171px;
 .entity_subscribe input.reject {
 background-position: 5px -2237px;
 }
+#realtime_play {
+background-position: 0 -2308px;
+}
+#realtime_pause {
+background-position: 0 -2374px;
+}
+#realtime_popup {
+background-position: 0 -1714px;
+}
+
 
 /* NOTICES */
 .notice .attachment {
index e214047451efbd8c79a0f33c98a4f61bd3e86de7..737e3a10326d13fd1db8d7de858c49252759c367 100644 (file)
@@ -81,7 +81,8 @@ background-color:transparent;
 input:focus, textarea:focus, select:focus,
 .form_notice.warning #notice_data-text,
 .form_notice.warning #notice_text-count,
-.form_settings .form_note {
+.form_settings .form_note,
+.entity_actions .dialogbox .form_data input:focus {
 border-color:#9BB43E;
 }
 input.submit {
@@ -184,6 +185,7 @@ button.close,
 .form_user_unsubscribe input.submit,
 .form_group_join input.submit,
 .form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a,
 .entity_moderation p,
 .entity_sandbox input.submit,
@@ -196,7 +198,10 @@ button.minimize,
 .entity_clear input.submit,
 .entity_flag input.submit,
 .entity_flag p,
-.entity_subscribe input.submit {
+.entity_subscribe input.submit,
+#realtime_play,
+#realtime_pause,
+#realtime_popup {
 background-image:url(../../base/images/icons/icons-01.gif);
 background-repeat:no-repeat;
 background-color:transparent;
@@ -290,6 +295,7 @@ background-position:0 1px;
 .form_group_leave input.submit,
 .form_user_subscribe input.submit,
 .form_user_unsubscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a {
 background-color:#AAAAAA;
 color:#FFFFFF;
@@ -300,12 +306,13 @@ background-position:5px -1246px;
 }
 .form_group_join input.submit,
 .form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
 .entity_subscribe a {
 background-position:5px -1181px;
 }
 
 .entity_edit a {
-background-position: 5px -718px;
+background-position: 5px -719px;
 }
 .entity_send-a-message a {
 background-position: 5px -852px;
@@ -359,6 +366,15 @@ background-position: 5px -2171px;
 .entity_subscribe input.reject {
 background-position: 5px -2237px;
 }
+#realtime_play {
+background-position: 0 -2308px;
+}
+#realtime_pause {
+background-position: 0 -2374px;
+}
+#realtime_popup {
+background-position: 0 -1714px;
+}
 
 /* NOTICES */
 .notice .attachment {
diff --git a/theme/otalk/css/base.css b/theme/otalk/css/base.css
deleted file mode 100644 (file)
index 8af86f9..0000000
+++ /dev/null
@@ -1,1211 +0,0 @@
-/** theme: otalk base
- *
- * @package   StatusNet
- * @author Sarven Capadisli <csarven@status.net>
- * @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/
- */
-
-* { margin:0; padding:0; }
-img { display:block; border:0; }
-a abbr { cursor: pointer; border-bottom:0; }
-table { border-collapse:collapse; }
-ol { list-style-position:inside; }
-html { font-size: 87.5%; background-color:#fff; }
-body {
-background-color:#fff;
-color:#000;
-font-family:sans-serif;
-font-size:1em;
-line-height:1.65;
-position:relative;
-}
-h1,h2,h3,h4,h5,h6 {
-margin-bottom:7px;
-overflow:hidden;
-}
-h1 {
-font-size:1.4em;
-margin-bottom:18px;
-}
-#showstream h1 { display:none; }
-h2 { font-size:1.3em; }
-h3 { font-size:1.2em; }
-h4 { font-size:1.1em; }
-h5 { font-size:1em; }
-h6 { font-size:0.9em; }
-
-caption {
-font-weight:bold;
-}
-legend {
-font-weight:bold;
-font-size:1.3em;
-}
-input, textarea, select, option {
-padding:4px;
-font-family:sans-serif;
-font-size:1em;
-}
-input, textarea, select {
-border-width:2px;
-border-style: solid;
-border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
-}
-
-input.submit {
-font-weight:bold;
-cursor:pointer;
-}
-textarea {
-overflow:auto;
-}
-option {
-padding-bottom:0;
-}
-fieldset {
-padding:0;
-border:0;
-}
-form ul li {
-list-style-type:none;
-margin:0 0 18px 0;
-}
-form label {
-font-weight:bold;
-}
-input.checkbox {
-position:relative;
-top:2px;
-left:0;
-border:0;
-}
-
-.error,
-.success {
-padding:4px 7px;
-border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
-margin-bottom:18px;
-}
-form label.submit {
-display:none;
-}
-
-.form_settings {
-clear:both;
-}
-
-.form_settings fieldset {
-margin-bottom:29px;
-}
-.form_settings input.remove {
-margin-left:11px;
-}
-.form_settings .form_data li {
-width:100%;
-float:left;
-}
-.form_settings .form_data label {
-float:left;
-}
-.form_settings .form_data textarea,
-.form_settings .form_data select,
-.form_settings .form_data input {
-margin-left:11px;
-float:left;
-}
-.form_settings .form_data input.submit {
-margin-left:0;
-}
-
-.form_settings label {
-margin-top:2px;
-width:152px;
-}
-
-.form_actions label {
-display:none;
-}
-.form_guide {
-font-style:italic;
-}
-
-.form_settings #settings_autosubscribe label {
-display:inline;
-font-weight:bold;
-}
-
-#form_settings_profile legend,
-#form_login legend,
-#form_register legend,
-#form_password legend,
-#form_settings_avatar legend,
-#newgroup legend,
-#editgroup legend,
-#form_tag_user legend,
-#form_remote_subscribe legend,
-#form_openid_login legend,
-#form_search legend,
-#form_invite legend,
-#form_notice_delete legend,
-#form_password_recover legend,
-#form_password_change legend {
-display:none;
-}
-
-.form_settings .form_data p.form_guide {
-clear:both;
-margin-left:163px;
-margin-bottom:0;
-}
-
-.form_settings p {
-margin-bottom:11px;
-}
-
-.form_settings input.checkbox {
-margin-top:3px;
-margin-left:0;
-}
-.form_settings label.checkbox {
-font-weight:normal;
-margin-top:0;
-margin-right:0;
-margin-left:11px;
-float:left;
-width:90%;
-}
-
-
-#form_login p.form_guide,
-#form_register #settings_rememberme p.form_guide,
-#form_openid_login #settings_rememberme p.form_guide,
-#settings_twitter_remove p.form_guide,
-#form_search ul.form_data #q {
-margin-left:0;
-}
-
-.form_settings .form_note {
-border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
-padding:0 7px;
-}
-
-
-.form_settings input.form_action-primary {
-padding:0;
-}
-.form_settings input.form_action-secondary {
-margin-left:29px;
-}
-
-#form_search .submit {
-margin-left:11px;
-}
-
-address {
-float:left;
-margin-bottom:18px;
-margin-left:18px;
-}
-address.vcard img.logo {
-margin-right:0;
-}
-address .fn {
-font-weight:bold;
-}
-address img + .fn {
-display:none;
-}
-
-#header {
-width:100%;
-position:relative;
-float:left;
-padding-top:18px;
-margin-bottom:29px;
-}
-
-#site_nav_global_primary {
-float:right;
-margin-right:18px;
-margin-bottom:11px;
-margin-left:18px;
-}
-#site_nav_global_primary ul li {
-display:inline;
-margin-left:11px;
-}
-
-.system_notice dt {
-font-weight:bold;
-text-transform:uppercase;
-display:none;
-}
-
-#site_notice {
-position:absolute;
-top:65px;
-right:18px;
-width:250px;
-width:24%;
-}
-#page_notice {
-clear:both;
-margin-bottom:18px;
-}
-
-
-#anon_notice {
-float:left;
-width:43.2%;
-padding:1.1%;
-border-radius:7px;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-border-width:2px;
-border-style:solid;
-line-height:1.5;
-font-size:1.1em;
-font-weight:bold;
-}
-
-
-#footer {
-float:left;
-width:64%;
-padding:18px;
-}
-
-#site_nav_local_views {
-float:left;
-}
-#site_nav_local_views dt {
-display:none;
-}
-#site_nav_local_views li {
-float:left;
-margin-right:18px;
-list-style-type:none;
-}
-#site_nav_local_views a {
-float:left;
-text-decoration:none;
-padding:4px 11px;
--moz-border-radius-topleft:4px;
--moz-border-radius-topright:4px;
--webkit-border-top-left-radius:4px;
--webkit-border-top-right-radius:4px;
-border-width:0;
-border-style:solid;
-border-bottom:0;
-text-shadow: 2px 2px 2px #ddd;
-font-weight:bold;
-}
-#site_nav_local_views .nav {
-float:left;
-width:100%;
-border-bottom-width:1px;
-border-bottom-style:solid;
-}
-
-#site_nav_global_primary dt,
-#site_nav_global_secondary dt {
-display:none;
-}
-
-#site_nav_global_secondary {
-margin-bottom:11px;
-}
-
-#site_nav_global_secondary ul li {
-display:inline;
-margin-right:11px;
-}
-#export_data li a {
-padding-left:20px;
-}
-#export_data li a.foaf {
-padding-left:30px;
-}
-#export_data li a.export_vcard {
-padding-left:28px;
-}
-
-#export_data ul {
-display:inline;
-}
-#export_data li {
-list-style-type:none;
-display:inline;
-margin-left:11px;
-}
-#export_data li:first-child {
-margin-left:0;
-}
-
-#licenses {
-font-size:0.9em;
-}
-
-#licenses dt {
-font-weight:bold;
-display:none;
-}
-#licenses dd {
-margin-bottom:11px;
-line-height:1.5;
-}
-
-#site_content_license_cc {
-margin-bottom:0;
-}
-#site_content_license_cc img {
-display:inline;
-vertical-align:top;
-margin-right:4px;
-}
-
-#wrap {
-margin:0 auto;
-width:100%;
-min-width:760px;
-max-width:1003px;
-overflow:hidden;
-}
-
-#core {
-position:relative;
-width:100%;
-float:left;
-margin-bottom:1em;
-}
-
-#content {
-width:67.9%;
-min-height:259px;
-padding-top:1.795%;
-padding-bottom:1.795%;
-float:left;
-clear:left;
-border-radius:7px;
--moz-border-radius:7px;
--moz-border-radius-topleft:0;
--webkit-border-radius:7px;
--webkit-border-top-left-radius:0;
-border-style:solid;
-border-width:0;
-margin-bottom:18px;
-}
-
-#content_inner {
-position:relative;
-width:100%;
-float:left;
-}
-
-#aside_primary {
-width:27.917%;
-min-height:259px;
-float:left;
-padding:1.795%;
-margin-left:0.385%;
-border-radius:7px;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-border-width:1px;
-border-style:solid;
-}
-
-#form_notice {
-width:45.664%;
-float:left;
-position:relative;
-line-height:1;
-}
-#form_notice fieldset {
-border:0;
-padding:0;
-}
-#form_notice legend {
-display:none;
-}
-#form_notice textarea {
-float:left;
-border-radius:7px;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-width:80.789%;
-height:67px;
-line-height:1.5;
-padding:7px 7px 16px 7px;
-}
-#form_notice label {
-display:block;
-float:left;
-font-size:1.3em;
-margin-bottom:7px;
-}
-#form_notice #notice_submit label {
-display:none;
-}
-#form_notice .form_note {
-position:absolute;
-top:99px;
-right:98px;
-z-index:9;
-}
-#form_notice .form_note dt {
-font-weight:bold;
-display:none;
-}
-#notice_text-count {
-font-weight:bold;
-line-height:1.15;
-padding:1px 2px;
-}
-#form_notice #notice_action-submit {
-width:14%;
-height:47px;
-padding:0;
-position:absolute;
-bottom:0;
-right:0;
-}
-#form_notice label[for=to] {
-margin-top:7px;
-}
-#form_notice select[id=to] {
-margin-bottom:7px;
-margin-left:18px;
-float:left;
-}
-
-
-/* entity_profile */
-.entity_profile {
-position:relative;
-width:521px;
-min-height:123px;
-float:left;
-margin-bottom:18px;
-margin-left:0;
-overflow:hidden;
-}
-.entity_profile dt,
-#entity_statistics dt {
-font-weight:bold;
-}
-.entity_profile dd {
-display:inline;
-}
-
-.entity_profile .entity_depiction {
-float:left;
-width:96px;
-margin-right:18px;
-margin-bottom:18px;
-}
-
-.entity_profile .entity_fn,
-.entity_profile .entity_nickname,
-.entity_profile .entity_location,
-.entity_profile .entity_url,
-.entity_profile .entity_note,
-.entity_profile .entity_tags {
-margin-left:113px;
-margin-bottom:4px;
-}
-
-.entity_profile .entity_fn,
-.entity_profile .entity_nickname {
-margin-left:11px;
-display:inline;
-font-weight:bold;
-}
-.entity_profile .entity_nickname {
-margin-left:0;
-}
-
-.entity_profile .entity_fn dd:before {
-content: "(";
-font-weight:normal;
-}
-.entity_profile .entity_fn dd:after {
-content: ")";
-font-weight:normal;
-}
-
-.entity_profile dt {
-display:none;
-}
-.entity_profile h2 {
-display:none;
-}
-/* entity_profile */
-
-
-/*entity_actions*/
-.entity_actions {
-float:left;
-margin-left:4.35%;
-max-width:25%;
-}
-.entity_actions h2 {
-display:none;
-}
-.entity_actions ul {
-list-style-type:none;
-}
-.entity_actions li {
-margin-bottom:4px;
-}
-.entity_actions li:first-child {
-border-top:0;
-}
-.entity_actions fieldset {
-border:0;
-padding:0;
-}
-.entity_actions legend {
-display:none;
-}
-
-.entity_actions input.submit {
-display:block;
-text-align:left;
-width:100%;
-}
-.entity_actions a,
-.entity_nudge p,
-.entity_remote_subscribe {
-text-decoration:none;
-font-weight:bold;
-display:block;
-}
-
-.form_user_block input.submit,
-.form_user_unblock input.submit,
-.entity_send-a-message a,
-.entity_edit a,
-.form_user_nudge input.submit,
-.entity_nudge p {
-border:0;
-padding-left:20px;
-}
-
-.entity_edit a,
-.entity_send-a-message a,
-.entity_nudge p {
-padding:4px 4px 4px 23px;
-}
-
-.entity_remote_subscribe {
-padding:4px;
-border-width:2px;
-border-style:solid;
-border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
-}
-.entity_actions .accept {
-margin-bottom:18px;
-}
-
-.entity_tags ul {
-list-style-type:none;
-display:inline;
-}
-.entity_tags li {
-display:inline;
-margin-right:4px;
-}
-
-.aside .section {
-margin-bottom:29px;
-clear:both;
-float:left;
-width:100%;
-}
-.aside .section h2 {
-text-transform:uppercase;
-font-size:1em;
-}
-
-#entity_statistics dt,
-#entity_statistics dd {
-display:inline;
-}
-#entity_statistics dt:after {
-content: ":";
-}
-
-.section ul.entities {
-float:left;
-width:100%;
-}
-.section .entities li {
-list-style-type:none;
-float:left;
-margin-right:7px;
-margin-bottom:7px;
-}
-.section .entities li .photo {
-margin-right:0;
-margin-bottom:0;
-}
-.section .entities li .fn {
-display:none;
-}
-
-.aside .section p,
-.aside .section .more {
-clear:both;
-}
-
-.profile .entity_profile {
-margin-bottom:0;
-min-height:60px;
-}
-
-
-.profile .form_group_join legend,
-.profile .form_group_leave legend,
-.profile .form_user_subscribe legend,
-.profile .form_user_unsubscribe legend {
-display:none;
-}
-
-.profiles {
-list-style-type:none;
-}
-.profile .entity_profile .entity_location {
-width:auto;
-clear:none;
-margin-left:11px;
-}
-.profile .entity_profile dl,
-.profile .entity_profile dd {
-display:inline;
-float:none;
-}
-.profile .entity_profile .entity_note,
-.profile .entity_profile .entity_url,
-.profile .entity_profile .entity_tags,
-.profile .entity_profile .form_subscription_edit {
-margin-left:59px;
-clear:none;
-display:block;
-width:auto;
-}
-.profile .entity_profile .entity_tags dt {
-display:inline;
-margin-right:11px;
-}
-
-
-.profile .entity_profile .form_subscription_edit label {
-font-weight:normal;
-margin-right:11px;
-}
-
-
-/* NOTICE */
-.notice,
-.profile {
-position:relative;
-clear:both;
-float:left;
-width:100%;
-border-width:0;
-border-style:solid;
-margin-bottom:29px;
-}
-.notices li {
-list-style-type:none;
-}
-
-#content .notice {
-width:37%;
-margin-left:17px;
-margin-bottom:47px;
-clear:none;
-overflow:hidden;
-padding: 0 0 0 65px;
-min-height:235px;
-}
-
-#aside_primary .notice {
-margin-bottom:18px;
-}
-
-#shownotice #content .notice {
-width:96%;
-}
-
-
-/* NOTICES */
-#notices_primary {
-float:left;
-width:100%;
-border-radius:7px;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-}
-#notices_primary h2 {
-display:none;
-}
-.notice-data a span {
-display:block;
-padding-left:28px;
-}
-
-.notice .author {
-margin-right:11px;
-}
-
-#content .notice .author {
-/*overflow:hidden;*/
-}
-
-.fn {
-overflow:hidden;
-}
-
-.notice .author .fn {
-font-weight:bold;
-}
-
-.notice .author .photo {
-margin-bottom:0;
-}
-
-#content .notice .author .photo {
-margin-left:-83px;
-padding-right:17px;
-}
-
-
-.vcard .photo {
-display:inline;
-margin-right:11px;
-margin-bottom:11px;
-float:left;
-}
-.vcard .url {
-text-decoration:none;
-}
-.vcard .url:hover {
-text-decoration:underline;
-}
-
-.notice .entry-title {
-float:left;
-width:100%;
-overflow:hidden;
-}
-#content .notice .entry-title {
-overflow:visible;
-margin-bottom:11px;
-padding:18px;
-width:85%;
-border-radius:7px;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-min-height:161px;
-}
-
-#shownotice .notice .entry-title {
-font-size:2.2em;
-}
-
-.notice p.entry-content {
-display:inline;
-}
-
-#content .notice p.entry-content
-overflow:hidden;
-}
-
-.notice p.entry-content .vcard a {
-border-radius:4px;
--moz-border-radius:4px;
--webkit-border-radius:4px;
-}
-
-.notice div.entry-content {
-clear:left;
-float:left;
-font-size:0.95em;
-}
-#showstream .notice div.entry-content {
-margin-left:0;
-}
-
-.notice .notice-options a,
-.notice .notice-options input {
-float:left;
-font-size:1.025em;
-}
-
-.notice div.entry-content dl,
-.notice div.entry-content dt,
-.notice div.entry-content dd {
-display:inline;
-}
-
-.notice div.entry-content .timestamp dt,
-.notice div.entry-content .response dt {
-display:none;
-}
-.notice div.entry-content .timestamp a {
-display:inline-block;
-}
-.notice div.entry-content .device dt {
-text-transform:lowercase;
-}
-
-
-
-.notice-data {
-position:absolute;
-top:18px;
-right:0;
-min-height:50px;
-margin-bottom:4px;
-}
-.notice .entry-content .notice-data dt {
-display:none;
-}
-
-.notice-data a {
-display:block;
-outline:none;
-}
-
-.notice-options {
-position:absolute;
-top:120px;
-left:30px;
-font-size:0.95em;
-}
-
-.notice-options a {
-float:left;
-}
-.notice-options .notice_delete,
-.notice-options .notice_reply,
-.notice-options .form_favor,
-.notice-options .form_disfavor {
-position:absolute;
-left:0;
-}
-.notice-options .form_favor,
-.notice-options .form_disfavor {
-top:0;
-}
-.notice-options .notice_reply {
-top:29px;
-}
-.notice-options .notice_delete {
-top:58px;
-}
-.notice-options .notice_reply dt {
-display:none;
-}
-
-.notice-options input,
-.notice-options a {
-text-indent:-9999px;
-outline:none;
-}
-
-.notice-options .notice_reply a,
-.notice-options input.submit {
-display:block;
-border:0;
-}
-.notice-options .notice_reply a,
-.notice-options .notice_delete a {
-text-decoration:none;
-padding-left:16px;
-}
-
-.notice-options form input.submit {
-width:16px;
-padding:2px 0;
-}
-
-.notice-options .notice_delete dt,
-.notice-options .form_favor legend,
-.notice-options .form_disfavor legend {
-display:none;
-}
-.notice-options .notice_delete fieldset,
-.notice-options .form_favor fieldset,
-.notice-options .form_disfavor fieldset {
-border:0;
-padding:0;
-}
-
-
-#usergroups #new_group {
-float: left;
-margin-right: 2em;
-}
-#new_group, #group_search {
-margin-bottom:18px;
-}
-#new_group a {
-padding-left:20px;
-}
-
-
-#filter_tags {
-margin-bottom:11px;
-float:left;
-}
-#filter_tags dt {
-display:none;
-}
-#filter_tags ul {
-list-style-type:none;
-}
-#filter_tags ul li {
-float:left;
-margin-left:7px;
-padding-left:7px;
-border-left-width:1px;
-border-left-style:solid;
-}
-#filter_tags ul li.child_1 {
-margin-left:0;
-border-left:0;
-padding-left:0;
-}
-#filter_tags ul li#filter_tags_all a {
-font-weight:bold;
-margin-top:7px;
-float:left;
-}
-
-#filter_tags ul li#filter_tags_item label {
-margin-right:7px;
-}
-#filter_tags ul li#filter_tags_item label,
-#filter_tags ul li#filter_tags_item select {
-display:inline;
-}
-#filter_tags ul li#filter_tags_item p {
-float:left;
-margin-left:38px;
-}
-#filter_tags ul li#filter_tags_item input {
-position:relative;
-top:3px;
-left:3px;
-}
-
-
-
-.pagination {
-float:left;
-clear:both;
-width:100%;
-margin-top:18px;
-}
-
-.pagination dt {
-font-weight:bold;
-display:none;
-}
-
-.pagination .nav {
-float:left;
-width:100%;
-list-style-type:none;
-}
-
-.pagination .nav_prev {
-float:left;
-}
-.pagination .nav_next {
-float:right;
-}
-
-.pagination a {
-display:block;
-text-decoration:none;
-font-weight:bold;
-padding:7px;
-border-width:1px;
-border-style:solid;
--moz-border-radius:7px;
--webkit-border-radius:7px;
-border-radius:7px;
-}
-
-.pagination .nav_prev a {
-padding-left:30px;
-}
-.pagination .nav_next a {
-padding-right:30px;
-}
-/* END: NOTICE */
-
-
-.hentry .entry-content p {
-margin-bottom:18px;
-}
-.hentry entry-content ol,
-.hentry .entry-content ul {
-list-style-position:inside;
-}
-.hentry .entry-content li {
-margin-bottom:18px;
-}
-.hentry .entry-content li li {
-margin-left:18px;
-}
-
-
-
-
-/* TOP_POSTERS */
-.section tbody td {
-padding-right:11px;
-padding-bottom:11px;
-}
-.section .vcard .photo {
-margin-right:7px;
-margin-bottom:0;
-}
-
-.section .notice {
-padding-top:7px;
-padding-bottom:7px;
-border-top:0;
-}
-
-.section .notice:first-child {
-padding-top:0;
-}
-
-.section .notice .author {
-margin-right:0;
-}
-.section .notice .author .fn {
-display:none;
-}
-
-
-/* tagcloud */
-.tag-cloud {
-list-style-type:none;
-text-align:center;
-}
-.aside .tag-cloud {
-font-size:0.8em;
-}
-.tag-cloud li {
-display:inline;
-margin-right:7px;
-line-height:1.25;
-}
-.aside .tag-cloud li {
-line-height:1.5;
-}
-.tag-cloud li a {
-text-decoration:none;
-}
-#tagcloud.section dt {
-text-transform:uppercase;
-font-weight:bold;
-}
-.tag-cloud-1 {
-font-size:1em;
-}
-.tag-cloud-2 {
-font-size:1.25em;
-}
-.tag-cloud-3 {
-font-size:1.75em;
-}
-.tag-cloud-4 {
-font-size:2em;
-}
-.tag-cloud-5 {
-font-size:2.25em;
-}
-.tag-cloud-6 {
-font-size:2.75em;
-}
-.tag-cloud-7 {
-font-size:3.25em;
-}
-
-#publictagcloud #tagcloud.section dt {
-display:none;
-}
-
-#form_settings_photo .form_data {
-clear:both;
-}
-
-#form_settings_avatar li {
-width:auto;
-}
-#form_settings_avatar input {
-margin-left:0;
-}
-#avatar_original,
-#avatar_preview {
-float:left;
-}
-#avatar_preview {
-margin-left:29px;
-}
-#avatar_preview_view {
-height:96px;
-width:96px;
-margin-bottom:18px;
-overflow:hidden;
-}
-
-#settings_attach,
-#form_settings_avatar .form_actions {
-clear:both;
-}
-
-#form_settings_avatar .form_actions {
-margin-bottom:0;
-}
-
-#form_settings_design #settings_design_color .form_data,
-#form_settings_design #color-picker {
-float:left;
-}
-#form_settings_design #settings_design_color .form_data {
-width:400px;
-margin-right:28px;
-}
-
-.instructions ul {
-list-style-position:inside;
-}
-.instructions p,
-.instructions ul {
-margin-bottom:18px;
-}
-.help dt {
-display:none;
-}
-.guide {
-clear:both;
-}
diff --git a/theme/otalk/css/display.css b/theme/otalk/css/display.css
deleted file mode 100644 (file)
index bdfaea7..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/** theme: otalk
- *
- * @package   StatusNet
- * @author Sarven Capadisli <csarven@status.net>
- * @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/
- */
-
-@import url(base.css);
-
-html {
-}
-
-html,
-body,
-a:active {
-}
-body {
-font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
-font-size:1em;
-background:#ddd url(../images/illustrations/illu_pattern-01.png) repeat 0 0;
-background-color:rgba(127, 127, 127, 0.1);
-}
-address {
-margin-right:7.18%;
-}
-
-input, textarea, select, option {
-font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
-}
-input, textarea, select,
-.entity_remote_subscribe {
-border-color:#aaa;
-}
-#filter_tags ul li {
-border-color:#ddd;
-}
-
-.form_settings input.form_action-primary {
-background:none;
-}
-
-input.submit,
-#form_notice.warning #notice_text-count,
-.form_settings .form_note,
-.entity_remote_subscribe {
-background-color:#9BB43E;
-}
-
-input:focus, textarea:focus, select:focus,
-#form_notice.warning #notice_data-text {
-border-color:#9BB43E;
-}
-input.submit,
-.entity_remote_subscribe {
-color:#fff;
-}
-
-a,
-div.notice-options input,
-.form_user_block input.submit,
-.form_user_unblock input.submit,
-.entity_send-a-message a,
-.form_user_nudge input.submit,
-.entity_nudge p,
-.form_settings input.form_action-primary {
-color:#8F0000;
-}
-
-.notice,
-.profile {
-border-color:#CEE1E9;
-}
-#content .notice .entry-title,
-input, textarea, select, option,
-.pagination .nav_prev a,
-.pagination .nav_next a {
-background-color:rgba(255,255,255,0.8);
-}
-
-#content .notices li.hover .entry-title {
-background-color:rgba(255,255,255,0.9);
-}
-
-#content .notice:nth-child(1) .entry-title {
-background-color:rgba(255,255,255,0.95);
-}
-#content .notice:nth-child(2) .entry-title {
-background-color:rgba(255,255,255,0.9);
-}
-#content .notice:nth-child(3) .entry-title {
-background-color:rgba(255,255,255,0.8);
-}
-#content .notice:nth-child(4) .entry-title {
-background-color:rgba(255,255,255,0.7);
-}
-#content .notice:nth-child(5) .entry-title {
-background-color:rgba(255,255,255,0.6);
-}
-#content .notice:nth-child(6) .entry-title {
-background-color:rgba(255,255,255,0.5);
-}
-#content .notice:nth-child(7) .entry-title {
-background-color:rgba(255,255,255,0.4);
-}
-#content .notice:nth-child(8) .entry-title {
-background-color:rgba(255,255,255,0.3);
-}
-#content .notice:nth-child(9) .entry-title {
-background-color:rgba(255,255,255,0.2);
-}
-#content .notice:nth-child(10) {
-background-color:rgba(255,255,255,0.1);
-}
-
-
-#content .notice .author .photo {
-background:url(../images/illustrations/illu_arrow-left-01.gif) no-repeat 100% 0;
-}
-
-.section .profile {
-border-top-color:#87B4C8;
-}
-
-#aside_primary {
-background-color:rgba(206, 225, 233,0.5);
-}
-
-#notice_text-count {
-color:#333;
-}
-#form_notice.warning #notice_text-count {
-color:#000;
-}
-#form_notice.processing #notice_action-submit {
-background:#fff url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%;
-cursor:wait;
-text-indent:-9999px;
-}
-
-#content,
-#site_nav_local_views .nav,
-#site_nav_local_views a,
-#aside_primary {
-border-color:#fff;
-}
-#content,
-#site_nav_local_views .current a {
-background-color:transparent;
-/*background-color:red;*/
-}
-
-#site_nav_local_views .current a {
-background-color:transparent;
-}
-
-#site_nav_local_views a {
-background-color:rgba(127, 127, 127, 0.2);
-}
-#site_nav_local_views a:hover {
-background-color:rgba(255, 255, 255, 0.8);
-}
-
-.error {
-background-color:#F7E8E8;
-}
-.success {
-background-color:#EFF3DC;
-}
-
-#anon_notice {
-background-color:rgba(206, 225, 233, 0.7);
-color:#fff;
-border-color:#fff;
-}
-
-#showstream #anon_notice {
-background-color:rgba(155, 180, 62, 0.7);
-}
-
-#export_data li a {
-background-repeat:no-repeat;
-background-position:0 45%;
-}
-#export_data li a.rss {
-background-image:url(../../base/images/icons/icon_rss.png);
-}
-#export_data li a.atom {
-background-image:url(../../base/images/icons/icon_atom.png);
-}
-#export_data li a.foaf {
-background-image:url(../../base/images/icons/icon_foaf.gif);
-}
-
-.entity_edit a,
-.entity_send-a-message a,
-.form_user_nudge input.submit,
-.form_user_block input.submit,
-.form_user_unblock input.submit,
-.entity_nudge p {
-background-position: 0 40%;
-background-repeat: no-repeat;
-background-color:transparent;
-}
-.form_group_join input.submit,
-.form_group_leave input.submit
-.form_user_subscribe input.submit,
-.form_user_unsubscribe input.submit {
-background-color:#9BB43E;
-color:#fff;
-}
-.form_user_unsubscribe input.submit,
-.form_group_leave input.submit,
-.form_user_authorization input.reject {
-background-color:#87B4C8;
-}
-
-.entity_edit a {
-background-image:url(../../base/images/icons/twotone/green/edit.gif);
-}
-.entity_send-a-message a {
-background-image:url(../../base/images/icons/twotone/green/quote.gif);
-}
-.entity_nudge p,
-.form_user_nudge input.submit {
-background-image:url(../../base/images/icons/twotone/green/mail.gif);
-}
-.form_user_block input.submit,
-.form_user_unblock input.submit {
-background-image:url(../../base/images/icons/twotone/green/shield.gif);
-}
-
-/* NOTICES */
-.notices li.over {
-background-color:#fcfcfc;
-}
-
-.notice-options .notice_reply a,
-.notice-options form input.submit {
-background-color:transparent;
-}
-.notice-options .notice_reply a {
-background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%;
-}
-.notice-options form.form_favor input.submit {
-background:transparent url(../../base/images/icons/twotone/green/favourite.gif) no-repeat 0 45%;
-}
-.notice-options form.form_disfavor input.submit {
-background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%;
-}
-.notice-options .notice_delete a {
-background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%;
-}
-
-.notices div.entry-content,
-.notices div.notice-options {
-opacity:0.4;
-}
-.notices li.hover div.entry-content,
-.notices li.hover div.notice-options {
-opacity:1;
-}
-div.entry-content {
-color:#333;
-}
-div.notice-options a,
-div.notice-options input {
-font-family:sans-serif;
-}
-.notices li.hover {
-/*background-color:#fcfcfc;*/
-}
-/*END: NOTICES */
-
-#new_group a {
-background:transparent url(../../base/images/icons/twotone/green/news.gif) no-repeat 0 45%;
-}
-
-.pagination .nav_prev a,
-.pagination .nav_next a {
-background-repeat:no-repeat;
-border-color:#CEE1E9;
-}
-.pagination .nav_prev a {
-background-image:url(../../base/images/icons/twotone/green/arrow-left.gif);
-background-position:10% 45%;
-}
-.pagination .nav_next a {
-background-image:url(../../base/images/icons/twotone/green/arrow-right.gif);
-background-position:90% 45%;
-}
diff --git a/theme/otalk/css/ie.css b/theme/otalk/css/ie.css
deleted file mode 100644 (file)
index 2f463bb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/* IE specific styles */
-
-.notice-options input.submit {
-color:#fff;
-}
-
-#site_nav_local_views a {
-background-color:#D0DFE7;
-}
diff --git a/theme/otalk/default-avatar-mini.png b/theme/otalk/default-avatar-mini.png
deleted file mode 100644 (file)
index 38b8692..0000000
Binary files a/theme/otalk/default-avatar-mini.png and /dev/null differ
diff --git a/theme/otalk/default-avatar-profile.png b/theme/otalk/default-avatar-profile.png
deleted file mode 100644 (file)
index f8357d4..0000000
Binary files a/theme/otalk/default-avatar-profile.png and /dev/null differ
diff --git a/theme/otalk/default-avatar-stream.png b/theme/otalk/default-avatar-stream.png
deleted file mode 100644 (file)
index 6b63baa..0000000
Binary files a/theme/otalk/default-avatar-stream.png and /dev/null differ
diff --git a/theme/otalk/images/illustrations/illu_arrow-left-01.gif b/theme/otalk/images/illustrations/illu_arrow-left-01.gif
deleted file mode 100644 (file)
index 1977759..0000000
Binary files a/theme/otalk/images/illustrations/illu_arrow-left-01.gif and /dev/null differ
diff --git a/theme/otalk/images/illustrations/illu_pattern-01.png b/theme/otalk/images/illustrations/illu_pattern-01.png
deleted file mode 100644 (file)
index 5a72eaf..0000000
Binary files a/theme/otalk/images/illustrations/illu_pattern-01.png and /dev/null differ
diff --git a/theme/otalk/logo.png b/theme/otalk/logo.png
deleted file mode 100644 (file)
index fdead6c..0000000
Binary files a/theme/otalk/logo.png and /dev/null differ
index 4b30710fb636b86163a998e8d1692860cdc27068..2814260bd3c9990fb002a3900c635f8e091f85e8 100644 (file)
@@ -232,6 +232,17 @@ font-weight:bold;
 address img + .fn {
 display:none;
 }
+address a {
+text-decoration:none;
+}
+address .poweredby {
+float:left;
+clear:left;
+display:block;
+position:relative;
+top:7px;
+margin-right:-47px;
+}
 
 #header {
 width:98.5%;
@@ -486,13 +497,59 @@ margin-bottom:7px;
 margin-left:18px;
 float:left;
 }
-#form_notice .error {
+.form_notice .error,
+.form_notice .success {
 float:left;
 clear:both;
-width:96.9%;
+width:81.5%;
 margin-bottom:0;
 line-height:1.618;
 }
+.form_notice #notice_data-attach_selected code {
+float:left;
+width:80%;
+display:block;
+overflow:auto;
+margin-right:2.5%;
+font-size:1.1em;
+}
+.form_notice #notice_data-attach_selected button.close {
+float:right;
+font-size:0.8em;
+}
+
+.form_notice #notice_data-geo_wrap label,
+.form_notice #notice_data-geo_wrap input {
+position:absolute;
+top:25px;
+right:4px;
+left:auto;
+cursor:pointer;
+width:16px;
+height:16px;
+display:block;
+}
+.form_notice #notice_data-geo_wrap input {
+visibility:hidden;
+}
+.form_notice #notice_data-geo_wrap label {
+font-weight:normal;
+font-size:1em;
+margin-bottom:0;
+text-indent:-9999px;
+}
+
+button.close,
+button.minimize {
+width:16px;
+height:16px;
+text-indent:-9999px;
+padding:0;
+border:0;
+text-align:center;
+font-weight:bold;
+cursor:pointer;
+}
 
 /* entity_profile */
 .entity_profile {
@@ -850,6 +907,67 @@ font-size:1.025em;
 .notice div.entry-content .timestamp {
 display:inline-block;
 }
+.entry-content .repeat {
+display:block;
+}
+.entry-content .repeat .photo {
+float:none;
+margin-right:1px;
+position:relative;
+top:4px;
+left:0;
+}
+
+.dialogbox {
+position:absolute;
+top:-1px;
+right:-1px;
+z-index:9;
+float:none;
+padding:11px;
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+border-style:solid;
+border-width:1px;
+}
+
+.dialogbox legend {
+display:block !important;
+margin-right:18px;
+margin-bottom:18px;
+}
+
+.dialogbox button.close {
+position:absolute;
+right:3px;
+top:3px;
+}
+
+.dialogbox .form_guide {
+font-weight:normal;
+padding:0;
+}
+
+.dialogbox .submit_dialogbox {
+font-weight:bold;
+text-indent:0;
+min-width:46px;
+}
+.dialogbox input {
+padding-left:4px;
+}
+.dialogbox fieldset {
+margin-bottom:0;
+}
+
+#wrap form.processing input.submit,
+.entity_actions a.processing,
+.dialogbox.processing .submit_dialogbox {
+cursor:wait;
+outline:none;
+text-indent:-9999px;
+}
 
 .notice-options {
 position:relative;
index 2b917418252bb34cfc02835648732ea7bbe25186..dfeb01b48a952c12771a798444ada6c970a348e6 100644 (file)
@@ -60,6 +60,36 @@ input.submit,
 color:#FFFFFF;
 }
 
+.dialogbox .submit_dialogbox,
+input.submit,
+.form_notice input.submit {
+background:#AAAAAA url(../../base/images/illustrations/illu_pattern-01.png) 0 0 repeat-x;
+text-shadow:0 1px 0 #FFFFFF;
+color:#000000;
+border-color:#AAAAAA;
+border-top-color:#CCCCCC;
+border-left-color:#CCCCCC;
+}
+.dialogbox .submit_dialogbox:hover,
+input.submit:hover {
+background-position:0 -5px;
+}
+.dialogbox .submit_dialogbox:focus,
+input.submit:focus {
+background-position:0 -15px;
+box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
+-moz-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
+-webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
+text-shadow:none;
+}
+
+.form_notice label[for=notice_data-geo] {
+background-position:0 -1780px;
+}
+.form_notice label[for=notice_data-geo].checked {
+background-position:0 -1846px;
+}
+
 a,
 div.notice-options input,
 .form_user_block input.submit,
@@ -158,16 +188,69 @@ color:#333333;
 color:#000000;
 }
 #form_notice label[for=notice_data-attach] {
-background:transparent url(../../base/images/icons/twotone/green/clip-01.gif) no-repeat 0 45%;
+background-position:0 -328px;
 }
 #form_notice #notice_data-attach {
 opacity:0;
 }
 
-#form_notice.processing #notice_action-submit {
+.form_notice label[for=notice_data-attach],
+#export_data li a.rss,
+#export_data li a.atom,
+#export_data li a.foaf,
+.entity_edit a,
+.entity_send-a-message a,
+.entity_nudge p,
+.form_user_nudge input.submit,
+.form_user_block input.submit,
+.form_user_unblock input.submit,
+.form_group_block input.submit,
+.form_group_unblock input.submit,
+.form_make_admin input.submit,
+.notice .attachment,
+.notice-options .notice_reply,
+.notice-options form.form_favor input.submit,
+.notice-options form.form_disfavor input.submit,
+.notice-options .notice_delete,
+.notice-options form.form_repeat input.submit,
+#new_group a,
+.pagination .nav_prev a,
+.pagination .nav_next a,
+button.close,
+.form_group_leave input.submit,
+.form_user_unsubscribe input.submit,
+.form_group_join input.submit,
+.form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
+.entity_subscribe a,
+.entity_moderation p,
+.entity_sandbox input.submit,
+.entity_silence input.submit,
+.entity_delete input.submit,
+.notice-options .repeated,
+.form_notice label[for=notice_data-geo],
+button.minimize,
+.form_reset_key input.submit,
+.entity_clear input.submit,
+.entity_flag input.submit,
+.entity_flag p,
+.entity_subscribe input.submit,
+#realtime_play,
+#realtime_pause,
+#realtime_popup {
+background-image:url(../../base/images/icons/icons-01.gif);
+background-repeat:no-repeat;
+background-color:transparent;
+}
+
+
+#wrap form.processing input.submit,
+.entity_actions a.processing,
+.dialogbox.processing .submit_dialogbox {
 background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%;
-cursor:wait;
-text-indent:-9999px;
+}
+.notice-options .form_repeat.processing {
+background-image:none;
 }
 
 #content,
@@ -190,6 +273,12 @@ color:#8F0000;
 text-shadow: rgba(194,194,194,0.5) 1px 1px 1px;
 }
 
+.processing {
+background-image:url(../../base/images/icons/icon_processing.gif);
+background-repeat:no-repeat;
+background-position:47% 47%;
+}
+
 .error {
 background-color:#F7E8E8;
 }
@@ -197,6 +286,14 @@ background-color:#F7E8E8;
 background-color:#EFF3DC;
 }
 
+button.close {
+background-position:0 -1120px;
+}
+button.minimize {
+background-position:0 -1912px;
+}
+
+
 #anon_notice {
 color:#000000;
 }
@@ -207,81 +304,138 @@ background-repeat:no-repeat;
 background-position:0 45%;
 }
 #export_data li a.rss {
-background-image:url(../../base/images/icons/icon_rss.png);
+background-position:0 -130px;
 }
 #export_data li a.atom {
-background-image:url(../../base/images/icons/icon_atom.png);
+background-position:0 -64px;
 }
 #export_data li a.foaf {
-background-image:url(../../base/images/icons/icon_foaf.gif);
+background-position:0 1px;
 }
 
-.entity_edit a,
-.entity_send-a-message a,
-.form_user_nudge input.submit,
-.form_user_block input.submit,
-.form_user_unblock input.submit,
-.form_group_block input.submit,
-.form_group_unblock input.submit,
-.entity_nudge p,
-.form_make_admin input.submit {
-background-position: 0 40%;
-background-repeat: no-repeat;
-background-color:transparent;
+#export_data li a.rss {
+background-position:0 -130px;
+}
+#export_data li a.atom {
+background-position:0 -64px;
 }
+#export_data li a.foaf {
+background-position:0 1px;
+}
+
 .form_group_join input.submit,
-.form_group_leave input.submit
+.form_group_leave input.submit,
 .form_user_subscribe input.submit,
-.form_user_unsubscribe input.submit {
+.form_user_unsubscribe input.submit,
+.form_remote_authorize input.submit,
+.entity_subscribe a {
 background-color:#8F0000;
 color:#FFFFFF;
 }
-.form_user_unsubscribe input.submit,
 .form_group_leave input.submit,
-.form_user_authorization input.reject {
+.form_user_unsubscribe input.submit {
+background-position:5px -1246px;
 background-color:#87B4C8;
 }
+.form_group_join input.submit,
+.form_user_subscribe input.submit,
+.form_remote_authorize input.submit,
+.entity_subscribe a {
+background-position:5px -1181px;
+}
 
 .entity_edit a {
-background-image:url(../../base/images/icons/twotone/green/edit.gif);
+background-position: 5px -719px;
 }
 .entity_send-a-message a {
-background-image:url(../../base/images/icons/twotone/green/quote.gif);
+background-position: 5px -852px;
 }
+.entity_send-a-message .form_notice,
+.entity_moderation:hover ul,
+.dialogbox {
+box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7);
+-moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7);
+-webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7);
+}
+
 .entity_nudge p,
 .form_user_nudge input.submit {
-background-image:url(../../base/images/icons/twotone/green/mail.gif);
+background-position: 5px -785px;
 }
 .form_user_block input.submit,
 .form_user_unblock input.submit,
 .form_group_block input.submit,
 .form_group_unblock input.submit {
-background-image:url(../../base/images/icons/twotone/green/shield.gif);
+background-position: 5px -918px;
 }
 .form_make_admin input.submit {
-background-image:url(../../base/images/icons/twotone/green/admin.gif);
+background-position: 5px -983px;
+}
+.entity_moderation p {
+background-position: 5px -1313px;
+}
+.entity_sandbox input.submit {
+background-position: 5px -1380px;
+}
+.entity_silence input.submit {
+background-position: 5px -1445px;
+}
+.entity_delete input.submit {
+background-position: 5px -1511px;
+}
+.form_reset_key input.submit {
+background-position: 5px -1973px;
+}
+.entity_clear input.submit {
+background-position: 5px -2039px;
+}
+.entity_flag input.submit,
+.entity_flag p {
+background-position: 5px -2105px;
+}
+.entity_subscribe input.accept {
+background-position: 5px -2171px;
+}
+.entity_subscribe input.reject {
+background-position: 5px -2237px;
+}
+#realtime_play {
+background-position: 0 -2308px;
+}
+#realtime_pause {
+background-position: 0 -2374px;
+}
+#realtime_popup {
+background-position: 0 -1714px;
 }
 
 /* NOTICES */
 .notice .attachment {
-background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no-repeat 0 45%;
+background-position:0 -394px;
 }
 #attachments .attachment {
 background:none;
 }
 .notice-options .notice_reply {
-background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%;
+background-position:0 -592px;
 }
 .notice-options form.form_favor input.submit {
-background:transparent url(../../base/images/icons/twotone/green/favourite.gif) no-repeat 0 45%;
+background-position:0 -460px;
 }
 .notice-options form.form_disfavor input.submit {
-background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%;
+background-position:0 -526px;
 }
 .notice-options .notice_delete {
-background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%;
+background-position:0 -658px;
+}
+.notice-options form.form_repeat input.submit {
+background-position:0 -1582px;
+}
+.notice-options .repeated {
+background-position:0 -1648px;
 }
 
+
 .notices div.entry-content,
 .notices div.notice-options {
 opacity:0.4;
@@ -319,19 +473,26 @@ background-color:rgba(200, 200, 200, 0.300);
 /*END: NOTICES */
 
 #new_group a {
-background:transparent url(../../base/images/icons/twotone/green/news.gif) no-repeat 0 45%;
+background-position:0 -1054px;
 }
 
-.pagination .nav_prev a,
-.pagination .nav_next a {
-background-repeat:no-repeat;
-border-color:#000000;
-}
 .pagination .nav_prev a {
-background-image:url(../../base/images/icons/twotone/green/arrow-left.gif);
-background-position:10% 45%;
+background-position:10% -187px;
 }
 .pagination .nav_next a {
-background-image:url(../../base/images/icons/twotone/green/arrow-right.gif);
-background-position:90% 45%;
+background-position:105% -252px;
+}
+.pagination .nav .processing {
+background-image:url(../../base/images/icons/icon_processing.gif);
+box-shadow:none;
+-moz-box-shadow:none;
+-webkit-box-shadow:none;
+outline:none;
+}
+.pagination .nav_next a.processing {
+background-position:90% 47%;
 }
+.pagination .nav_prev a.processing {
+background-position:10% 47%;
+}
+
index 550d373fef4005342c4e1daa7cb2c115db54f46c..cf1839194a6d8e91d3ec988abe7d5be227143d28 100644 (file)
Binary files a/theme/pigeonthoughts/logo.png and b/theme/pigeonthoughts/logo.png differ