]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' into 1.0.x
authorCraig Andrews <candrews@integralblue.com>
Thu, 25 Feb 2010 01:52:45 +0000 (20:52 -0500)
committerCraig Andrews <candrews@integralblue.com>
Thu, 25 Feb 2010 01:52:45 +0000 (20:52 -0500)
Conflicts:
EVENTS.txt
db/statusnet.sql
lib/queuemanager.php

191 files changed:
EVENTS.txt
actions/apidirectmessage.php
actions/apifriendshipsdestroy.php
actions/apigrouplist.php
actions/apigrouplistall.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/doc.php
actions/favor.php
actions/profilesettings.php
actions/subscribe.php
actions/subscriptions.php
actions/sup.php
actions/twitapisearchatom.php
classes/Conversation.php [new file with mode: 0755]
classes/Fave.php
classes/Memcached_DataObject.php
classes/Notice.php
classes/Profile.php
classes/Subscription.php
classes/User.php
classes/User_group.php
classes/statusnet.ini
db/statusnet.sql
js/jquery.form.js
js/util.js
lib/action.php
lib/activity.php [new file with mode: 0644]
lib/api.php
lib/atom10entry.php
lib/atom10feed.php
lib/atomnoticefeed.php
lib/atomusernoticefeed.php
lib/command.php
lib/commandinterpreter.php
lib/common.php
lib/default.php
lib/distribqueuehandler.php
lib/htmloutputter.php
lib/iomaster.php
lib/noticelist.php
lib/omb.php
lib/profilequeuehandler.php [new file with mode: 0644]
lib/queuemanager.php
lib/stompqueuemanager.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/Autocomplete/jquery-autocomplete/indicator.gif [new file with mode: 0644]
plugins/Comet/CometPlugin.php
plugins/Facebook/FacebookPlugin.php
plugins/Facebook/facebookaction.php
plugins/Minify/MinifyPlugin.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/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
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/xml-feed-parser-bug-16416.patch [deleted file]
plugins/OStatus/js/ostatus.js
plugins/OStatus/lib/activity.php [deleted file]
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
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/Orbited/OrbitedPlugin.php
plugins/PostDebug/PostDebugPlugin.php [new file with mode: 0644]
plugins/Realtime/RealtimePlugin.php
plugins/Sample/hello.php
plugins/Sample/locale/Sample.po [new file with mode: 0644]
plugins/TwitterBridge/twitter.php
plugins/TwitterBridge/twitterauthorization.php
plugins/Xmpp/XmppPlugin.php
scripts/queuedaemon.php
scripts/update_po_templates.php
tests/ActivityParseTests.php [new file with mode: 0644]
tests/TagURITest.php [new file with mode: 0644]
theme/base/css/display.css
theme/default/css/display.css
theme/identica/css/display.css

index b4b9d8c4b86532ee43425ad21979bdfec46b2123..cf1e39ec836210a1bf52820c4f999512b4dee908 100644 (file)
@@ -1,4 +1,4 @@
-\InitializePlugin: a chance to initialize a plugin in a complete environment
+InitializePlugin: a chance to initialize a plugin in a complete environment
 
 CleanupPlugin: a chance to cleanup a plugin at the end of a program
 
@@ -739,3 +739,51 @@ StartRobotsTxt: Before outputting the robots.txt page
 
 EndRobotsTxt: After the default robots.txt page (good place for customization)
 - &$action: RobotstxtAction being shown
+
+StartGetProfileUri: When determining the canonical URI for a given profile
+- $profile: the current profile
+- &$uri: the URI
+
+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
index 5fbc46518b2f5ec884d2bad3b81c01a52ac25a15..5355acf8253805796cfa5411a857b8a5947d2310 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')) {
 
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 66b67a030e0899bf3aceb60e6ae568d748d6af59..605b3823261338bcf750b5c1a74ad9c5fae28983 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',
index 1921c1f193f3396e4c5d42c2007515487b649280..d2ef2978aa5427cf1e0ec5dfb6b65b8332e48e2e 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);
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..2db76857e3c7615d43647f24ad27f7867a33fcd8 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(
index 3c74e36b566ec0c964d16c7a1d5127a0bc6a71cf..0bb4860ea7f6009ac185d711e2cbf327d6410523 100644 (file)
@@ -107,7 +107,7 @@ 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');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:GroupTimeline:" . $this->group->id;
 
         $subtitle   = sprintf(
@@ -176,7 +176,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(
index ae41680702fd6484349eba4ff178edd589abdc1d..0c72f4020c47d77229bb798752bb482dbaac25c3 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(
index d2e31d0bdd095fe40e592b98647dd14ee50a5689..a39c63346abfa2dc990c8a2c806fed835c1924b7 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',
index c1fa72a3ee372f72e944931f86c6480bff17aabc..1ff0fd26172892defc5d48c047fe9da50ffb4423 100644 (file)
@@ -109,7 +109,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 24752e45fddf8a709c2ac62f1ee1982290e0ea3c..3e849cc786c56b69c77b67c5ae6eee3685cdbd8b 100644 (file)
@@ -116,7 +116,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 
         $sitename   = common_config('site', 'name');
         $title      = sprintf(_("%s timeline"), $this->user->nickname);
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $id         = "tag:$taguribase:UserTimeline:" . $this->user->id;
         $link       = common_local_url(
             'showstream',
@@ -196,7 +196,8 @@ class ApiTimelineUserAction extends ApiBareAuthAction
 
             $atom->addEntryFromNotices($this->notices);
 
-            $this->raw($atom->getString());
+            #$this->raw($atom->getString());
+            print $atom->getString(); // temporary for output buffering
 
             break;
         case 'json':
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 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 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 a90d7facdfaca15e60c16d03c376833af228d448..3745311b6621998b9b4610e0f12fe377304a5126 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->getProfile());
             $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 baed2a0c7c24107cb15731489fc312974ea267c6..e389ddec84f43b2bf44428d7bbf99314e19eed6c 100644 (file)
@@ -245,7 +245,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 +329,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));
diff --git a/classes/Conversation.php b/classes/Conversation.php
new file mode 100755 (executable)
index 0000000..ea8bd87
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Data class for Conversations
+ *
+ * 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  Data
+ * @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/
+ */
+
+require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+
+class Conversation extends Memcached_DataObject
+{
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'conversation';                    // table name
+    public $id;                              // int(4)  primary_key not_null
+    public $uri;                             // varchar(225)  unique_key
+    public $created;                         // datetime   not_null
+    public $modified;                        // timestamp   not_null default_CURRENT_TIMESTAMP
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('conversation',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    /**
+     * Factory method for creating a new conversation
+     *
+     * @return Conversation the new conversation DO
+     */
+    static function create()
+    {
+        $conv = new Conversation();
+        $conv->created = common_sql_now();
+        $id = $conv->insert();
+
+        if (empty($id)) {
+            common_log_db_error($conv, 'INSERT', __FILE__);
+            return null;
+        }
+
+        $orig = clone($conv);
+        $orig->uri = common_local_url('conversation', array('id' => $id));
+        $result = $orig->update($conv);
+
+        if (empty($result)) {
+            common_log_db_error($conv, 'UPDATE', __FILE__);
+            return null;
+        }
+
+        return $conv;
+    }
+
+}
+
index 8113c8e1668a508251323f117468da25d119f7f6..0b6eec2bc40af2e2742332fcc1dae6883521e218 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);
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 73b22d58a030cea41a8afbd67121e755f26954ad..e8d5c45cb2f2dae58887a9c10907300ae4306d20 100644 (file)
@@ -187,13 +187,21 @@ 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
+     * @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 +264,16 @@ class Notice extends Memcached_DataObject
         }
 
         $notice->content = $final;
-        $notice->rendered = common_render_content($final, $notice);
+
+        if (!empty($rendered)) {
+            $notice->rendered = $rendered;
+        } else {
+            $notice->rendered = common_render_content($final, $notice);
+        }
+
         $notice->source = $source;
         $notice->uri = $uri;
+        $notice->url = $url;
 
         // Handle repeat case
 
@@ -309,7 +324,8 @@ class Notice extends Memcached_DataObject
             // the beginning of a new conversation.
 
             if (empty($notice->conversation)) {
-                $notice->conversation = $notice->id;
+                $conv = Conversation::create();
+                $notice->conversation = $conv->id;
                 $changed = true;
             }
 
@@ -324,21 +340,35 @@ 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();
 
+        if (isset($replies)) {
+            $notice->saveKnownReplies($replies);
+        } else {
+            $notice->saveReplies();
+        }
+
+        if (isset($groups)) {
+            $notice->saveKnownGroups($groups);
+        } else {
+            $notice->saveGroups();
+        }
+
         $notice->distribute();
 
         return $notice;
     }
 
-    function blowOnInsert()
+    function blowOnInsert($conversation = false)
     {
         self::blow('profile:notice_ids:%d', $this->profile_id);
         self::blow('public');
 
-        if ($this->conversation != $this->id) {
-            self::blow('notice:conversation_ids:%d', $this->conversation);
-        }
+        // XXX: Before we were blowing the casche only if the notice id
+        // was not the root of the conversation.  What to do now?
+
+        self::blow('notice:conversation_ids:%d', $this->conversation);
 
         if (!empty($this->repeat_of)) {
             self::blow('notice:repeats:%d', $this->repeat_of);
@@ -675,11 +705,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;
     }
@@ -712,6 +770,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()
@@ -795,8 +889,49 @@ 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();
+            }
+        }
+
+        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
@@ -805,76 +940,44 @@ 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);
-
-        $names = array();
-
-        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->profile_id, $this->content);
+
         $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;
                 }
             }
         }
@@ -915,9 +1018,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()
     {
@@ -940,7 +1044,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;
+                }
             }
         }
 
@@ -960,6 +1067,7 @@ 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:poco' => 'http://portablecontacts.net/spec/1.0',
                            'xmlns:ostatus' => 'http://ostatus.org/schema/1.0');
         } else {
             $attrs = array();
@@ -997,6 +1105,7 @@ class Notice extends Memcached_DataObject
         $xs->raw($profile->asActivityActor());
 
         $xs->element('link', array('rel' => 'alternate',
+                                   'type' => 'text/html',
                                    'href' => $this->bestUrl()));
 
         $xs->element('id', null, $this->uri);
@@ -1015,33 +1124,45 @@ class Notice extends Memcached_DataObject
             }
         }
 
-        if (!empty($this->conversation)
-            && $this->conversation != $this->id) {
-            $xs->element(
-                'link', array(
-                    'rel' => 'ostatus:conversation',
-                    'href' => common_local_url(
-                        'conversation',
-                        array('id' => $this->conversation)
-                        )
+        if (!empty($this->conversation)) {
+
+            $conv = Conversation::staticGet('id', $this->conversation);
+
+            if (!empty($conv)) {
+                $xs->element(
+                    'link', array(
+                        'rel' => 'ostatus:conversation',
+                        'href' => $conv->uri
                     )
                 );
+            }
         }
 
         $reply_ids = $this->getReplies();
 
         foreach ($reply_ids as $id) {
             $profile = Profile::staticGet('id', $id);
-            if (!empty($profile)) {
+           if (!empty($profile)) {
                 $xs->element(
                     'link', array(
                         'rel' => 'ostatus:attention',
-                        'href' => $profile->getAcctUri()
+                        'href' => $profile->getUri()
                     )
                 );
             }
         }
 
+        $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)) {
@@ -1087,6 +1208,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)) {
@@ -1484,6 +1620,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 ab05bb8546bfe83d22ce66ce6164e509d32b6bc4..78223b34a1956d0e16901e949810cbc3c367f6ba 100644 (file)
@@ -769,7 +769,7 @@ class Profile extends Memcached_DataObject
 
         $xs->elementStart('author');
         $xs->element('name', null, $this->nickname);
-        $xs->element('uri', null, $this->profileurl);
+        $xs->element('uri', null, $this->getUri());
         $xs->elementEnd('author');
 
         return $xs->getString();
@@ -792,51 +792,59 @@ 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);
+        $noun = ActivityObject::fromProfile($this);
+        return $noun->asString('activity:' . $element);
+    }
 
-        $xs->elementStart('activity:' . $element);
-        $xs->element(
-            'activity:object-type',
-            null,
-            'http://activitystrea.ms/schema/1.0/person'
-        );
-        $xs->element(
-            'id',
-            null,
-            common_local_url(
-                'userbyid',
-                array('id' => $this->id)
-                )
-            );
-        $xs->element('title', null, $this->getBestName());
-
-        $avatar = $this->getAvatar(AVATAR_PROFILE_SIZE);
-
-        $xs->element(
-            'link', array(
-                'type' => empty($avatar) ? 'image/png' : $avatar->mediatype,
-                'href' => empty($avatar)
-                ? Avatar::defaultImage(AVATAR_PROFILE_SIZE)
-                : $avatar->displayUrl()
-            ),
-            ''
-        );
-
-        $xs->elementEnd('activity:' . $element);
+    /**
+     * Returns the best URI for a profile. Plugins may override.
+     *
+     * @return string $uri
+     */
+    function getUri()
+    {
+        $uri = null;
 
-        return $xs->getString();
+        // 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));
+        }
+
+        return $uri;
     }
 
-    function getAcctUri()
+    function hasBlocked($other)
     {
-        return $this->nickname . '@' . common_config('site', 'server');
-    }
+        $block = Profile_block::get($this->id, $other->id);
 
+        if (empty($block)) {
+            $result = false;
+        } else {
+            $result = true;
+        }
+
+        return $result;
+    }
 }
index faf1331cda11565eec0655ea4a266079ceca0618..d6fb3fcbdda82f17d70dcce6692868dfed6f1840 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,155 @@ 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));
+
+            $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 1c967b527b100b577d3cd6ea22e962a22295bc16..0f84ed8133ba580a1ea0f19b794cb2f6cdab1247 100644 (file)
@@ -75,11 +75,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.
@@ -162,17 +158,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);
     }
 
     /**
index 379e6b7219fb6d84eed97b069d3e6c410c12ba36..1382aa407c7f74eb585ba7a98a6a88d755cfdce0 100644 (file)
@@ -39,14 +39,24 @@ 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))) {
+            $url = common_local_url('showgroup',
+                                    array('nickname' => $this->nickname));
+        }
+        Event::handle('EndUserGroupHomeUrl', array($this, &$url));
+        return $url;
     }
 
     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)
index bcff744bdffd133f1439a7a69bc15d324a6b82d5..d116b16a3882cfd12c9256e59608e01fd0ea5937 100644 (file)
@@ -47,6 +47,16 @@ modified = 384
 [consumer__keys]
 consumer_key = K
 
+[conversation]
+id = 129
+uri = 2
+created = 142
+modified = 384
+
+[conversation__keys]
+id = N
+uri = U
+
 [deleted_notice]
 id = 129
 profile_id = 129
index 0cf0572565fb7318f427d299d25bafee479a6223..d6f0f54a2d690c5fa6ec9ff84bbceebde883c877 100644 (file)
@@ -643,3 +643,10 @@ create table user_im_prefs (
     constraint primary key (user_id, transport),
     constraint unique key `transport_screenname_key` ( `transport` , `screenname` )
 );
+
+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;
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 3623337b9f65725acbcf16f6ce33e420350de5b5..4b6c39a1dc42d613b65e83eb0bdaaa1719406035 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'
         }
     },
 
@@ -670,6 +671,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 +737,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 +765,8 @@ $(document).ready(function(){
     if ($('#content .entity_actions').length > 0) {
         SN.Init.EntityActions();
     }
+    if ($('#form_login').length > 0) {
+        SN.Init.Login();
+    }
 });
 
index b85f353a3d14087a460e8a492d4d0504183ab87e..fa9ddb9110393ed5fede1512c94d6dc142dfeb6c 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));
             }
diff --git a/lib/activity.php b/lib/activity.php
new file mode 100644 (file)
index 0000000..25727bf
--- /dev/null
@@ -0,0 +1,993 @@
+<?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
+            );
+
+            array_push($urls, new PoCoURL($type, $value, $primary));
+        }
+        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 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;
+    }
+
+    /**
+     * 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."));
+            }
+        }
+    }
+}
+
+/**
+ * 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 $avatar;
+    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;
+
+        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;
+
+            // @fixme we may have multiple avatars with different resolutions specified
+            $this->avatar = ActivityUtils::getLink($element, 'avatar');
+
+            $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;
+        $object->avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+        if (isset($profile->lat) && isset($profile->lon)) {
+            $object->geopoint = (float)$profile->lat . ' ' . (float)$profile->lon;
+        }
+
+        $object->poco = PoCo::fromProfile($profile);
+
+        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) {
+            $xs->element(
+                'link', array(
+                    'type' => empty($this->avatar) ? 'image/png' : $this->avatar->mediatype,
+                    'rel'  => 'avatar',
+                    'href' => empty($this->avatar)
+                    ? Avatar::defaultImage(AVATAR_PROFILE_SIZE)
+                    : $this->avatar->displayUrl()
+                ),
+                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;
+            $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 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
+
+    /**
+     * 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);
+    }
+
+    /**
+     * 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');
+        } 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'));
+        }
+
+        $xs->elementEnd('entry');
+
+        return $xs->getString();
+    }
+
+    private function _child($element, $tag, $namespace=self::SPEC)
+    {
+        return ActivityUtils::child($element, $tag, $namespace);
+    }
+}
\ No newline at end of file
index 9000fb4ba9dc81bd1f93f58cbc23204d6998f146..26977c90fa2c75d1dee68e90d1ddaf537d8355a4 100644 (file)
@@ -359,7 +359,7 @@ class ApiAction extends Action
         $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
         $entry['published'] = common_date_iso8601($notice->created);
 
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
         $entry['id'] = "tag:$taguribase:$entry[link]";
 
         $entry['updated'] = $entry['published'];
@@ -803,7 +803,7 @@ class ApiAction extends Action
         $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
         $entry['published'] = common_date_iso8601($message->created);
 
-        $taguribase = common_config('integration', 'taguri');
+        $taguribase = TagURI::base();
 
         $entry['id'] = "tag:$taguribase:$entry[link]";
         $entry['updated'] = $entry['published'];
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..d2bf2a416f3bb26be64e0857b2ae43970239d7cc 100644 (file)
@@ -50,23 +50,28 @@ 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(
+            '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 44b7b22743fff58b09872b5d1ba55484d0c68eb4..5be9cd6e85bdc161145a345796ba53d1084b1c3f 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..68723955ecc93289929d6d81330932a69f259c50 100644 (file)
@@ -123,6 +123,7 @@ require_once INSTALLDIR.'/lib/util.php';
 require_once INSTALLDIR.'/lib/action.php';
 require_once INSTALLDIR.'/lib/mail.php';
 require_once INSTALLDIR.'/lib/subs.php';
+require_once INSTALLDIR.'/lib/activity.php';
 
 require_once INSTALLDIR.'/lib/clientexception.php';
 require_once INSTALLDIR.'/lib/serverexception.php';
index a9be3438b163d1cded938dc38ddc3e1a3ab6cc7b..70e00ea75080db91bc32f6f0c90d7fabf5f09de9 100644 (file)
@@ -91,10 +91,13 @@ $default =
               'spawndelay' => 1, // Wait at least N seconds between (re)spawns of child processes to avoid slamming the queue server with subscription startup
               'debug_memory' => false, // true to spit memory usage to log
               'inboxes' => true, // true to do inbox distribution & output queueing from in background via 'distrib' queue
-              'breakout' => array('*' => 'shared'), // set global or per-handler queue breakout
-                                      // 'shared': use a shared queue for all sites
-                                      // 'handler': share each/this handler over multiple sites
-                                      // 'site': break out for each/this handler on this site
+              'breakout' => array(), // List queue specifiers to break out when using Stomp queue.
+                                     // Default will share all queues for all sites within each group.
+                                     // Specify as <group>/<queue> or <group>/<queue>/<site>,
+                                     // using nickname identifier as site.
+                                     //
+                                     // 'main/distrib' separate "distrib" queue covering all sites
+                                     // 'xmpp/xmppout/mysite' separate "xmppout" queue covering just 'mysite'
               'max_retries' => 10, // drop messages after N failed attempts to process (Stomp)
               'dead_letter_dir' => false, // set to directory to save dropped messages into (Stomp)
               ),
@@ -172,7 +175,7 @@ $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,
@@ -277,7 +280,6 @@ $default =
                                  'Mapstraction' => null,
                                  'Linkback' => null,
                                  'WikiHashtags' => null,
-                                 'PubSubHubBub' => null,
                                  'RSSCloud' => null,
                                  'OpenID' => null),
               ),
index 4477468d0a38d523c26163b3afcc987805bf3617..dc183fb36a415f901ca22c219b22a8b1d17b09a7 100644 (file)
@@ -69,19 +69,7 @@ class DistribQueueHandler
         }
 
         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);
+            $notice->addToInboxes();
         } catch (Exception $e) {
             $this->logit($notice, $e);
         }
@@ -107,7 +95,7 @@ class DistribQueueHandler
 
         return true;
     }
-    
+
     protected function logit($notice, $e)
     {
         common_log(LOG_ERR, "Distrib queue exception saving notice $notice->id: " .
index 47e56fc8f8ba6041c63821c3f534ed2ddaf072a1..7786b5941e25ba770d3f11c029f360af5b322f50 100644 (file)
@@ -356,40 +356,47 @@ class HTMLOutputter extends XMLOutputter
 
             if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
             {
-                $path = common_config('javascript', 'path');
+                if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
 
-                if (empty($path)) {
-                    $path = common_config('site', 'path') . '/js/';
-                }
+                    $src = common_path($src) . '?version=' . STATUSNET_VERSION;
 
-                if ($path[strlen($path)-1] != '/') {
-                    $path .= '/';
-                }
+                }else{
 
-                if ($path[0] != '/') {
-                    $path = '/'.$path;
-                }
+                    $path = common_config('javascript', 'path');
 
-                $server = common_config('javascript', 'server');
+                    if (empty($path)) {
+                        $path = common_config('site', 'path') . '/js/';
+                    }
 
-                if (empty($server)) {
-                    $server = common_config('site', 'server');
-                }
+                    if ($path[strlen($path)-1] != '/') {
+                        $path .= '/';
+                    }
 
-                $ssl = common_config('javascript', 'ssl');
+                    if ($path[0] != '/') {
+                        $path = '/'.$path;
+                    }
 
-                if (is_null($ssl)) { // null -> guess
-                    if (common_config('site', 'ssl') == 'always' &&
-                        !common_config('javascript', 'server')) {
-                        $ssl = true;
-                    } else {
-                        $ssl = false;
+                    $server = common_config('javascript', 'server');
+
+                    if (empty($server)) {
+                        $server = common_config('site', 'server');
                     }
-                }
 
-                $protocol = ($ssl) ? 'https' : 'http';
+                    $ssl = common_config('javascript', 'ssl');
+
+                    if (is_null($ssl)) { // null -> guess
+                        if (common_config('site', 'ssl') == 'always' &&
+                            !common_config('javascript', 'server')) {
+                            $ssl = true;
+                        } else {
+                            $ssl = false;
+                        }
+                    }
 
-                $src = $protocol.'://'.$server.$path.$src . '?version=' . STATUSNET_VERSION;
+                    $protocol = ($ssl) ? 'https' : 'http';
+
+                    $src = $protocol.'://'.$server.$path.$src . '?version=' . STATUSNET_VERSION;
+                }
             }
 
             $this->element('script', array('type' => $type,
@@ -439,7 +446,7 @@ class HTMLOutputter extends XMLOutputter
     {
         if(Event::handle('StartCssLinkElement', array($this,&$src,&$theme,&$media))) {
             $url = parse_url($src);
-            if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment))
+            if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
             {
                 if(file_exists(Theme::file($src,$theme))){
                    $src = Theme::path($src, $theme);
index 3745a5c7a9b6caede91ef727955820e0d8118159..7cfb2c9a0ff18c59039cfdae634c728ec9fc8282 100644 (file)
@@ -55,27 +55,18 @@ abstract class IoMaster
         if ($multiSite !== null) {
             $this->multiSite = $multiSite;
         }
-        if ($this->multiSite) {
-            $this->sites = StatusNet::findAllSites();
-        } else {
-            $this->sites = array(StatusNet::currentSite());
-        }
-
-        if (empty($this->sites)) {
-            throw new Exception("Empty status_network table, cannot init");
-        }
 
-        foreach ($this->sites as $site) {
-            StatusNet::switchSite($site);
-            $this->initManagers();
-        }
+        $this->initManagers();
     }
 
     /**
-     * Initialize IoManagers for the currently configured site
-     * which are appropriate to this instance.
+     * Initialize IoManagers which are appropriate to this instance;
+     * pass class names or instances into $this->instantiate().
+     *
+     * If setup and configuration may vary between sites in multi-site
+     * mode, it's the subclass's responsibility to set them up here.
      *
-     * Pass class names into $this->instantiate()
+     * Switching site configurations is an acceptable side effect.
      */
     abstract function initManagers();
 
index c05b990245f01acdce345b4866d94212367b9c46..28a563d875aff8c2e7ce621ba204ada667f9ee77 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');
     }
@@ -492,30 +493,34 @@ class NoticeListItem extends Widget
                 break;
              default:
 
-                $name = null;
+                $name = $source_name;
                 $url  = null;
 
-                $ns = Notice_source::staticGet($this->notice->source);
-
-                if ($ns) {
-                    $name = $ns->name;
-                    $url  = $ns->url;
-                } else {
-                    $app = Oauth_application::staticGet('name', $this->notice->source);
-                    if ($app) {
-                        $name = $app->name;
-                        $url  = $app->source_url;
+                if (Event::handle('StartNoticeSourceLink', array($this->notice, &$name, &$url, &$title))) {
+                    $ns = Notice_source::staticGet($this->notice->source);
+
+                    if ($ns) {
+                        $name = $ns->name;
+                        $url  = $ns->url;
+                    } else {
+                        $app = Oauth_application::staticGet('name', $this->notice->source);
+                        if ($app) {
+                            $name = $app->name;
+                            $url  = $app->source_url;
+                        }
                     }
                 }
+                Event::handle('EndNoticeSourceLink', array($this->notice, &$name, &$url, &$title));
 
                 if (!empty($name) && !empty($url)) {
                     $this->out->elementStart('span', 'device');
                     $this->out->element('a', array('href' => $url,
-                                                   'rel' => 'external'),
+                                                   'rel' => 'external',
+                                                   'title' => $title),
                                         $name);
                     $this->out->elementEnd('span');
                 } else {
-                    $this->out->element('span', 'device', $source_name);
+                    $this->out->element('span', 'device', $name);
                 }
                 break;
             }
index 0f38a49369fc34c8de680a0b5fe90236c65fe161..17132a594f6ec20ea2e079270d9a791895297f2a 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()
diff --git a/lib/profilequeuehandler.php b/lib/profilequeuehandler.php
new file mode 100644 (file)
index 0000000..e8a00ae
--- /dev/null
@@ -0,0 +1,48 @@
+<?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');
+            omb_broadcast_profile($profile);
+        }
+        Event::handle('EndBroadcastProfile', array($profile));
+        return true;
+    }
+
+}
index 576c7c0af83aab9f3e4201027e9ddb92fc0d576a..fe45e8bbff8079981b7064996b3afc06925101dc 100644 (file)
@@ -239,6 +239,9 @@ abstract class QueueManager extends IoManager
                 $this->connect('sms', 'SmsQueueHandler');
             }
 
+            // Broadcasting profile updates to OMB remote subscribers
+            $this->connect('profile', 'ProfileQueueHandler');
+
             // For compat with old plugins not registering their own handlers.
             $this->connect('plugin', 'PluginQueueHandler');
         }
index bfeeb23b7fc88e1b9a3d27a0a9f531e066036555..9af8b2f4826b24714f5f557af56d2a560681adcd 100644 (file)
@@ -63,7 +63,7 @@ class StompQueueManager extends QueueManager
         $this->password = common_config('queue', 'stomp_password');
         $this->base     = common_config('queue', 'queue_basename');
         $this->control  = common_config('queue', 'control_channel');
-        $this->subscriptions = array($this->control => $this->control);
+        $this->breakout = common_config('queue', 'breakout');
     }
 
     /**
@@ -75,28 +75,6 @@ class StompQueueManager extends QueueManager
         return IoManager::INSTANCE_PER_PROCESS;
     }
 
-    /**
-     * Record queue subscriptions we'll need to handle the current site.
-     */
-    public function addSite()
-    {
-        $this->sites[] = StatusNet::currentSite();
-
-        // Set up handlers active for this site...
-        $this->initialize();
-
-        foreach ($this->activeGroups as $group) {
-            if (isset($this->groups[$group])) {
-                // Actual queues may be broken out or consolidated...
-                // Subscribe to all the target queues we'll need.
-                foreach ($this->groups[$group] as $transport => $class) {
-                    $target = $this->queueName($transport);
-                    $this->subscriptions[$target] = $target;
-                }
-            }
-        }
-    }
-
     /**
      * Optional; ping any running queue handler daemons with a notification
      * such as announcing a new site to handle or requesting clean shutdown.
@@ -166,14 +144,15 @@ class StompQueueManager extends QueueManager
 
         $con = $this->cons[$idx];
         $host = $con->getServer();
-        $result = $con->send($this->queueName($queue), $msg, $props);
+        $target = $this->queueName($queue);
+        $result = $con->send($target, $msg, $props);
 
         if (!$result) {
-            $this->_log(LOG_ERR, "Error sending $rep to $queue queue on $host");
+            $this->_log(LOG_ERR, "Error sending $rep to $queue queue on $host $target");
             return false;
         }
 
-        $this->_log(LOG_DEBUG, "complete remote queueing $rep for $queue on $host");
+        $this->_log(LOG_DEBUG, "complete remote queueing $rep for $queue on $host $target");
         $this->stats('enqueued', $queue);
         return true;
     }
@@ -432,11 +411,42 @@ class StompQueueManager extends QueueManager
     protected function doSubscribe(LiberalStomp $con)
     {
         $host = $con->getServer();
-        foreach ($this->subscriptions as $queue) {
-            $this->_log(LOG_INFO, "Subscribing to $queue on $host");
-            $con->subscribe($queue);
+        foreach ($this->subscriptions() as $sub) {
+            $this->_log(LOG_INFO, "Subscribing to $sub on $host");
+            $con->subscribe($sub);
         }
     }
+    
+    /**
+     * Grab a full list of stomp-side queue subscriptions.
+     * Will include:
+     *  - control broadcast channel
+     *  - shared group queues for active groups
+     *  - per-handler and per-site breakouts from $config['queue']['breakout']
+     *    that are rooted in the active groups.
+     *
+     * @return array of strings
+     */
+    protected function subscriptions()
+    {
+        $subs = array();
+        $subs[] = $this->control;
+
+        foreach ($this->activeGroups as $group) {
+            $subs[] = $this->base . $group;
+        }
+
+        foreach ($this->breakout as $spec) {
+            $parts = explode('/', $spec);
+            if (count($parts) < 2 || count($parts) > 3) {
+                common_log(LOG_ERR, "Bad queue breakout specifier $spec");
+            }
+            if (in_array($parts[0], $this->activeGroups)) {
+                $subs[] = $this->base . $spec;
+            }
+        }
+        return array_unique($subs);
+    }
 
     /**
      * Handle and acknowledge an event that's come in through a queue.
@@ -612,32 +622,26 @@ class StompQueueManager extends QueueManager
     }
 
     /**
-     * Set us up with queue subscriptions for a new site added at runtime,
+     * (Re)load runtime configuration for a given site by nickname,
      * triggered by a broadcast to the 'statusnet-control' topic.
      *
+     * Configuration changes in database should update, but config
+     * files might not.
+     *
      * @param array $frame Stomp frame
      * @return bool true to continue; false to stop further processing.
      */
     protected function updateSiteConfig($nickname)
     {
-        if (empty($this->sites)) {
-            if ($nickname == common_config('site', 'nickname')) {
-                StatusNet::init(common_config('site', 'server'));
-            } else {
-                $this->_log(LOG_INFO, "Ignoring update ping for other site $nickname");
+        $sn = Status_network::staticGet($nickname);
+        if ($sn) {
+            $this->switchSite($nickname);
+            if (!in_array($nickname, $this->sites)) {
+                $this->addSite();
             }
+            $this->stats('siteupdate');
         } else {
-            $sn = Status_network::staticGet($nickname);
-            if ($sn) {
-                $this->switchSite($nickname);
-                if (!in_array($nickname, $this->sites)) {
-                    $this->addSite();
-                }
-                // @fixme update subscriptions, if applicable
-                $this->stats('siteupdate');
-            } else {
-                $this->_log(LOG_ERR, "Ignoring ping for unrecognized new site $nickname");
-            }
+            $this->_log(LOG_ERR, "Ignoring ping for unrecognized new site $nickname");
         }
     }
 
@@ -646,24 +650,25 @@ class StompQueueManager extends QueueManager
      * group name for this queue to give eg:
      *
      * /queue/statusnet/main
+     * /queue/statusnet/main/distrib
+     * /queue/statusnet/xmpp/xmppout/site01
      *
      * @param string $queue
      * @return string
      */
     protected function queueName($queue)
     {
-        $base = common_config('queue', 'queue_basename');
         $group = $this->queueGroup($queue);
-        $breakout = $this->breakoutMode($queue);
-        if ($breakout == 'shared') {
-            return $base . "$group";
-        } else if ($breakout == 'handler') {
-            return $base . "$group/$queue";
-        } else if ($breakout == 'site') {
-            $site = StatusNet::currentSite();
-            return $base . "$group/$queue/$site";
-        }
-        throw Exception("Unrecognized queue breakout mode '$breakout' for '$queue'");
+        $site = StatusNet::currentSite();
+
+        $specs = array("$group/$queue/$site",
+                       "$group/$queue");
+        foreach ($specs as $spec) {
+            if (in_array($spec, $this->breakout)) {
+                return $this->base . $spec;
+            }
+        }
+        return $this->base . $group;
     }
 
     /**
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 5bfeebdc3657b8808d642dcd819ccc172f71b4ce..82dec0f0c2a76f2004f6414352f49298cfdfb5b4 100644 (file)
@@ -426,13 +426,148 @@ 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($id, $r);
     $r = preg_replace('/(^|[\s\.\,\:\;]+)!([A-Za-z0-9]{1,64})/e', "'\\1!'.common_group_link($id, '\\2')", $r);
     return $r;
 }
 
+function common_linkify_mentions($profile_id, $text)
+{
+    $mentions = common_find_mentions($profile_id, $text);
+
+    // 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($profile_id, $text)
+{
+    $mentions = array();
+
+    $sender = Profile::staticGet('id', $profile_id);
+
+    if (empty($sender)) {
+        return $mentions;
+    }
+
+    if (Event::handle('StartFindMentions', array($sender, $text, &$mentions))) {
+
+        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]);
+            $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);
@@ -656,37 +791,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 +813,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
@@ -1022,12 +1103,16 @@ 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;
 }
 
index c7276b56f7a39b0ff001b232821c8734e2b51282..26f956329533b71f5f4e3323d71ad5592fbd4ae1 100644 (file)
@@ -9,12 +9,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:01+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 (r62925); 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"
@@ -62,7 +62,7 @@ msgstr "عطّل التسجيل الجديد."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -100,7 +100,6 @@ msgstr "لا صفحة كهذه"
 #: 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
 msgid "No such user."
 msgstr "لا مستخدم كهذا."
 
@@ -185,11 +184,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "لم يتم العثور على وسيلة API."
 
@@ -486,7 +485,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."
@@ -738,7 +737,7 @@ 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:637
 msgid "Delete"
 msgstr "احذف"
 
@@ -918,7 +917,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -947,7 +946,7 @@ msgstr "احذف هذا الإشعار"
 #: 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/settingsaction.php:72
@@ -976,7 +975,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟"
 msgid "Do not delete this notice"
 msgstr "لا تحذف هذا الإشعار"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "احذف هذا الإشعار"
 
@@ -1214,7 +1213,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعة."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
@@ -2212,7 +2211,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "ليس نسق بيانات مدعوم."
 
@@ -2645,23 +2644,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "حُفظت الإعدادات."
 
@@ -3020,7 +3019,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 +3055,7 @@ msgstr "لا يمكنك تكرار ملاحظتك الشخصية."
 msgid "You already repeated that notice."
 msgstr "أنت كررت هذه الملاحظة بالفعل."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "مكرر"
 
@@ -3726,15 +3725,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 "مُشترك"
 
@@ -3794,7 +3803,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,16 +3813,16 @@ 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 "رسائل قصيرة"
 
@@ -4207,58 +4216,77 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "مشكلة في حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكلة في حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "مشكلة أثناء حفظ الإشعار."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم في %1$s يا @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعة."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضوية المجموعة."
 
@@ -4459,26 +4487,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "الرخصة."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "قبل"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4775,54 +4815,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 +4882,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 +4896,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 +4910,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 +4924,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 +4952,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "اذهب إلى المُثبّت."
 
@@ -5329,7 +5380,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 "من"
 
@@ -5449,48 +5500,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:558
 msgid "in context"
 msgstr "في السياق"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "مكرر بواسطة"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "رُد على هذا الإشعار"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "رُد"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "الإشعار مكرر"
 
@@ -5522,10 +5573,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 "تعذّر إدراج اشتراك جديد."
@@ -5702,34 +5749,6 @@ 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/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 +5799,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:952
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "قبل دقيقة تقريبًا"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "قبل ساعة تقريبًا"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "قبل سنة تقريبًا"
 
index 2940486d81b301f7efde98de5e18675a7637210d..cd86407530496ede718b281442762be0cc3e2ac7 100644 (file)
@@ -10,12 +10,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:08+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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr "عطّل التسجيل الجديد."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -104,7 +104,6 @@ msgstr "لا صفحه كهذه"
 #: 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
 msgid "No such user."
 msgstr "لا مستخدم كهذا."
 
@@ -189,13 +188,13 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
-msgstr "لم يتم العثور على وسيله API."
+msgstr "الـ API method مش موجوده."
 
 #: actions/apiaccountupdatedeliverydevice.php:85
 #: actions/apiaccountupdateprofile.php:89
@@ -263,7 +262,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."
@@ -490,7 +489,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."
@@ -591,11 +590,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."
@@ -742,7 +741,7 @@ 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:637
 msgid "Delete"
 msgstr "احذف"
 
@@ -922,7 +921,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -951,7 +950,7 @@ msgstr "احذف هذا الإشعار"
 #: 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/settingsaction.php:72
@@ -980,7 +979,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟"
 msgid "Do not delete this notice"
 msgstr "لا تحذف هذا الإشعار"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "احذف هذا الإشعار"
 
@@ -1218,7 +1217,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr "تعذر تحديث المجموعه."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "تعذّر إنشاء الكنى."
 
@@ -1468,11 +1467,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 +1479,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!"
@@ -2214,7 +2213,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr " مش نظام بيانات مدعوم."
 
@@ -2646,23 +2645,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "حُفظت الإعدادات."
 
@@ -3021,7 +3020,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 +3046,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:656
 msgid "Repeated"
 msgstr "مكرر"
 
@@ -3727,15 +3726,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 +3804,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,16 +3814,16 @@ 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 "رسائل قصيرة"
 
@@ -3858,7 +3867,7 @@ msgstr "صورة"
 
 #: actions/tagother.php:141
 msgid "Tag user"
-msgstr "اوسم المستخدم"
+msgstr "اعمل tag لليوزر"
 
 #: actions/tagother.php:151
 msgid ""
@@ -3893,7 +3902,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."
@@ -4189,7 +4198,7 @@ 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."
@@ -4208,58 +4217,77 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "مشكله فى حفظ الإشعار. طويل جدًا."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "مشكله فى حفظ الإشعار. مستخدم غير معروف."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "مشكله أثناء حفظ الإشعار."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "أهلا بكم فى %1$s يا @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "تعذّر إنشاء المجموعه."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "تعذّر ضبط عضويه المجموعه."
 
@@ -4460,26 +4488,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "الرخصه."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "بعد"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "قبل"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4776,54 +4816,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 +4883,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 +4897,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 +4911,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 +4925,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 +4953,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "اذهب إلى المُثبّت."
 
@@ -5320,7 +5371,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 "من"
 
@@ -5440,48 +5491,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:558
 msgid "in context"
 msgstr "فى السياق"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
-msgstr "مكرر بواسطة"
+msgstr "متكرر من"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "رُد على هذا الإشعار"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "رُد"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "الإشعار مكرر"
 
@@ -5513,10 +5564,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 "تعذّر إدراج اشتراك جديد."
@@ -5693,34 +5740,6 @@ 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/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 +5790,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:952
 msgid "a few seconds ago"
 msgstr "قبل لحظات قليلة"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "قبل دقيقه تقريبًا"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "قبل ساعه تقريبًا"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "قبل يوم تقريبا"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "قبل شهر تقريبًا"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "قبل سنه تقريبًا"
 
index efe49b56ab42c3adca1750f6f7563cdc7d066c79..3cb1216285914d2ef100db78cb7855550d0fa365 100644 (file)
@@ -9,12 +9,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:14:17+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:11+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 (r62925); 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"
@@ -25,9 +25,8 @@ msgid "Access"
 msgstr "Достъп"
 
 #: actions/accessadminpanel.php:65
-#, fuzzy
 msgid "Site access settings"
-msgstr "Ð\97апазване Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° сайта"
+msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойки Ð·Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ сайта"
 
 #: actions/accessadminpanel.php:158
 msgid "Registration"
@@ -62,7 +61,7 @@ msgstr "Изключване на новите регистрации."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -70,9 +69,8 @@ msgid "Save"
 msgstr "Запазване"
 
 #: actions/accessadminpanel.php:189
-#, fuzzy
 msgid "Save access settings"
-msgstr "Ð\97апазване Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ñ\81айÑ\82а"
+msgstr "Ð\97апазване Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп"
 
 #: actions/all.php:63 actions/public.php:97 actions/replies.php:92
 #: actions/showfavorites.php:137 actions/tag.php:51
@@ -101,7 +99,6 @@ msgstr "Няма такака страница."
 #: 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
 msgid "No such user."
 msgstr "Няма такъв потребител"
 
@@ -163,8 +160,8 @@ msgstr ""
 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,12 +182,12 @@ msgstr "Бележки от %1$s и приятели в %2$s."
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Не е открит методът в API."
 
@@ -497,7 +494,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."
@@ -638,7 +635,7 @@ 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."
@@ -649,7 +646,7 @@ msgstr "%s бележки отбелязани като любими от %s / %
 msgid "%s timeline"
 msgstr "Поток на %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +662,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,7 +677,7 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "Повторено за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Повторения на %s"
@@ -690,7 +687,7 @@ msgstr "Повторения на %s"
 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."
@@ -753,7 +750,7 @@ 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:637
 msgid "Delete"
 msgstr "Изтриване"
 
@@ -936,7 +933,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:1197
 msgid "There was a problem with your session token."
 msgstr "Имаше проблем със сесията ви в сайта."
 
@@ -965,7 +962,7 @@ msgstr "Изтриване на бележката"
 #: 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/settingsaction.php:72
@@ -994,7 +991,7 @@ msgstr "Наистина ли искате да изтриете тази бел
 msgid "Do not delete this notice"
 msgstr "Да не се изтрива бележката"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "Изтриване на бележката"
 
@@ -1248,7 +1245,7 @@ msgstr "Описанието е твърде дълго (до %d символа)
 msgid "Could not update group."
 msgstr "Грешка при обновяване на групата."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Грешка при отбелязване като любима."
@@ -1258,7 +1255,6 @@ msgid "Options saved."
 msgstr "Настройките са запазени."
 
 #: actions/emailsettings.php:60
-#, fuzzy
 msgid "Email settings"
 msgstr "Настройки на е-поща"
 
@@ -1297,9 +1293,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\""
@@ -2079,7 +2074,7 @@ msgstr "Вход"
 
 #: actions/login.php:227
 msgid "Login to site"
-msgstr ""
+msgstr "Вход в сайта"
 
 #: actions/login.php:236 actions/register.php:478
 msgid "Remember me"
@@ -2328,7 +2323,7 @@ msgid "Only "
 msgstr "Само "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Неподдържан формат на данните"
 
@@ -2771,24 +2766,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
 #, 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Настройките са запазени."
 
@@ -3168,7 +3163,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 +3201,7 @@ msgstr "Не можете да повтаряте собствена бележ
 msgid "You already repeated that notice."
 msgstr "Вече сте повторили тази бележка."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3267,9 +3262,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
@@ -3564,9 +3558,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 +3779,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 +3809,6 @@ msgid "Enter the code you received on your phone."
 msgstr "Въведете кода, който получихте по телефона."
 
 #: actions/smssettings.php:138
-#, fuzzy
 msgid "SMS phone number"
 msgstr "Телефонен номер за SMS"
 
@@ -3891,16 +3883,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: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
 #, fuzzy
 msgid "Subscribed"
 msgstr "Абониране"
@@ -3961,7 +3964,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,16 +3974,16 @@ 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"
 
@@ -4279,9 +4282,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
@@ -4399,23 +4401,23 @@ msgstr "Грешка при обновяване на бележката с но
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Грешка при записване на бележката. Непознат потребител."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4424,39 +4426,61 @@ msgstr ""
 "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте "
 "отново след няколко минути."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "Забранено ви е да публикувате бележки в този сайт."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Проблем при записване на бележката."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добре дошли в %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Грешка при създаване на групата."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Грешка при създаване на нов абонамент."
@@ -4491,9 +4515,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"
@@ -4663,26 +4687,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Всички "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "лиценз."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Страниране"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "След"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Преди"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Не можете да променяте този сайт."
@@ -4993,80 +5029,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 +5125,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 +5153,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Не е открит файл с настройки. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Влизане в сайта"
@@ -5542,7 +5588,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 "от"
 
@@ -5665,48 +5711,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:558
 msgid "in context"
 msgstr "в контекст"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Повторено от"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Отговаряне на тази бележка"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Отговор"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Бележката е повторена."
 
@@ -5739,11 +5785,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 "Грешка при добавяне на нов абонамент."
@@ -5927,36 +5968,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Грешка при изтриване на абонамента."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6009,67 +6020,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:952
 msgid "a few seconds ago"
 msgstr "преди няколко секунди"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "преди около минута"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "преди около %d минути"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "преди около час"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "преди около %d часа"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "преди около ден"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "преди около %d дни"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "преди около месец"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "преди около %d месеца"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "преди около година"
 
index d0b228c08c882cf30adebb270e4dc2949fac6453..d94ad84310f547308bf68adf1af4c5aa47bd4475 100644 (file)
@@ -10,12 +10,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:14:20+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50: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 (r62925); 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"
@@ -66,7 +66,7 @@ msgstr "Inhabilita els nous registres."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -105,7 +105,6 @@ msgstr "No existeix la pàgina."
 #: 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
 msgid "No such user."
 msgstr "No existeix aquest usuari."
 
@@ -169,8 +168,8 @@ msgstr ""
 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!"
@@ -191,12 +190,12 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "No s'ha trobat el mètode API!"
@@ -509,7 +508,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."
@@ -655,7 +654,7 @@ 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."
@@ -666,7 +665,7 @@ msgstr "%s actualitzacions favorites per %s / %s."
 msgid "%s timeline"
 msgstr "%s línia temporal"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -682,12 +681,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,7 +696,7 @@ 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"
@@ -707,7 +706,7 @@ msgstr "Repeticions de %s"
 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!"
@@ -769,7 +768,7 @@ 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:637
 msgid "Delete"
 msgstr "Suprimeix"
 
@@ -954,7 +953,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:1197
 msgid "There was a problem with your session token."
 msgstr "Ha ocorregut algun problema amb la teva sessió."
 
@@ -983,7 +982,7 @@ msgstr "Eliminar aquesta nota"
 #: 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/settingsaction.php:72
@@ -1016,7 +1015,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:637
 msgid "Delete this notice"
 msgstr "Eliminar aquesta nota"
 
@@ -1266,7 +1265,7 @@ msgstr "la descripció és massa llarga (màx. %d caràcters)."
 msgid "Could not update group."
 msgstr "No s'ha pogut actualitzar el grup."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "No s'han pogut crear els àlies."
 
@@ -2351,7 +2350,7 @@ 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
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Format de data no suportat."
 
@@ -2804,23 +2803,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Configuració guardada."
 
@@ -3210,7 +3209,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 +3252,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:656
 msgid "Repeated"
 msgstr "Repetit"
 
@@ -3949,15 +3948,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:69
+#: 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:145
 msgid "Subscribed"
 msgstr "Subscrit"
 
@@ -4021,7 +4031,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,16 +4041,16 @@ 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"
 
@@ -4460,23 +4470,23 @@ msgstr "No s'ha pogut inserir el missatge amb la nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Hashtag de l'error de la base de dades:%s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema al guardar la notificació. Usuari desconegut."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4485,39 +4495,60 @@ msgstr ""
 "Masses notificacions massa ràpid; pren un respir i publica de nou en uns "
 "minuts."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problema en guardar l'avís."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "No s'ha pogut crear el grup."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "No s'ha pogut establir la pertinença d'aquest grup."
 
@@ -4720,26 +4751,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Tot "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "llicència."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginació"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Posteriors"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Anteriors"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "No podeu fer canvis al lloc."
@@ -5048,82 +5091,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 +5189,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 +5217,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "No s'ha trobat cap fitxer de configuració. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 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:140
 msgid "Go to the installer."
 msgstr "Vés a l'instal·lador."
 
@@ -5600,7 +5653,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"
 
@@ -5723,49 +5776,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:558
 msgid "in context"
 msgstr "en context"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Repetit per"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "respondre a aquesta nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Respon"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Notificació publicada"
@@ -5799,10 +5852,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ó."
@@ -5984,36 +6033,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "No s'ha pogut eliminar la subscripció."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6065,67 +6084,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:952
 msgid "a few seconds ago"
 msgstr "fa pocs segons"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "fa un minut"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fa %d minuts"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "fa una hora"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "fa %d hores"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "fa un dia"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "fa %d dies"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "fa un mes"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "fa %d mesos"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "fa un any"
 
index a5d6db6003143267952bd425aa210d553f24ae88..dd51424e69b4785edc09a6e38d51de7d64854b2f 100644 (file)
@@ -9,12 +9,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:14:23+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:18+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 (r62925); 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"
@@ -66,7 +66,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -106,7 +106,6 @@ msgstr "Žádné takové oznámení."
 #: 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
 msgid "No such user."
 msgstr "Žádný takový uživatel."
 
@@ -169,8 +168,8 @@ msgstr ""
 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 ""
@@ -191,12 +190,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Potvrzující kód nebyl nalezen"
@@ -506,7 +505,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."
@@ -652,7 +651,7 @@ 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"
@@ -663,7 +662,7 @@ msgstr "Mikroblog od %s"
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -679,12 +678,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,7 +693,7 @@ 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"
@@ -704,7 +703,7 @@ msgstr "Odpovědi na %s"
 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"
@@ -768,7 +767,7 @@ 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:637
 msgid "Delete"
 msgstr "Odstranit"
 
@@ -957,7 +956,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -986,7 +985,7 @@ msgstr "Odstranit toto oznámení"
 #: 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/settingsaction.php:72
@@ -1016,7 +1015,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:637
 msgid "Delete this notice"
 msgstr "Odstranit toto oznámení"
 
@@ -1270,7 +1269,7 @@ msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)"
 msgid "Could not update group."
 msgstr "Nelze aktualizovat uživatele"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Nelze uložin informace o obrázku"
@@ -2320,7 +2319,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2776,25 +2775,25 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Nastavení uloženo"
 
@@ -3161,7 +3160,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 +3201,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Vytvořit"
@@ -3890,17 +3889,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 +3970,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,17 +3980,17 @@ 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 ""
 
@@ -4405,61 +4414,83 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problém při ukládání sdělení"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "Nelze uložin informace o obrázku"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Nelze vytvořit odebírat"
@@ -4670,28 +4701,40 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "« Novější"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "Starší »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -5002,86 +5045,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 +5148,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 +5176,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Žádný potvrzující kód."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5559,7 +5613,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 "
@@ -5685,51 +5739,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:558
 #, fuzzy
 msgid "in context"
 msgstr "Žádný obsah!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Vytvořit"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "odpověď"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Sdělení"
@@ -5763,10 +5817,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í"
@@ -5952,37 +6002,6 @@ 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."
-msgstr ""
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-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 +6054,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:952
 msgid "a few seconds ago"
 msgstr "před pár sekundami"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "asi před minutou"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "asi před %d minutami"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "asi před hodinou"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "asi před %d hodinami"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "asi přede dnem"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "před %d dny"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "asi před měsícem"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "asi před %d mesíci"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "asi před rokem"
 
index b9e53e254444a04219b9a6df253bb389a9976c19..053187a860ad415e967feca7264c14a932a312e1 100644 (file)
@@ -13,64 +13,60 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:21+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 (r62925); 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
 msgid "Access"
-msgstr "Akzeptieren"
+msgstr "Zugang"
 
 #: actions/accessadminpanel.php:65
 msgid "Site access settings"
 msgstr "Zugangseinstellungen speichern"
 
 #: actions/accessadminpanel.php:158
-#, fuzzy
 msgid "Registration"
 msgstr "Registrieren"
 
 #: actions/accessadminpanel.php:161
-#, fuzzy
 msgid "Private"
-msgstr "Privatsphäre"
+msgstr "Privat"
 
 #: actions/accessadminpanel.php:163
 msgid "Prohibit anonymous users (not logged in) from viewing site?"
 msgstr ""
+"Anonymen (nicht eingeloggten) Nutzern das Betrachten der Seite verbieten?"
 
 #: actions/accessadminpanel.php:167
-#, fuzzy
 msgid "Invite only"
-msgstr "Einladen"
+msgstr "Nur auf Einladung"
 
 #: actions/accessadminpanel.php:169
 msgid "Make registration invitation only."
-msgstr ""
+msgstr "Registrierung nur bei vorheriger Einladung erlauben."
 
 #: actions/accessadminpanel.php:173
-#, fuzzy
 msgid "Closed"
-msgstr "Blockieren"
+msgstr "Geschlossen"
 
 #: actions/accessadminpanel.php:175
 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -78,9 +74,8 @@ msgid "Save"
 msgstr "Speichern"
 
 #: actions/accessadminpanel.php:189
-#, fuzzy
 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
@@ -109,14 +104,13 @@ msgstr "Seite nicht vorhanden"
 #: 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
 msgid "No such user."
 msgstr "Unbekannter Benutzer."
 
 #: actions/all.php:84
-#, fuzzy, php-format
+#, 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
 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
@@ -181,8 +175,8 @@ msgstr ""
 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!"
@@ -203,12 +197,12 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-Methode nicht gefunden."
 
@@ -471,9 +465,9 @@ 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
+#, 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
@@ -511,7 +505,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."
@@ -654,7 +648,7 @@ 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."
@@ -665,7 +659,7 @@ msgstr "%s Aktualisierung in den Favoriten von %s / %s."
 msgid "%s timeline"
 msgstr "%s Zeitleiste"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,12 +675,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,7 +690,7 @@ 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"
@@ -706,7 +700,7 @@ msgstr "Antworten an %s"
 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!"
@@ -768,7 +762,7 @@ 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:637
 msgid "Delete"
 msgstr "Löschen"
 
@@ -951,7 +945,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:1197
 msgid "There was a problem with your session token."
 msgstr "Es gab ein Problem mit deinem Sessiontoken."
 
@@ -980,7 +974,7 @@ msgstr "Nachricht löschen"
 #: 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/settingsaction.php:72
@@ -1011,7 +1005,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:637
 msgid "Delete this notice"
 msgstr "Nachricht löschen"
 
@@ -1263,7 +1257,7 @@ msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)."
 msgid "Could not update group."
 msgstr "Konnte Gruppe nicht aktualisieren."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Konnte keinen Favoriten erstellen."
 
@@ -2348,7 +2342,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Kein unterstütztes Datenformat."
 
@@ -2386,7 +2380,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)."
@@ -2535,7 +2529,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 +2589,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 +2659,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"
@@ -2741,7 +2735,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,31 +2791,30 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 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."
@@ -2854,10 +2847,12 @@ 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
 msgid "Be the first to post!"
-msgstr ""
+msgstr "Sei der erste der etwas schreibt!"
 
 #: actions/public.php:194
 #, php-format
@@ -2898,6 +2893,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!"
@@ -3200,7 +3197,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 +3235,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Erstellt"
@@ -3366,9 +3363,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
@@ -3481,7 +3477,7 @@ msgstr ""
 
 #: actions/showfavorites.php:242
 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
@@ -3681,35 +3677,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 +3720,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 +3731,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 +3939,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: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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonniert"
 
@@ -3965,9 +3968,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 +4009,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 +4022,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 +4032,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
+#, 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
+#, 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
+#, 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
+#, 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
@@ -4128,9 +4131,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."
@@ -4155,15 +4157,15 @@ msgstr "Benutzer"
 
 #: actions/useradminpanel.php:69
 msgid "User settings for this StatusNet site."
-msgstr ""
+msgstr "Nutzer Einstellungen dieser StatusNet Seite."
 
 #: actions/useradminpanel.php:148
 msgid "Invalid bio limit. Must be numeric."
-msgstr ""
+msgstr "Das Zeichenlimit der Biografie muss numerisch sein!"
 
 #: actions/useradminpanel.php:154
 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
 #, php-format
@@ -4193,33 +4195,27 @@ msgstr ""
 
 #: actions/useradminpanel.php:235
 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
 msgid "Default subscription"
-msgstr "Alle Abonnements"
+msgstr "Standard Abonnement"
 
 #: actions/useradminpanel.php:241
-#, fuzzy
 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
 msgid "Invitations"
-msgstr "Einladung(en) verschickt"
+msgstr "Einladungen"
 
 #: actions/useradminpanel.php:255
-#, fuzzy
 msgid "Invitations enabled"
-msgstr "Einladung(en) verschickt"
+msgstr "Einladungen aktivieren"
 
 #: actions/useradminpanel.php:257
 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 +4241,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"
 
@@ -4468,22 +4463,22 @@ msgstr "Konnte Nachricht nicht mit neuer URI versehen."
 msgid "DB error inserting hashtag: %s"
 msgstr "Datenbankfehler beim Einfügen des Hashtags: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problem bei Speichern der Nachricht. Sie ist zu lang."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem bei Speichern der Nachricht. Unbekannter Benutzer."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4492,40 +4487,61 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problem bei Speichern der Nachricht."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Konnte Gruppe nicht erstellen."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Konnte Gruppenmitgliedschaft nicht setzen."
 
@@ -4730,27 +4746,39 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 #, fuzzy
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "Lizenz."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Seitenerstellung"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Später"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Vorher"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5057,81 +5085,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 +5182,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 +5210,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Keine Konfigurationsdatei gefunden."
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Auf der Seite anmelden"
@@ -5245,19 +5283,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 +5362,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 +5376,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 +5394,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"
 
@@ -5395,16 +5433,16 @@ msgstr "Unbekannter Dateityp"
 
 #: lib/imagefile.php:217
 msgid "MB"
-msgstr ""
+msgstr "MB"
 
 #: lib/imagefile.php:219
 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 +5458,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 +5531,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 +5699,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 +5720,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 +5784,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 +5792,12 @@ msgid "To"
 msgstr "An"
 
 #: lib/messageform.php:159 lib/noticeform.php:185
-#, fuzzy
 msgid "Available characters"
 msgstr "Verfügbare Zeichen"
 
 #: lib/noticeform.php:160
-#, fuzzy
 msgid "Send a notice"
-msgstr "Nachricht versenden"
+msgstr "Nachricht senden"
 
 #: lib/noticeform.php:173
 #, php-format
@@ -5777,14 +5813,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 +5826,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:558
 msgid "in context"
 msgstr "im Zusammenhang"
 
-#: lib/noticelist.php:572
-#, fuzzy
+#: lib/noticelist.php:583
 msgid "Repeated by"
-msgstr "Erstellt"
+msgstr "Wiederholt von"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Auf diese Nachricht antworten"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Antworten"
 
-#: lib/noticelist.php:641
-#, fuzzy
+#: lib/noticelist.php:655
 msgid "Notice repeated"
-msgstr "Nachricht gelöscht."
+msgstr "Nachricht wiederholt"
 
 #: lib/nudgeform.php:116
 msgid "Nudge this user"
@@ -5869,11 +5900,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."
@@ -5907,7 +5933,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 +6000,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
 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"
@@ -6035,14 +6057,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,36 +6079,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Konnte Abonnement nicht löschen."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6109,19 +6099,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 +6129,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:952
 msgid "a few seconds ago"
 msgstr "vor wenigen Sekunden"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "vor einer Minute"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "vor %d Minuten"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "vor einer Stunde"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "vor %d Stunden"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "vor einem Tag"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "vor %d Tagen"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "vor einem Monat"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "vor %d Monaten"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "vor einem Jahr"
 
@@ -6216,6 +6204,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..6ff718d453cf392d6cec453c854d6184fa48d502 100644 (file)
@@ -9,12 +9,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:14:30+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:24+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -102,7 +102,6 @@ msgstr "Δεν υπάρχει τέτοια σελίδα"
 #: 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
 msgid "No such user."
 msgstr "Κανένας τέτοιος χρήστης."
 
@@ -164,8 +163,8 @@ msgstr ""
 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 ""
@@ -186,12 +185,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Η μέθοδος του ΑΡΙ δε βρέθηκε!"
@@ -497,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."
@@ -638,7 +637,7 @@ 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 ""
@@ -649,7 +648,7 @@ msgstr ""
 msgid "%s timeline"
 msgstr "χρονοδιάγραμμα του χρήστη %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +664,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,7 +679,7 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
@@ -690,7 +689,7 @@ msgstr ""
 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 ""
@@ -751,7 +750,7 @@ 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:637
 msgid "Delete"
 msgstr "Διαγραφή"
 
@@ -937,7 +936,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -966,7 +965,7 @@ msgstr "Περιγράψτε την ομάδα ή το θέμα"
 #: 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/settingsaction.php:72
@@ -997,7 +996,7 @@ msgstr "Είσαι σίγουρος ότι θες να διαγράψεις αυ
 msgid "Do not delete this notice"
 msgstr "Αδυναμία διαγραφής αυτού του μηνύματος."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr ""
 
@@ -1247,7 +1246,7 @@ msgstr "Το βιογραφικό είναι πολύ μεγάλο (μέγιστ
 msgid "Could not update group."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Αδύνατη η αποθήκευση του προφίλ."
@@ -2278,7 +2277,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2728,25 +2727,25 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr ""
 
@@ -3123,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 ""
 
@@ -3162,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Δημιουργία"
@@ -3843,16 +3842,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: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
 msgid "Subscribed"
 msgstr ""
 
@@ -3912,7 +3921,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,16 +3931,16 @@ 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 ""
 
@@ -4336,57 +4345,78 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr "Σφάλμα στη βάση δεδομένων κατά την εισαγωγή hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Δεν ήταν δυνατή η δημιουργία ομάδας."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ"
@@ -4587,26 +4617,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr ""
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4909,82 +4951,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 +5050,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 +5078,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Ο κωδικός επιβεβαίωσης δεν βρέθηκε."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5449,7 +5502,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 "από"
 
@@ -5572,48 +5625,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Επαναλαμβάνεται από"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Ρυθμίσεις OpenID"
@@ -5647,10 +5700,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 "Απέτυχε η εισαγωγή νέας συνδρομής."
@@ -5831,36 +5880,6 @@ 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
-#, 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"
@@ -5913,67 +5932,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:952
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr ""
 
index 0e7acedc07cc187a2854a3d6322a53795c6face4..98e7790f2b6510e8cdc0cb15cf0958f2cf4afa59 100644 (file)
@@ -10,12 +10,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:27+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 (r62925); 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"
@@ -62,7 +62,7 @@ msgstr "Disable new registrations."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -100,7 +100,6 @@ msgstr "No such page"
 #: 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
 msgid "No such user."
 msgstr "No such user."
 
@@ -192,11 +191,11 @@ msgstr "Updates from %1$s and friends on %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API method not found."
 
@@ -498,7 +497,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."
@@ -753,7 +752,7 @@ 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:637
 msgid "Delete"
 msgstr "Delete"
 
@@ -934,7 +933,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:1197
 msgid "There was a problem with your session token."
 msgstr "There was a problem with your session token."
 
@@ -963,7 +962,7 @@ msgstr "Delete this application"
 #: 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/settingsaction.php:72
@@ -994,7 +993,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:637
 msgid "Delete this notice"
 msgstr "Delete this notice"
 
@@ -1235,7 +1234,7 @@ msgstr "description is too long (max %d chars)."
 msgid "Could not update group."
 msgstr "Could not update group."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Could not create aliases"
 
@@ -2324,7 +2323,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Not a supported data format."
 
@@ -2774,24 +2773,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
+#: actions/profilesettings.php:363
 #, fuzzy
 msgid "Couldn't save location prefs."
 msgstr "Couldn't save tags."
 
-#: 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Settings saved."
 
@@ -3182,7 +3181,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"
 
@@ -3224,7 +3223,7 @@ msgstr "You can't repeat your own notice."
 msgid "You already repeated that notice."
 msgstr "You have already blocked this user."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Created"
@@ -3939,15 +3938,26 @@ 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
+#, fuzzy
+msgid "No such profile."
+msgstr "No such notice."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "You are not subscribed to that profile."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subscribed"
 
@@ -4007,7 +4017,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,16 +4027,16 @@ 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"
 
@@ -4460,22 +4470,22 @@ msgstr "Could not update message with new URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "DB error inserting hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Problem saving notice."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem saving notice. Unknown user."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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
+#: classes/Notice.php:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4483,39 +4493,60 @@ msgid ""
 msgstr ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problem saving notice."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "Problem saving notice."
 
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "DB error inserting reply: %s"
-
-#: classes/Notice.php:1271
+#: classes/Notice.php:1407
 #, 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 "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
+#, fuzzy
+msgid "Couldn't delete self-subscription."
+msgstr "Couldn't delete subscription."
+
+#: classes/Subscription.php:179 lib/subs.php:69
+msgid "Couldn't delete subscription."
+msgstr "Couldn't delete subscription."
+
+#: classes/User.php:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Could not create group."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Could not set group membership."
 
@@ -4718,26 +4749,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "After"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Before"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5047,83 +5090,92 @@ 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
+#: lib/command.php:692
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Unsubscribed from %s"
+
+#: lib/command.php:709
 #, fuzzy
 msgid "You are not subscribed to anyone."
 msgstr "You are not subscribed to that profile."
 
-#: 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
+#: lib/command.php:731
 #, fuzzy
 msgid "No one is subscribed to you."
 msgstr "Could not subscribe other 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
+#: lib/command.php:753
 #, fuzzy
 msgid "You are not a member of any groups."
 msgstr "You are not a member of that group."
 
-#: 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 +5189,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 +5217,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "No configuration file found"
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "Go to the installer."
 
@@ -5606,7 +5659,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 "from"
@@ -5730,50 +5783,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 "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:558
 msgid "in context"
 msgstr "in context"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Created"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Reply to this notice"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Reply"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Notice deleted."
@@ -5806,10 +5859,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."
@@ -5991,36 +6040,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Couldn't delete subscription."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6071,67 +6090,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:952
 msgid "a few seconds ago"
 msgstr "a few seconds ago"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "about a minute ago"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "about %d minutes ago"
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "about an hour ago"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "about %d hours ago"
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "about a day ago"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "about %d days ago"
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "about a month ago"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "about %d months ago"
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "about a year ago"
 
index 0d7c9384a1acb77266961df2b87d37ec49849cf0..b5e0469b61ee6ad6a843dc15eb08a207711d8571 100644 (file)
@@ -12,12 +12,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:30+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 (r62925); 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"
@@ -64,7 +64,7 @@ msgstr "Inhabilitar nuevos registros."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -102,7 +102,6 @@ msgstr "No existe tal página"
 #: 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
 msgid "No such user."
 msgstr "No existe ese usuario."
 
@@ -195,11 +194,11 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método de API no encontrado."
 
@@ -501,7 +500,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."
@@ -761,7 +760,7 @@ 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:637
 msgid "Delete"
 msgstr "Borrar"
 
@@ -943,7 +942,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:1197
 msgid "There was a problem with your session token."
 msgstr "Hubo problemas con tu clave de sesión."
 
@@ -972,7 +971,7 @@ msgstr "Borrar esta aplicación"
 #: 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/settingsaction.php:72
@@ -1003,7 +1002,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:637
 msgid "Delete this notice"
 msgstr "Borrar este aviso"
 
@@ -1244,7 +1243,7 @@ msgstr "La descripción es muy larga (máx. %d caracteres)."
 msgid "Could not update group."
 msgstr "No se pudo actualizar el grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "No fue posible crear alias."
 
@@ -2335,7 +2334,7 @@ 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
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "No es un formato de dato soportado"
 
@@ -2624,7 +2623,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
@@ -2724,7 +2723,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 +2777,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Se guardó configuración."
 
@@ -2893,6 +2892,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,9 +3032,8 @@ 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"
@@ -3111,7 +3111,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 +3128,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 +3188,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 +3226,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:656
 msgid "Repeated"
 msgstr "Repetido"
 
@@ -3327,9 +3327,8 @@ msgstr ""
 
 #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336
 #: actions/useradminpanel.php:293
-#, fuzzy
 msgid "Save site settings"
-msgstr "Configuración de Avatar"
+msgstr "Guardar la configuración del sitio"
 
 #: actions/showapplication.php:82
 #, fuzzy
@@ -3390,11 +3389,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"
@@ -3641,19 +3640,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 +3693,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 +3750,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 +3763,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 +3775,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 +3807,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 +3912,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:77
+msgid "This action only accepts POST requests."
+msgstr ""
 
-#: actions/subscribe.php:55
+#: 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 +3994,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,17 +4004,16 @@ 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"
 
@@ -4100,9 +4106,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"
@@ -4121,20 +4126,20 @@ msgstr "Usuario"
 
 #: actions/useradminpanel.php:69
 msgid "User settings for this StatusNet site."
-msgstr ""
+msgstr "Configuración de usuarios en este sitio StatusNet."
 
 #: actions/useradminpanel.php:148
 msgid "Invalid bio limit. Must be numeric."
-msgstr ""
+msgstr "Límite para la bio inválido: Debe ser numérico."
 
 #: actions/useradminpanel.php:154
 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
 #, 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
 #: lib/personalgroupnav.php:109
@@ -4143,11 +4148,11 @@ msgstr "Perfil"
 
 #: actions/useradminpanel.php:221
 msgid "Bio Limit"
-msgstr ""
+msgstr "Límite de la bio"
 
 #: actions/useradminpanel.php:222
 msgid "Maximum length of a profile bio in characters."
-msgstr ""
+msgstr "Longitud máxima de bio de perfil en caracteres."
 
 #: actions/useradminpanel.php:230
 msgid "New users"
@@ -4159,27 +4164,23 @@ msgstr "Bienvenida a nuevos usuarios"
 
 #: actions/useradminpanel.php:235
 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
 msgid "Default subscription"
 msgstr "Suscripción predeterminada"
 
 #: actions/useradminpanel.php:241
-#, fuzzy
 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
 msgid "Invitations"
 msgstr "Invitaciones"
 
 #: actions/useradminpanel.php:255
-#, fuzzy
 msgid "Invitations enabled"
-msgstr "Invitacion(es) enviada(s)"
+msgstr "Invitaciones habilitadas"
 
 #: actions/useradminpanel.php:257
 msgid "Whether to allow users to invite new users."
@@ -4209,7 +4210,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"
 
@@ -4414,9 +4414,8 @@ 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."
@@ -4431,22 +4430,22 @@ msgstr "No se pudo actualizar mensaje con nuevo URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Error de la BD al insertar la etiqueta clave: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 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:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Ha habido un problema al guardar el mensaje. Usuario desconocido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4455,39 +4454,60 @@ msgstr ""
 "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos "
 "minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Hubo un problema al guardar el aviso."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "No se pudo crear grupo."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "No se pudo configurar miembros de grupo."
@@ -4691,26 +4711,38 @@ msgstr ""
 "Derechos de autor de contenido y datos por los colaboradores. Todos los "
 "derechos reservados."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Todo"
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "Licencia."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginación"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Después"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Antes"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "No puedes hacer cambios a este sitio."
@@ -4736,19 +4768,16 @@ msgid "Unable to delete design setting."
 msgstr "¡No se pudo guardar tu configuración de Twitter!"
 
 #: lib/adminpanelaction.php:312
-#, fuzzy
 msgid "Basic site configuration"
-msgstr "Confirmación de correo electrónico"
+msgstr "Configuración básica del sitio"
 
 #: lib/adminpanelaction.php:317
-#, fuzzy
 msgid "Design configuration"
-msgstr "SMS confirmación"
+msgstr "Configuración del diseño"
 
 #: lib/adminpanelaction.php:322
-#, fuzzy
 msgid "User configuration"
-msgstr "SMS confirmación"
+msgstr "Configuración de usuario"
 
 #: lib/adminpanelaction.php:327
 msgid "Access configuration"
@@ -4774,7 +4803,7 @@ msgstr ""
 
 #: lib/applicationeditform.php:136
 msgid "Edit application"
-msgstr ""
+msgstr "Editar aplicación"
 
 #: lib/applicationeditform.php:184
 msgid "Icon for this application"
@@ -4791,9 +4820,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 +4830,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 +4843,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 +4866,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 +4875,7 @@ msgstr ""
 
 #: lib/attachmentlist.php:265
 msgid "Author"
-msgstr ""
+msgstr "Autor"
 
 #: lib/attachmentlist.php:278
 msgid "Provider"
@@ -4856,16 +4883,15 @@ 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
 msgid "Password changing failed"
-msgstr "Cambio de contraseña "
+msgstr "El cambio de contraseña ha fallado"
 
 #: lib/authenticationplugin.php:233
 #, fuzzy
@@ -4889,10 +4915,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 +4937,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 +5047,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 +5143,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 +5171,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Ningún archivo de configuración encontrado. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "Ir al instalador."
 
@@ -5207,11 +5241,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"
@@ -5577,7 +5611,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"
 
@@ -5702,49 +5736,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:558
 msgid "in context"
 msgstr "en contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Crear"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Responder este aviso."
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Aviso borrado"
@@ -5777,10 +5811,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."
@@ -5967,36 +5997,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "No se pudo eliminar la suscripción."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6049,67 +6049,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:952
 msgid "a few seconds ago"
 msgstr "hace unos segundos"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "hace un minuto"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "hace %d minutos"
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "hace una hora"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "hace %d horas"
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "hace un día"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "hace %d días"
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "hace un mes"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "hace %d meses"
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "hace un año"
 
index c749a41611ae8c5c50bb1542bb4565b824a18fb2..600323e436a605ce96e4bdd3fd93f63103fe3091 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:38+0000\n"
 "Last-Translator: Ahmad Sufi Mahmudi\n"
 "Language-Team: Persian\n"
 "MIME-Version: 1.0\n"
@@ -20,7 +20,7 @@ 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 (r62925); Translate extension (2010-01-16)\n"
 "X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
 
 #: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326
@@ -66,7 +66,7 @@ msgstr "غیر فعال کردن نام نوبسی جدید"
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -105,7 +105,6 @@ msgstr "چنین صفحه‌ای وجود ندارد"
 #: 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
 msgid "No such user."
 msgstr "چنین کاربری وجود ندارد."
 
@@ -173,8 +172,8 @@ msgstr ""
 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$"
@@ -195,12 +194,12 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "رابط مورد نظر پیدا نشد."
 
@@ -501,7 +500,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."
@@ -641,7 +640,7 @@ 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"
@@ -652,7 +651,7 @@ msgstr "%s به روز رسانی های دوست داشتنی %s / %s"
 msgid "%s timeline"
 msgstr "خط زمانی %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -668,12 +667,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,7 +682,7 @@ msgstr "%s به روز رسانی های عموم"
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "تکرار %s"
@@ -693,7 +692,7 @@ msgstr "تکرار %s"
 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"
@@ -755,7 +754,7 @@ 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:637
 msgid "Delete"
 msgstr "حذف"
 
@@ -941,7 +940,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -973,7 +972,7 @@ msgstr "این پیام را پاک کن"
 #: 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/settingsaction.php:72
@@ -1004,7 +1003,7 @@ msgstr "آیا اطمینان دارید که می‌خواهید این پیا
 msgid "Do not delete this notice"
 msgstr "این پیام را پاک نکن"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "این پیام را پاک کن"
 
@@ -1255,7 +1254,7 @@ msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)."
 msgid "Could not update group."
 msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "نمی‌توان نام‌های مستعار را ساخت."
 
@@ -2302,7 +2301,7 @@ msgid "Only "
 msgstr " فقط"
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "یک قالب دادهٔ پشتیبانی‌شده نیست."
 
@@ -2746,23 +2745,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "تنظیمات ذخیره شد."
 
@@ -3123,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 ""
 
@@ -3159,7 +3158,7 @@ msgstr "شما نمی توانید آگهی خودتان را تکرار کنی
 msgid "You already repeated that notice."
 msgstr "شما قبلا آن آگهی را تکرار کردید."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr ""
 
@@ -3844,15 +3843,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 +3922,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,16 +3932,16 @@ 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 ""
 
@@ -4328,22 +4338,22 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "مشکل در ذخیره کردن پیام. بسیار طولانی."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "مشکل در ذخیره کردن پیام. کاربر نا شناخته."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "تعداد خیلی زیاد آگهی و بسیار سریع؛ استراحت کنید و مجددا دقایقی دیگر ارسال "
 "کنید."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4351,39 +4361,58 @@ msgstr ""
 "تعداد زیاد پیام های دو نسخه ای و بسرعت؛ استراحت کنید و دقایقی دیگر مجددا "
 "ارسال کنید."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "شما از فرستادن پست در این سایت مردود شدید ."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, fuzzy
 msgid "Problem saving group inbox."
 msgstr "مشکل در ذخیره کردن آگهی."
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "خوش امدید به %1$s , @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "نمیتوان گروه را تشکیل داد"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr ""
 
@@ -4579,26 +4608,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "همه "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "مجوز."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "صفحه بندى"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "بعد از"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "قبل از"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "شما نمی توانید در این سایت تغیری ایجاد کنید"
@@ -4904,77 +4945,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 +5039,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 +5067,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr "شما ممکن است بخواهید نصاب را اجرا کنید تا این را تعمیر کند."
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "برو به نصاب."
 
@@ -5441,7 +5493,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 "از"
 
@@ -5565,48 +5617,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:558
 msgid "in context"
 msgstr "در زمینه"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "تکرار از"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "به این آگهی جواب دهید"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "جواب دادن"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "آگهی تکرار شد"
 
@@ -5638,10 +5690,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 ""
@@ -5819,34 +5867,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr ""
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5897,67 +5917,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:952
 msgid "a few seconds ago"
 msgstr "چند ثانیه پیش"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "حدود یک دقیقه پیش"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "حدود %d دقیقه پیش"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "حدود یک ساعت پیش"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "حدود %d ساعت پیش"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "حدود یک روز پیش"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "حدود %d روز پیش"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "حدود یک ماه پیش"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "حدود %d ماه پیش"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "حدود یک سال پیش"
 
index 80a85e1d1b39de42c1d20fdf3e56267f935fce19..b92edf1118a6564b52ed30f1eb8cb5bbb332b8cb 100644 (file)
@@ -10,12 +10,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:14:39+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:33+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 (r62925); 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"
@@ -68,7 +68,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -107,7 +107,6 @@ msgstr "Sivua ei ole."
 #: 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
 msgid "No such user."
 msgstr "Käyttäjää ei ole."
 
@@ -175,8 +174,8 @@ msgstr ""
 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!"
@@ -197,12 +196,12 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metodia ei löytynyt!"
@@ -513,7 +512,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."
@@ -659,7 +658,7 @@ 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."
@@ -670,7 +669,7 @@ msgstr " Palvelun %s päivitykset, jotka %s / %s on merkinnyt suosikikseen."
 msgid "%s timeline"
 msgstr "%s aikajana"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -687,12 +686,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,7 +701,7 @@ 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"
@@ -712,7 +711,7 @@ msgstr "Vastaukset käyttäjälle %s"
 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!"
@@ -773,7 +772,7 @@ 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:637
 msgid "Delete"
 msgstr "Poista"
 
@@ -958,7 +957,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:1197
 msgid "There was a problem with your session token."
 msgstr "Istuntoavaimesi kanssa oli ongelma."
 
@@ -987,7 +986,7 @@ msgstr "Poista tämä päivitys"
 #: 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/settingsaction.php:72
@@ -1018,7 +1017,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:637
 msgid "Delete this notice"
 msgstr "Poista tämä päivitys"
 
@@ -1277,7 +1276,7 @@ msgstr "kuvaus on liian pitkä (max %d merkkiä)."
 msgid "Could not update group."
 msgstr "Ei voitu päivittää ryhmää."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Ei voitu lisätä aliasta."
 
@@ -2366,7 +2365,7 @@ msgid "Only "
 msgstr "Vain "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Tuo ei ole tuettu tietomuoto."
 
@@ -2829,24 +2828,24 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Asetukset tallennettu."
 
@@ -3235,7 +3234,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 +3278,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Luotu"
@@ -3984,15 +3983,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: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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Tilattu"
 
@@ -4052,7 +4062,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,16 +4072,16 @@ 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"
 
@@ -4500,23 +4510,23 @@ msgstr "Viestin päivittäminen uudella URI-osoitteella ei onnistunut."
 msgid "DB error inserting hashtag: %s"
 msgstr "Tietokantavirhe tallennettaessa risutagiä: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Virhe tapahtui päivityksen tallennuksessa. Tuntematon käyttäjä."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4524,39 +4534,61 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Ongelma päivityksen tallentamisessa."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Ryhmän luonti ei onnistunut."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Ryhmän jäsenyystietoja ei voitu asettaa."
 
@@ -4762,26 +4794,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Kaikki "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "lisenssi."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Sivutus"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Myöhemmin"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Aiemmin"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5096,83 +5140,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 +5239,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 +5267,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Varmistuskoodia ei ole annettu."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Kirjaudu sisään palveluun"
@@ -5661,7 +5715,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ä "
@@ -5785,51 +5839,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:558
 #, fuzzy
 msgid "in context"
 msgstr "Ei sisältöä!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Luotu"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Vastaa tähän päivitykseen"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Vastaus"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Päivitys on poistettu."
@@ -5863,11 +5917,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."
@@ -6055,36 +6104,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Ei voitu poistaa tilausta."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6138,68 +6157,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:952
 msgid "a few seconds ago"
 msgstr "muutama sekunti sitten"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "noin minuutti sitten"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "noin %d minuuttia sitten"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "noin tunti sitten"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "noin %d tuntia sitten"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "noin päivä sitten"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "noin %d päivää sitten"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "noin kuukausi sitten"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "noin %d kuukautta sitten"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "noin vuosi sitten"
 
index 9fb5e88b2b2c1347bf1fccca95343edf93be8b80..cf0cc849b24d3455e68fdcef7b94ef33b44c13d5 100644 (file)
@@ -14,12 +14,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:14:44+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50: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 (r62925); 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"
@@ -66,7 +66,7 @@ msgstr "Désactiver les nouvelles inscriptions."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -104,7 +104,6 @@ msgstr "Page non trouvée"
 #: 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
 msgid "No such user."
 msgstr "Utilisateur non trouvé."
 
@@ -175,8 +174,8 @@ msgstr ""
 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!"
@@ -197,12 +196,12 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Méthode API non trouvée !"
 
@@ -506,7 +505,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."
@@ -657,7 +656,7 @@ 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."
@@ -668,7 +667,7 @@ msgstr "%1$s statuts favoris de %2$s / %2$s."
 msgid "%s timeline"
 msgstr "Activité de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -684,12 +683,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,7 +698,7 @@ 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"
@@ -709,7 +708,7 @@ msgstr "Reprises de %s"
 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 !"
@@ -772,7 +771,7 @@ 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:637
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -953,7 +952,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:1197
 msgid "There was a problem with your session token."
 msgstr "Un problème est survenu avec votre jeton de session."
 
@@ -982,7 +981,7 @@ msgstr "Supprimer cette application"
 #: 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/settingsaction.php:72
@@ -1013,7 +1012,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:637
 msgid "Delete this notice"
 msgstr "Supprimer cet avis"
 
@@ -1254,7 +1253,7 @@ msgstr "la description est trop longue (%d caractères maximum)."
 msgid "Could not update group."
 msgstr "Impossible de mettre à jour le groupe."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Impossible de créer les alias."
 
@@ -2357,7 +2356,7 @@ msgid "Only "
 msgstr "Seulement "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Format de données non supporté."
 
@@ -2801,23 +2800,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Préférences enregistrées."
 
@@ -3220,7 +3219,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 +3256,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:656
 msgid "Repeated"
 msgstr "Repris"
 
@@ -3978,15 +3977,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 ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Fichier non trouvé."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Vous n’êtes pas abonné(e) à ce profil."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonné"
 
@@ -4050,7 +4060,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,16 +4076,16 @@ 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"
 
@@ -4506,22 +4516,22 @@ msgstr "Impossible de mettre à jour le message avec un nouvel URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erreur de base de donnée en insérant la marque (hashtag) : %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 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:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Erreur lors de l’enregistrement de l’avis. Utilisateur inconnu."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4529,38 +4539,57 @@ msgstr ""
 "Trop de messages en double trop vite ! Prenez une pause et publiez à nouveau "
 "dans quelques minutes."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problème lors de l’enregistrement de l’avis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Bienvenue à %1$s, @%2$s !"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Impossible de créer le groupe."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Impossible d’établir l’inscription au groupe."
 
@@ -4765,26 +4794,38 @@ 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:827
 msgid "All "
 msgstr "Tous "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licence."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Après"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Avant"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Vous ne pouvez pas faire de modifications sur ce site."
@@ -5088,82 +5129,92 @@ 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
+#, fuzzy, 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5177,6 +5228,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"
@@ -5242,20 +5294,20 @@ msgstr ""
 "tracks - pas encore implémenté.\n"
 "tracking - pas encore implémenté.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Aucun fichier de configuration n’a été trouvé. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Aller au programme d’installation"
 
@@ -5754,7 +5806,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"
 
@@ -5880,48 +5932,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:558
 msgid "in context"
 msgstr "dans le contexte"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Repris par"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Répondre à cet avis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Répondre"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Avis repris"
 
@@ -5953,10 +6005,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."
@@ -6133,34 +6181,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Impossible de cesser l’abonnement"
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6211,67 +6231,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:952
 msgid "a few seconds ago"
 msgstr "il y a quelques secondes"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "il y a 1 minute"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "il y a %d minutes"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "il y a 1 heure"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "il y a %d heures"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "il y a 1 jour"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "il y a %d jours"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "il y a 1 mois"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "il y a %d mois"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "il y a environ 1 an"
 
index 0358b8ecd0824a3b98e5cbd96e88c1b741b296b5..b60553d44fd7d2950f42a93a3555efc679bd914a 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:14:47+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50: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 (r62925); 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"
@@ -67,7 +67,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -107,7 +107,6 @@ msgstr "Non existe a etiqueta."
 #: 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
 msgid "No such user."
 msgstr "Ningún usuario."
 
@@ -170,8 +169,8 @@ msgstr ""
 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!"
@@ -192,12 +191,12 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Método da API non atopado"
@@ -511,7 +510,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."
@@ -658,7 +657,7 @@ 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."
@@ -669,7 +668,7 @@ msgstr "%s updates favorited by %s / %s."
 msgid "%s timeline"
 msgstr "Liña de tempo de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -685,12 +684,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,7 +699,7 @@ 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"
@@ -710,7 +709,7 @@ msgstr "Replies to %s"
 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!"
@@ -773,7 +772,7 @@ 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:637
 #, fuzzy
 msgid "Delete"
 msgstr "eliminar"
@@ -968,7 +967,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:1197
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "Houbo un problema co teu token de sesión. Tentao de novo, anda..."
@@ -998,7 +997,7 @@ msgstr "Eliminar chío"
 #: 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/settingsaction.php:72
@@ -1031,7 +1030,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:637
 #, fuzzy
 msgid "Delete this notice"
 msgstr "Eliminar chío"
@@ -1298,7 +1297,7 @@ msgstr "O teu Bio é demasiado longo (max 140 car.)."
 msgid "Could not update group."
 msgstr "Non se puido actualizar o usuario."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Non se puido crear o favorito."
@@ -2397,7 +2396,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Non é un formato de datos soportado."
 
@@ -2861,24 +2860,24 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Configuracións gardadas."
 
@@ -3276,7 +3275,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 +3318,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Crear"
@@ -4036,15 +4035,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 +4114,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,16 +4124,16 @@ 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"
 
@@ -4556,23 +4566,23 @@ msgstr "Non se puido actualizar a mensaxe coa nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro ó inserir o hashtag na BD: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Aconteceu un erro ó gardar o chío. Usuario descoñecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4581,40 +4591,62 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Aconteceu un erro ó gardar o chío."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "Non se puido crear o favorito."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Non se pode gardar a subscrición."
@@ -4829,29 +4861,41 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 #, fuzzy
 msgid "All "
 msgstr "Todos"
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "« Despois"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "Antes »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5170,55 +5214,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 +5280,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 +5294,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 +5308,7 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: lib/command.php:728
+#: lib/command.php:769
 #, fuzzy
 msgid ""
 "Commands:\n"
@@ -5270,6 +5323,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 +5377,20 @@ msgstr ""
 "tracks - non implementado por agora.\n"
 "tracking - non implementado por agora.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Sen código de confirmación."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5821,7 +5875,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 "
@@ -5948,53 +6002,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:558
 #, fuzzy
 msgid "in context"
 msgstr "Sen contido!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Crear"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "Non se pode eliminar este chíos."
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "contestar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Chío publicado"
@@ -6031,11 +6085,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."
@@ -6227,36 +6276,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Non se pode eliminar a subscrición."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6313,70 +6332,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:952
 msgid "a few seconds ago"
 msgstr "fai uns segundos"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "fai un minuto"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fai %d minutos"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "fai unha hora"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "fai %d horas"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "fai un día"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "fai %d días"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "fai un mes"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "fai %d meses"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "fai un ano"
 
index fb8f120319b7e16ce8df55e84b558e1e7e9f6e1c..424917efb27a7f635f644faef7356058eaabcbab 100644 (file)
@@ -7,12 +7,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:14:50+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50: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 (r62925); 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"
@@ -64,7 +64,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -104,7 +104,6 @@ msgstr "אין הודעה כזו."
 #: 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
 msgid "No such user."
 msgstr "אין משתמש כזה."
 
@@ -167,8 +166,8 @@ msgstr ""
 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 ""
@@ -189,12 +188,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "קוד האישור לא נמצא."
@@ -504,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."
@@ -649,7 +648,7 @@ 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"
@@ -660,7 +659,7 @@ msgstr "מיקרובלוג מאת %s"
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -676,12 +675,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,7 +690,7 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr "תגובת עבור %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, fuzzy, php-format
 msgid "Repeats of %s"
 msgstr "תגובת עבור %s"
@@ -701,7 +700,7 @@ msgstr "תגובת עבור %s"
 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"
@@ -765,7 +764,7 @@ 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:637
 #, fuzzy
 msgid "Delete"
 msgstr "מחק"
@@ -957,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -986,7 +985,7 @@ msgstr "תאר את עצמך ואת נושאי העניין שלך ב-140 אות
 #: 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/settingsaction.php:72
@@ -1016,7 +1015,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "אין הודעה כזו."
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr ""
 
@@ -1276,7 +1275,7 @@ msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיו
 msgid "Could not update group."
 msgstr "עידכון המשתמש נכשל."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "שמירת מידע התמונה נכשל"
@@ -2328,7 +2327,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2784,25 +2783,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
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "שמירת הפרופיל נכשלה."
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "ההגדרות נשמרו."
 
@@ -3164,7 +3163,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 +3204,7 @@ msgstr "לא ניתן להירשם ללא הסכמה לרשיון"
 msgid "You already repeated that notice."
 msgstr "כבר נכנסת למערכת!"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "צור"
@@ -3891,17 +3890,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 +3971,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,17 +3981,17 @@ 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 "סמס"
 
@@ -4405,61 +4414,83 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "בעיה בשמירת ההודעה."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "שמירת מידע התמונה נכשל"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "יצירת המנוי נכשלה."
@@ -4671,28 +4702,40 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "<< אחרי"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "לפני >>"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -5003,83 +5046,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 +5146,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 +5174,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "אין קוד אישור."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5558,7 +5612,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 ""
 
@@ -5683,52 +5737,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:558
 #, fuzzy
 msgid "in context"
 msgstr "אין תוכן!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "צור"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "הגב"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "הודעות"
@@ -5762,10 +5816,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 "הכנסת מנוי חדש נכשלה."
@@ -5953,37 +6003,6 @@ 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."
-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/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6038,69 +6057,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:952
 msgid "a few seconds ago"
 msgstr "לפני מספר שניות"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "לפני כדקה"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "לפני כ-%d דקות"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "לפני כשעה"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "לפני כ-%d שעות"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "לפני כיום"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "לפני כ-%d ימים"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "לפני כחודש"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "לפני כ-%d חודשים"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "לפני כשנה"
 
index daecf17e80bffcf20e378da3ba264295896eacb2..7b6870afec7e8b9a913f78d982fe4de620c923e7 100644 (file)
@@ -9,12 +9,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:14:54+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:50:58+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 (r62925); 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"
@@ -64,7 +64,7 @@ msgstr "Nowe registrowanja znjemóžnić."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -103,7 +103,6 @@ msgstr "Strona njeeksistuje"
 #: 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
 msgid "No such user."
 msgstr "Wužiwar njeeksistuje"
 
@@ -165,8 +164,8 @@ msgstr ""
 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 ""
@@ -187,12 +186,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metoda njenamakana."
 
@@ -489,7 +488,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."
@@ -628,7 +627,7 @@ 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 ""
@@ -639,7 +638,7 @@ msgstr ""
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -655,12 +654,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,7 +669,7 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
@@ -680,7 +679,7 @@ msgstr ""
 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 ""
@@ -742,7 +741,7 @@ 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:637
 msgid "Delete"
 msgstr "Zničić"
 
@@ -922,7 +921,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -951,7 +950,7 @@ msgstr "Tutu zdźělenku wušmórnyć"
 #: 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/settingsaction.php:72
@@ -980,7 +979,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:637
 msgid "Delete this notice"
 msgstr "Tutu zdźělenku wušmórnyć"
 
@@ -1220,7 +1219,7 @@ msgstr "wopisanje je předołho (maks. %d znamješkow)."
 msgid "Could not update group."
 msgstr "Skupina njeje so dała aktualizować."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Aliasy njejsu so dali wutworić."
 
@@ -2220,7 +2219,7 @@ msgid "Only "
 msgstr "Jenož "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Njeje podpěrany datowy format."
 
@@ -2652,23 +2651,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Nastajenja składowane."
 
@@ -3022,7 +3021,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 +3057,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:656
 msgid "Repeated"
 msgstr "Wospjetowany"
 
@@ -3724,15 +3723,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: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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonowany"
 
@@ -3792,7 +3802,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,16 +3812,16 @@ 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"
 
@@ -4205,57 +4215,76 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr ""
 
@@ -4451,26 +4480,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr ""
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4764,54 +4805,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 +4870,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 +4882,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 +4894,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 +4908,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 +4936,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Žana konfiguraciska dataja namakana. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5302,7 +5354,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"
 
@@ -5422,48 +5474,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Wospjetowany wot"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Na tutu zdźělenku wotmołwić"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Wotmołwić"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Zdźělenka wospjetowana"
 
@@ -5495,10 +5547,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 ""
@@ -5675,34 +5723,6 @@ 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/subs.php:82
-msgid "Could not subscribe other to you."
-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 +5773,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:952
 msgid "a few seconds ago"
 msgstr "před něšto sekundami"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "před něhdźe jednej mjeńšinu"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "před %d mjeńšinami"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "před něhdźe jednej hodźinu"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "před něhdźe %d hodźinami"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "před něhdźe jednym dnjom"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "před něhdźe %d dnjemi"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "před něhdźe jednym měsacom"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "před něhdźe %d měsacami"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "před něhdźe jednym lětom"
 
index 698f779dd0be3876f3dfa072e5fb638ee002134e..fa42bd3fea3e11bfb22f4d42b3f4cccdf69f8bd3 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:14:57+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:01+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 (r62925); 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"
@@ -60,7 +60,7 @@ msgstr "Disactivar le creation de nove contos."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -98,7 +98,6 @@ msgstr "Pagina non existe"
 #: 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
 msgid "No such user."
 msgstr "Usator non existe."
 
@@ -168,8 +167,8 @@ msgstr ""
 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!"
@@ -190,12 +189,12 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Methodo API non trovate."
 
@@ -495,7 +494,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."
@@ -643,7 +642,7 @@ 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."
@@ -654,7 +653,7 @@ msgstr "%1$s actualisationes favoritisate per %2$s / %2$s."
 msgid "%s timeline"
 msgstr "Chronologia de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -671,12 +670,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,7 +685,7 @@ 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"
@@ -696,7 +695,7 @@ msgstr "Repetitiones de %s"
 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!"
@@ -758,7 +757,7 @@ 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:637
 msgid "Delete"
 msgstr "Deler"
 
@@ -939,7 +938,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:1197
 msgid "There was a problem with your session token."
 msgstr "Il habeva un problema con tu indicio de session."
 
@@ -968,7 +967,7 @@ msgstr "Deler iste application"
 #: 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/settingsaction.php:72
@@ -999,7 +998,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:637
 msgid "Delete this notice"
 msgstr "Deler iste nota"
 
@@ -1240,7 +1239,7 @@ msgstr "description es troppo longe (max %d chars)."
 msgid "Could not update group."
 msgstr "Non poteva actualisar gruppo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Non poteva crear aliases."
 
@@ -2328,7 +2327,7 @@ msgid "Only "
 msgstr "Solmente "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Formato de datos non supportate."
 
@@ -2770,23 +2769,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Preferentias confirmate."
 
@@ -3181,7 +3180,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 +3218,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:656
 msgid "Repeated"
 msgstr "Repetite"
 
@@ -3930,15 +3929,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 +4012,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,16 +4028,16 @@ 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"
 
@@ -4453,22 +4463,22 @@ msgstr "Non poteva actualisar message con nove URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Error in base de datos durante insertion del marca (hashtag): %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problema salveguardar nota. Troppo longe."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema salveguardar nota. Usator incognite."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4476,38 +4486,57 @@ msgstr ""
 "Troppo de messages duplicate troppo rapidemente; face un pausa e publica de "
 "novo post alcun minutas."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problema salveguardar nota."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Non poteva crear gruppo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Non poteva configurar le membrato del gruppo."
 
@@ -4709,26 +4738,38 @@ 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:827
 msgid "All "
 msgstr "Totes "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licentia."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Pagination"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Post"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Ante"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Tu non pote facer modificationes in iste sito."
@@ -5028,82 +5069,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 +5168,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 +5233,19 @@ msgstr ""
 "tracks - non ancora implementate.\n"
 "tracking - non ancora implementate.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Nulle file de configuration trovate. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Ir al installator."
 
@@ -5689,7 +5741,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"
 
@@ -5815,48 +5867,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:558
 msgid "in context"
 msgstr "in contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Repetite per"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Responder a iste nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Nota repetite"
 
@@ -5888,10 +5940,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."
@@ -6068,34 +6116,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Non poteva deler subscription."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6146,67 +6166,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:952
 msgid "a few seconds ago"
 msgstr "alcun secundas retro"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "circa un minuta retro"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minutas retro"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "circa un hora retro"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d horas retro"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "circa un die retro"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d dies retro"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "circa un mense retro"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d menses retro"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "circa un anno retro"
 
index e8858302582a0884b51f74ea2e1e138278308713..08e4fec9521de844921ac562853ba9f124e80d07 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:05+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 (r62925); 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"
@@ -67,7 +67,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -107,7 +107,6 @@ msgstr "Ekkert þannig merki."
 #: 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
 msgid "No such user."
 msgstr "Enginn svoleiðis notandi."
 
@@ -169,8 +168,8 @@ msgstr ""
 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!"
@@ -191,12 +190,12 @@ msgstr "Færslur frá %1$s og vinum á %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Aðferð í forritsskilum fannst ekki!"
@@ -506,7 +505,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."
@@ -650,7 +649,7 @@ 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."
@@ -661,7 +660,7 @@ msgstr "%s færslur gerðar að uppáhaldsbabli af %s / %s."
 msgid "%s timeline"
 msgstr "Rás %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -677,12 +676,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,7 +691,7 @@ 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"
@@ -702,7 +701,7 @@ msgstr "Svör við %s"
 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 ""
@@ -763,7 +762,7 @@ 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:637
 msgid "Delete"
 msgstr "Eyða"
 
@@ -950,7 +949,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:1197
 msgid "There was a problem with your session token."
 msgstr "Það komu upp vandamál varðandi setutókann þinn."
 
@@ -979,7 +978,7 @@ msgstr "Eyða þessu babli"
 #: 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/settingsaction.php:72
@@ -1008,7 +1007,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:637
 msgid "Delete this notice"
 msgstr "Eyða þessu babli"
 
@@ -1267,7 +1266,7 @@ msgstr "Lýsing er of löng (í mesta lagi 140 tákn)."
 msgid "Could not update group."
 msgstr "Gat ekki uppfært hóp."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr ""
 
@@ -2348,7 +2347,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Enginn stuðningur við gagnasnið."
 
@@ -2810,24 +2809,24 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Stillingar vistaðar."
 
@@ -3206,7 +3205,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 +3250,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Í sviðsljósinu"
@@ -3939,15 +3938,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:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Þú ert ekki áskrifandi."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Þú ert nú í áskrift"
 
@@ -4007,7 +4017,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,16 +4027,16 @@ 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"
 
@@ -4453,60 +4463,82 @@ msgstr "Gat ekki uppfært skilaboð með nýju veffangi."
 msgid "DB error inserting hashtag: %s"
 msgstr "Gagnagrunnsvilla við innsetningu myllumerkis: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Gat ekki vistað babl. Óþekktur notandi."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Vandamál komu upp við að vista babl."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Gat ekki búið til hóp."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Gat ekki skráð hópmeðlimi."
 
@@ -4712,26 +4744,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Allt "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "leyfi."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Uppröðun"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Eftir"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Áður"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5044,83 +5088,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 +5187,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 +5215,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Enginn staðfestingarlykill."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Skrá þig inn á síðuna"
@@ -5596,7 +5650,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á"
@@ -5720,50 +5774,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Í sviðsljósinu"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Svara þessu babli"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Svara"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Babl sent inn"
@@ -5797,11 +5851,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."
@@ -5986,36 +6035,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Gat ekki eytt áskrift."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6068,67 +6087,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:952
 msgid "a few seconds ago"
 msgstr "fyrir nokkrum sekúndum"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "fyrir um einni mínútu síðan"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "fyrir um %d mínútum síðan"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "fyrir um einum klukkutíma síðan"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "fyrir um %d klukkutímum síðan"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "fyrir um einum degi síðan"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "fyrir um %d dögum síðan"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "fyrir um einum mánuði síðan"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "fyrir um %d mánuðum síðan"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "fyrir um einu ári síðan"
 
index 37ac228b23b131d67a51c22133a7437b4bea3dc8..7e3d7998a12cbdbc8483a5ac292c1b5e8e452b93 100644 (file)
@@ -9,12 +9,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:14+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:09+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr "Disabilita la creazione di nuovi account"
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -101,7 +101,6 @@ msgstr "Pagina inesistente."
 #: 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
 msgid "No such user."
 msgstr "Utente inesistente."
 
@@ -172,8 +171,8 @@ msgstr ""
 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!"
@@ -194,12 +193,12 @@ msgstr "Messaggi da %1$s e amici su %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Metodo delle API non trovato."
 
@@ -501,7 +500,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."
@@ -618,7 +617,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,7 +644,7 @@ 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"
@@ -656,7 +655,7 @@ msgstr "%1$s aggiornamenti preferiti da %2$s / %3$s"
 msgid "%s timeline"
 msgstr "Attività di %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -672,12 +671,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,7 +686,7 @@ 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"
@@ -697,7 +696,7 @@ msgstr "Ripetizioni di %s"
 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!"
@@ -759,7 +758,7 @@ 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:637
 msgid "Delete"
 msgstr "Elimina"
 
@@ -940,7 +939,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:1197
 msgid "There was a problem with your session token."
 msgstr "Si è verificato un problema con il tuo token di sessione."
 
@@ -968,7 +967,7 @@ msgstr "Elimina l'applicazione"
 #: 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/settingsaction.php:72
@@ -999,7 +998,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:637
 msgid "Delete this notice"
 msgstr "Elimina questo messaggio"
 
@@ -1240,7 +1239,7 @@ msgstr "La descrizione è troppo lunga (max %d caratteri)."
 msgid "Could not update group."
 msgstr "Impossibile aggiornare il gruppo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Impossibile creare gli alias."
 
@@ -2326,7 +2325,7 @@ msgid "Only "
 msgstr "Solo "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Non è un formato di dati supportato."
 
@@ -2770,23 +2769,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Impostazioni salvate."
 
@@ -3181,7 +3180,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 +3218,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:656
 msgid "Repeated"
 msgstr "Ripetuti"
 
@@ -3928,15 +3927,26 @@ 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 ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Nessun file."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Non hai una abbonamento a quel profilo."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abbonati"
 
@@ -4000,7 +4010,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,16 +4025,16 @@ 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"
 
@@ -4453,22 +4463,22 @@ msgstr "Impossibile aggiornare il messaggio con il nuovo URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Errore del DB nell'inserire un hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problema nel salvare il messaggio. Troppo lungo."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema nel salvare il messaggio. Utente sconosciuto."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4476,38 +4486,57 @@ msgstr ""
 "Troppi messaggi duplicati troppo velocemente; fai una pausa e scrivi di "
 "nuovo tra qualche minuto."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problema nel salvare il messaggio."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Impossibile creare il gruppo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Impossibile impostare la membership al gruppo."
 
@@ -4711,26 +4740,38 @@ msgstr ""
 "I contenuti e i dati sono forniti dai collaboratori. Tutti i diritti "
 "riservati."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Tutti "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licenza."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginazione"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Successivi"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Precedenti"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Non puoi apportare modifiche al sito."
@@ -5029,82 +5070,92 @@ 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
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Abbonamento a %s annullato"
+
+#: 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5118,6 +5169,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"
@@ -5184,21 +5236,21 @@ msgstr ""
 "tracks - non ancora implementato\n"
 "tracking - non ancora implementato\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Non è stato trovato alcun file di configurazione. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Vai al programma d'installazione."
 
@@ -5693,7 +5745,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"
 
@@ -5818,48 +5870,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:558
 msgid "in context"
 msgstr "in una discussione"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Ripetuto da"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Rispondi a questo messaggio"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Rispondi"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Messaggio ripetuto"
 
@@ -5891,10 +5943,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."
@@ -6071,34 +6119,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Impossibile eliminare l'abbonamento."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6149,67 +6169,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:952
 msgid "a few seconds ago"
 msgstr "pochi secondi fa"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "circa un minuto fa"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "circa %d minuti fa"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "circa un'ora fa"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "circa %d ore fa"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "circa un giorno fa"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "circa %d giorni fa"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "circa un mese fa"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "circa %d mesi fa"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "circa un anno fa"
 
index 3063f953896aca1ec16cd79fe7a71499192eebc8..e05ddbd15384bc4e128770e9b1314a89655ad7c2 100644 (file)
@@ -11,12 +11,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:17+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:12+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr "新規登録を無効。"
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -101,7 +101,6 @@ msgstr "そのようなページはありません。"
 #: 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
 msgid "No such user."
 msgstr "そのようなユーザはいません。"
 
@@ -169,8 +168,8 @@ msgstr ""
 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 と友人からの更新があります!"
@@ -191,12 +190,12 @@ msgstr "%2$s に %1$s と友人からの更新があります!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API メソッドが見つかりません。"
 
@@ -499,7 +498,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."
@@ -638,7 +637,7 @@ 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。"
@@ -649,7 +648,7 @@ msgstr "%1$s は %2$s でお気に入りを更新しました / %2$s。"
 msgid "%s timeline"
 msgstr "%s のタイムライン"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -665,12 +664,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,7 +679,7 @@ msgstr "皆からの %s アップデート!"
 msgid "Repeated to %s"
 msgstr "%s への返信"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "%s の返信"
@@ -690,7 +689,7 @@ msgstr "%s の返信"
 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 による更新があります!"
@@ -751,7 +750,7 @@ 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:637
 msgid "Delete"
 msgstr "削除"
 
@@ -933,7 +932,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:1197
 msgid "There was a problem with your session token."
 msgstr "あなたのセッショントークンに関する問題がありました。"
 
@@ -962,7 +961,7 @@ msgstr "このアプリケーションを削除"
 #: 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/settingsaction.php:72
@@ -993,7 +992,7 @@ msgstr "本当にこのつぶやきを削除しますか?"
 msgid "Do not delete this notice"
 msgstr "このつぶやきを削除できません。"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "このつぶやきを削除"
 
@@ -1234,7 +1233,7 @@ msgstr "記述が長すぎます。(最長 %d 字)"
 msgid "Could not update group."
 msgstr "グループを更新できません。"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "別名を作成できません。"
 
@@ -2317,7 +2316,7 @@ msgid "Only "
 msgstr "だけ "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "サポートされていないデータ形式。"
 
@@ -2758,23 +2757,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "設定が保存されました。"
 
@@ -3167,7 +3166,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 +3205,7 @@ msgstr "自分のつぶやきは繰り返せません。"
 msgid "You already repeated that notice."
 msgstr "すでにそのつぶやきを繰り返しています。"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "繰り返された"
 
@@ -3921,15 +3920,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 +4003,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,16 +4019,16 @@ 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"
 
@@ -4435,21 +4445,21 @@ msgstr "新しいURIでメッセージをアップデートできませんでし
 msgid "DB error inserting hashtag: %s"
 msgstr "ハッシュタグ追加 DB エラー: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "つぶやきを保存する際に問題が発生しました。長すぎです。"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "つぶやきを保存する際に問題が発生しました。不明なユーザです。"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "多すぎるつぶやきが速すぎます; 数分間の休みを取ってから再投稿してください。"
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4457,38 +4467,57 @@ msgstr ""
 "多すぎる重複メッセージが速すぎます; 数分間休みを取ってから再度投稿してくださ"
 "い。"
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止されています。"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "つぶやきを保存する際に問題が発生しました。"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "ようこそ %1$s、@%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "グループを作成できません。"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "グループメンバーシップをセットできません。"
 
@@ -4689,26 +4718,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "全て "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "ライセンス。"
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "ページ化"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "<<後"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "前>>"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "あなたはこのサイトへの変更を行うことができません。"
@@ -5006,77 +5047,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 +5141,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 +5169,21 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "コンフィギュレーションファイルがありません。 "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr "私は以下の場所でコンフィギュレーションファイルを探しました: "
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 "あなたは、これを修理するためにインストーラを動かしたがっているかもしれませ"
 "ん。"
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "インストーラへ。"
 
@@ -5624,7 +5676,7 @@ msgstr ""
 "に引き込むプライベートメッセージを送ることができます。人々はあなただけへの"
 "メッセージを送ることができます。"
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "from"
 
@@ -5752,52 +5804,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr ""
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "このつぶやきへ返信"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "返信"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "つぶやきを繰り返しました"
 
@@ -5829,10 +5881,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 "サブスクリプションを追加できません"
@@ -6009,34 +6057,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "フォローを削除できません"
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6087,68 +6107,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:952
 msgid "a few seconds ago"
 msgstr "数秒前"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "約 1 分前"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "約 %d 分前"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "約 1 時間前"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "約 %d 時間前"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "約 1 日前"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "約 %d 日前"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "約 1 ヵ月前"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "約 %d ヵ月前"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "約 1 年前"
 
index 7be2acfca1ff925166794f631a10eef8cebd11b8..1653bf31bc2d50b7ebc871f0ac27509203d269b1 100644 (file)
@@ -7,12 +7,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:20+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:15+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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -105,7 +105,6 @@ msgstr "그러한 태그가 없습니다."
 #: 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
 msgid "No such user."
 msgstr "그러한 사용자는 없습니다."
 
@@ -168,8 +167,8 @@ msgstr ""
 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에 있는 친구들의 업데이트!"
@@ -190,12 +189,12 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 메서드를 찾을 수 없습니다."
@@ -509,7 +508,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."
@@ -654,7 +653,7 @@ 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."
@@ -665,7 +664,7 @@ msgstr "%s 좋아하는 글이 업데이트 됐습니다. %S에 의해 / %s."
 msgid "%s timeline"
 msgstr "%s 타임라인"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,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 "모두로부터의 업데이트 %s개!"
@@ -696,7 +695,7 @@ 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에 답신"
@@ -706,7 +705,7 @@ msgstr "%s에 답신"
 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의 업데이트!"
@@ -768,7 +767,7 @@ 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:637
 msgid "Delete"
 msgstr "삭제"
 
@@ -957,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:1197
 msgid "There was a problem with your session token."
 msgstr "당신의 세션토큰관련 문제가 있습니다."
 
@@ -986,7 +985,7 @@ msgstr "이 게시글 삭제하기"
 #: 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/settingsaction.php:72
@@ -1018,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:637
 msgid "Delete this notice"
 msgstr "이 게시글 삭제하기"
 
@@ -1281,7 +1280,7 @@ msgstr "설명이 너무 길어요. (최대 140글자)"
 msgid "Could not update group."
 msgstr "그룹을 업데이트 할 수 없습니다."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "좋아하는 게시글을 생성할 수 없습니다."
@@ -2366,7 +2365,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "지원하는 형식의 데이터가 아닙니다."
 
@@ -2822,24 +2821,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
 #, 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "설정 저장"
 
@@ -3222,7 +3221,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "다른 마이크로블로깅 서비스의 귀하의 프로필 URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "구독"
 
@@ -3265,7 +3264,7 @@ msgstr "라이선스에 동의하지 않는다면 등록할 수 없습니다."
 msgid "You already repeated that notice."
 msgstr "당신은 이미 이 사용자를 차단하고 있습니다."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "생성"
@@ -3963,15 +3962,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 "구독하였습니다."
 
@@ -4031,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 "
@@ -4041,16 +4051,16 @@ 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"
 
@@ -4474,23 +4484,23 @@ msgstr "새 URI와 함께 메시지를 업데이트할 수 없습니다."
 msgid "DB error inserting hashtag: %s"
 msgstr "해쉬테그를 추가 할 때에 데이타베이스 에러 : %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "게시글 저장문제. 알려지지않은 회원"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4499,39 +4509,61 @@ msgstr ""
 "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 "
 "해보세요."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었습니다."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "통지를 저장하는데 문제가 발생했습니다."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "%2$s에서 %1$s까지 메시지"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "새 그룹을 만들 수 없습니다."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "그룹 맴버십을 세팅할 수 없습니다."
 
@@ -4737,26 +4769,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "모든 것"
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "라이선스"
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "페이지수"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "뒷 페이지"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "앞 페이지"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5071,80 +5115,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 +5211,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 +5239,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "확인 코드가 없습니다."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "이 사이트 로그인"
@@ -5619,7 +5673,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 "다음에서:"
@@ -5743,51 +5797,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:558
 #, fuzzy
 msgid "in context"
 msgstr "내용이 없습니다!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "생성"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "이 게시글에 대해 답장하기"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "답장하기"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "게시글이 등록되었습니다."
@@ -5821,11 +5875,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 "예약 구독을 추가 할 수 없습니다."
@@ -6013,36 +6062,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "예약 구독을 삭제 할 수 없습니다."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6096,68 +6115,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:952
 msgid "a few seconds ago"
 msgstr "몇 초 전"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "1분 전"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d분 전"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "1시간 전"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d시간 전"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "하루 전"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "%d일 전"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "1달 전"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "%d달 전"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "1년 전"
 
index 92209e72ea0a45772c5e0db955cfea57bfd2118e..14efaf620dfba574d5b950464e97edaf57c66838 100644 (file)
@@ -9,12 +9,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:23+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:18+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr "Оневозможи нови регистрации."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -101,7 +101,6 @@ msgstr "Нема таква страница"
 #: 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
 msgid "No such user."
 msgstr "Нема таков корисник."
 
@@ -172,8 +171,8 @@ msgstr ""
 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!"
@@ -194,12 +193,12 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API методот не е пронајден."
 
@@ -502,7 +501,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."
@@ -646,7 +645,7 @@ 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."
@@ -657,7 +656,7 @@ msgstr "Подновувања на %1$s омилени на %2$s / %2$s."
 msgid "%s timeline"
 msgstr "Историја на %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -673,12 +672,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,7 +687,7 @@ msgstr "%s подновуввања од сите!"
 msgid "Repeated to %s"
 msgstr "Повторено за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Повторувања на %s"
@@ -698,7 +697,7 @@ msgstr "Повторувања на %s"
 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!"
@@ -761,7 +760,7 @@ 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:637
 msgid "Delete"
 msgstr "Бриши"
 
@@ -943,7 +942,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:1197
 msgid "There was a problem with your session token."
 msgstr "Се појави проблем со Вашиот сесиски жетон."
 
@@ -972,7 +971,7 @@ msgstr "Избриши го програмов"
 #: 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/settingsaction.php:72
@@ -1003,7 +1002,7 @@ msgstr "Дали сте сигурни дека сакате да ја избр
 msgid "Do not delete this notice"
 msgstr "Не ја бриши оваа забелешка"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "Бриши ја оваа забелешка"
 
@@ -1244,7 +1243,7 @@ msgstr "описот е предолг (максимум  %d знаци)"
 msgid "Could not update group."
 msgstr "Не можев да ја подновам групата."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Не можеше да се создадат алијаси."
 
@@ -2336,7 +2335,7 @@ msgid "Only "
 msgstr "Само "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Ова не е поддржан формат на податотека."
 
@@ -2781,23 +2780,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Нагодувањата се зачувани"
 
@@ -3196,7 +3195,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 +3233,7 @@ msgstr "Не можете да повторувате сопствена заб
 msgid "You already repeated that notice."
 msgstr "Веќе ја имате повторено таа забелешка."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3951,15 +3950,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 "Претплатено"
 
@@ -4023,7 +4033,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,16 +4048,16 @@ 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 "СМС"
 
@@ -4475,22 +4485,22 @@ msgstr "Не можев да ја подновам пораката со нов
 msgid "DB error inserting hashtag: %s"
 msgstr "Грешка во базата на податоци при вметнувањето на хеш-ознака: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Проблем со зачувувањето на белешката. Премногу долго."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблем со зачувувањето на белешката. Непознат корисник."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Премногу забелњшки за прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4498,38 +4508,58 @@ msgstr ""
 "Премногу дуплирани пораки во прекратко време; здивнете малку и продолжете за "
 "неколку минути."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "Забрането Ви е да објавувате забелешки на оваа веб-страница."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Проблем во зачувувањето на белешката."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добредојдовте на %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Не можев да ја создадам групата."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Не можев да назначам членство во групата."
 
@@ -4734,26 +4764,38 @@ msgstr ""
 "Авторските права на содржината и податоците им припаѓаат на учесниците. Сите "
 "права задржани."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Сите "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "лиценца."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Прелом на страници"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "По"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Пред"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Не можете да ја менувате оваа веб-страница."
@@ -5053,80 +5095,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
+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] "Не ни го испративте тој профил."
 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5140,6 +5192,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 +5257,19 @@ msgstr ""
 "tracks - сè уште не е имплементирано.\n"
 "tracking - сè уште не е имплементирано.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Нема пронајдено конфигурациска податотека. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr "Побарав конфигурациони податотеки на следниве места: "
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr "Препорачуваме да го пуштите инсталатерот за да го поправите ова."
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "Оди на инсталаторот."
 
@@ -5714,7 +5767,7 @@ msgstr ""
 "впуштите во разговор со други корисници. Луѓето можат да ви испраќаат пораки "
 "што ќе можете да ги видите само Вие."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "од"
 
@@ -5842,48 +5895,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:558
 msgid "in context"
 msgstr "во контекст"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Повторено од"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Одговори на забелешкава"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Одговор"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Забелешката е повторена"
 
@@ -5915,10 +5968,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 "Не може да се внесе нова претплата."
@@ -6095,35 +6144,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Претплата не може да се избрише."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6174,67 +6194,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:952
 msgid "a few seconds ago"
 msgstr "пред неколку секунди"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "пред една минута"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "пред %d минути"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "пред еден час"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "пред %d часа"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "пред еден ден"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "пред %d денови"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "пред еден месец"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "пред %d месеца"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "пред една година"
 
index ab74ad1dce5ad6a01cce9a41fe2a89ca6495502a..cf3daf093545327547c7ec79c52d6a6f3d8c3c19 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:26+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:22+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 (r62925); 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"
@@ -60,7 +60,7 @@ msgstr "Deaktiver nye registreringer."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -98,7 +98,6 @@ msgstr "Ingen slik side"
 #: 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
 msgid "No such user."
 msgstr "Ingen slik bruker"
 
@@ -167,8 +166,8 @@ msgstr ""
 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!"
@@ -189,12 +188,12 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API-metode ikke funnet!"
@@ -497,7 +496,7 @@ 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."
@@ -627,14 +626,14 @@ msgstr ""
 
 #: 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."
@@ -645,7 +644,7 @@ msgstr "%1$s oppdateringer markert som favoritt av %2$s / %2$s."
 msgid "%s timeline"
 msgstr "%s tidslinje"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -661,12 +660,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 +675,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
 #, 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!"
@@ -733,9 +732,8 @@ msgstr ""
 
 #: actions/avatarsettings.php:119 actions/avatarsettings.php:197
 #: actions/grouplogo.php:251
-#, fuzzy
 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
@@ -748,7 +746,7 @@ 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:637
 msgid "Delete"
 msgstr "Slett"
 
@@ -774,12 +772,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."
@@ -858,11 +855,11 @@ msgstr ""
 
 #: 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."
@@ -879,7 +876,7 @@ msgstr ""
 
 #: 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 +889,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 +898,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"
@@ -913,31 +910,27 @@ msgid "Notices"
 msgstr ""
 
 #: 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:1197
 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,21 +938,22 @@ 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"
 
 #: 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/settingsaction.php:72
@@ -975,6 +969,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 +984,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:637
 msgid "Delete this notice"
 msgstr "Slett denne notisen"
 
@@ -1009,6 +1005,8 @@ msgid ""
 "Are you sure you want to delete this user? This will clear all data about "
 "the user from the database, without a backup."
 msgstr ""
+"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
 msgid "Delete this user"
@@ -1024,9 +1022,8 @@ 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
@@ -1126,7 +1123,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 +1132,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."
@@ -1234,7 +1228,7 @@ msgstr "beskrivelse er for lang (maks %d tegn)"
 msgid "Could not update group."
 msgstr "Kunne ikke oppdatere gruppe."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Kunne ikke opprette alias."
 
@@ -1243,9 +1237,8 @@ msgid "Options saved."
 msgstr ""
 
 #: actions/emailsettings.php:60
-#, fuzzy
 msgid "Email settings"
-msgstr "Innstillinger for e-post"
+msgstr "E-postinnstillinger"
 
 #: actions/emailsettings.php:71
 #, php-format
@@ -1403,7 +1396,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 +1426,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."
@@ -2272,7 +2265,7 @@ msgid "Only "
 msgstr "Bare "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2715,25 +2708,25 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr ""
 
@@ -3108,7 +3101,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 +3139,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:656
 msgid "Repeated"
 msgstr "Gjentatt"
 
@@ -3830,17 +3823,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 +3902,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,17 +3912,17 @@ 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 ""
 
@@ -4329,58 +4331,79 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1407
 #, 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/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:385
+#: classes/User.php:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Klarte ikke å lagre avatar-informasjonen"
@@ -4582,27 +4605,39 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "Tidligere »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4904,83 +4939,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 +5039,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 +5067,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Fant ikke bekreftelseskode."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5458,7 +5504,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"
@@ -5583,50 +5629,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Opprett"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "svar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Nytt nick"
@@ -5659,10 +5705,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 ""
@@ -5848,36 +5890,6 @@ 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."
-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."
-msgstr ""
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -5931,68 +5943,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:952
 msgid "a few seconds ago"
 msgstr "noen få sekunder siden"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "omtrent ett minutt siden"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "omtrent %d minutter siden"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "omtrent én time siden"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "omtrent %d timer siden"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "omtrent én dag siden"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "omtrent %d dager siden"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "omtrent én måned siden"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "omtrent %d måneder siden"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "omtrent ett år siden"
 
index b1a54d06a22cf2e376e70573f9de88a4e49384d7..1cd71ad86814eb5e9be4d0d5e39abe4d76c1fd94 100644 (file)
@@ -10,12 +10,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:32+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:28+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 (r62925); 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"
@@ -62,7 +62,7 @@ msgstr "Nieuwe registraties uitschakelen."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -100,7 +100,6 @@ msgstr "Deze pagina bestaat niet"
 #: 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
 msgid "No such user."
 msgstr "Onbekende gebruiker."
 
@@ -171,8 +170,8 @@ msgstr ""
 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."
@@ -193,12 +192,12 @@ msgstr "Updates van %1$s en vrienden op %2$s."
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "De API-functie is niet aangetroffen."
 
@@ -506,7 +505,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."
@@ -656,7 +655,7 @@ 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"
@@ -667,7 +666,7 @@ msgstr "%1$s updates op de favorietenlijst geplaatst door %2$s / %3$s"
 msgid "%s timeline"
 msgstr "%s tijdlijn"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -683,12 +682,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,7 +697,7 @@ 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"
@@ -708,7 +707,7 @@ msgstr "Herhaald van %s"
 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!"
@@ -770,7 +769,7 @@ 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:637
 msgid "Delete"
 msgstr "Verwijderen"
 
@@ -952,7 +951,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:1197
 msgid "There was a problem with your session token."
 msgstr "Er is een probleem met uw sessietoken."
 
@@ -981,7 +980,7 @@ msgstr "Deze applicatie verwijderen"
 #: 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/settingsaction.php:72
@@ -1012,7 +1011,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:637
 msgid "Delete this notice"
 msgstr "Deze mededeling verwijderen"
 
@@ -1254,7 +1253,7 @@ msgstr "de beschrijving is te lang (maximaal %d tekens)"
 msgid "Could not update group."
 msgstr "Het was niet mogelijk de groep bij te werken."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Het was niet mogelijk de aliassen aan te maken."
 
@@ -2355,7 +2354,7 @@ msgid "Only "
 msgstr "Alleen "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Geen ondersteund gegevensformaat."
 
@@ -2798,25 +2797,25 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "De instellingen zijn opgeslagen."
 
@@ -3217,7 +3216,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 +3254,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:656
 msgid "Repeated"
 msgstr "Herhaald"
 
@@ -3975,15 +3974,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 ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Het bestand bestaat niet."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "U bent niet geabonneerd op dat profiel."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Geabonneerd"
 
@@ -4047,7 +4057,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,16 +4073,16 @@ 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"
 
@@ -4503,26 +4513,26 @@ msgstr "Het was niet mogelijk het bericht bij te werken met de nieuwe URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Er is een databasefout opgetreden bij de invoer van de hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 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:226
 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:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4530,42 +4540,60 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Het was niet mogelijk de groep aan te maken."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Het was niet mogelijk het groepslidmaatschap in te stellen."
 
@@ -4770,26 +4798,38 @@ msgstr ""
 "Auteursrechten op inhoud en gegevens rusten bij de respectievelijke "
 "gebruikers. Alle rechten voorbehouden."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Alle "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licentie."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Later"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Eerder"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "U mag geen wijzigingen maken aan deze website."
@@ -5091,83 +5131,93 @@ 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
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Uw abonnement op %s is opgezegd"
+
+#: 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5181,6 +5231,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"
@@ -5247,20 +5298,20 @@ msgstr ""
 "tracks - nog niet beschikbaar\n"
 "tracking - nog niet beschikbaar\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Er is geen instellingenbestand aangetroffen. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Naar het installatieprogramma gaan."
 
@@ -5757,7 +5808,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"
 
@@ -5885,48 +5936,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:558
 msgid "in context"
 msgstr "in context"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Herhaald door"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Op deze mededeling antwoorden"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Antwoorden"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Mededeling herhaald"
 
@@ -5959,10 +6010,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."
@@ -6139,34 +6186,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kon abonnement niet verwijderen."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6217,67 +6236,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:952
 msgid "a few seconds ago"
 msgstr "een paar seconden geleden"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "ongeveer een minuut geleden"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "ongeveer %d minuten geleden"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "ongeveer een uur geleden"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "ongeveer %d uur geleden"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "ongeveer een dag geleden"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "ongeveer %d dagen geleden"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "ongeveer een maand geleden"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "ongeveer %d maanden geleden"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "ongeveer een jaar geleden"
 
index e3e2cf80ed86f95abd7cfb33462358e4c7820208..55918d8802f74df4afe16bc2d6ef2e3ea55bd10d 100644 (file)
@@ -7,12 +7,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:29+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:25+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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -105,7 +105,6 @@ msgstr "Dette emneord finst ikkje."
 #: 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
 msgid "No such user."
 msgstr "Brukaren finst ikkje."
 
@@ -168,8 +167,8 @@ msgstr ""
 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!"
@@ -190,12 +189,12 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Fann ikkje API-metode."
@@ -507,7 +506,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."
@@ -652,7 +651,7 @@ 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."
@@ -663,7 +662,7 @@ msgstr "%s oppdateringar favorisert av %s / %s."
 msgid "%s timeline"
 msgstr "%s tidsline"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -679,12 +678,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,7 +693,7 @@ 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"
@@ -704,7 +703,7 @@ msgstr "Svar til %s"
 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!"
@@ -766,7 +765,7 @@ 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:637
 msgid "Delete"
 msgstr "Slett"
 
@@ -955,7 +954,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:1197
 msgid "There was a problem with your session token."
 msgstr "Det var eit problem med sesjons billetten din."
 
@@ -984,7 +983,7 @@ msgstr "Slett denne notisen"
 #: 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/settingsaction.php:72
@@ -1017,7 +1016,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:637
 msgid "Delete this notice"
 msgstr "Slett denne notisen"
 
@@ -1280,7 +1279,7 @@ msgstr "skildringa er for lang (maks 140 teikn)."
 msgid "Could not update group."
 msgstr "Kann ikkje oppdatera gruppa."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Kunne ikkje lagre favoritt."
@@ -2371,7 +2370,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Ikkje eit støtta dataformat."
 
@@ -2831,24 +2830,24 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Lagra innstillingar."
 
@@ -3235,7 +3234,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 +3277,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Lag"
@@ -3977,15 +3976,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: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:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Abonnent"
 
@@ -4045,7 +4055,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,16 +4065,16 @@ 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"
 
@@ -4493,22 +4503,22 @@ msgstr "Kunne ikkje oppdatere melding med ny URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "databasefeil ved innsetjing av skigardmerkelapp (#merkelapp): %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Feil ved lagring av notis.  Ukjend brukar."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 #, fuzzy
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
@@ -4516,39 +4526,61 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Eit problem oppstod ved lagring av notis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Kunne ikkje laga gruppa."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Kunne ikkje bli med i gruppa."
 
@@ -4754,26 +4786,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Alle"
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "lisens."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginering"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "« Etter"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Før »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5088,83 +5132,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 +5231,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 +5259,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Ingen stadfestingskode."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "Logg inn or sida"
@@ -5646,7 +5700,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å "
@@ -5770,51 +5824,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:558
 #, fuzzy
 msgid "in context"
 msgstr "Ingen innhald."
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Lag"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Svar på denne notisen"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Svar"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Melding lagra"
@@ -5848,11 +5902,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."
@@ -6040,36 +6089,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kan ikkje sletta tinging."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6123,68 +6142,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:952
 msgid "a few seconds ago"
 msgstr "eit par sekund sidan"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "omtrent eitt minutt sidan"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "~%d minutt sidan"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "omtrent ein time sidan"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "~%d timar sidan"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "omtrent ein dag sidan"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "~%d dagar sidan"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "omtrent ein månad sidan"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "~%d månadar sidan"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "omtrent eitt år sidan"
 
index a13f6362b4e47e358c325051555ccc6b76b641be..79b37a5e4c9a637a16253f1345bf57dd23177efb 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:31+0000\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -19,7 +19,7 @@ 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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr "Wyłączenie nowych rejestracji."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -103,7 +103,6 @@ msgstr "Nie ma takiej strony"
 #: 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
 msgid "No such user."
 msgstr "Brak takiego użytkownika."
 
@@ -174,8 +173,8 @@ msgstr ""
 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."
@@ -196,12 +195,12 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s."
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Nie odnaleziono metody API."
 
@@ -503,7 +502,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."
@@ -644,7 +643,7 @@ 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."
@@ -655,7 +654,7 @@ msgstr "Użytkownik %1$s aktualizuje ulubione według %2$s/%2$s."
 msgid "%s timeline"
 msgstr "Oś czasu użytkownika %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -671,12 +670,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,7 +685,7 @@ 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"
@@ -696,7 +695,7 @@ msgstr "Powtórzenia %s"
 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."
@@ -757,7 +756,7 @@ 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:637
 msgid "Delete"
 msgstr "Usuń"
 
@@ -938,7 +937,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:1197
 msgid "There was a problem with your session token."
 msgstr "Wystąpił problem z tokenem sesji."
 
@@ -966,7 +965,7 @@ msgstr "Usuń tę aplikację"
 #: 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/settingsaction.php:72
@@ -997,7 +996,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:637
 msgid "Delete this notice"
 msgstr "Usuń ten wpis"
 
@@ -1236,7 +1235,7 @@ msgstr "opis jest za długi (maksymalnie %d znaków)."
 msgid "Could not update group."
 msgstr "Nie można zaktualizować grupy."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Nie można utworzyć aliasów."
 
@@ -2315,7 +2314,7 @@ msgid "Only "
 msgstr "Tylko "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "To nie jest obsługiwany format danych."
 
@@ -2757,23 +2756,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Zapisano ustawienia."
 
@@ -3169,7 +3168,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 +3206,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:656
 msgid "Repeated"
 msgstr "Powtórzono"
 
@@ -3919,15 +3918,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 ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Nie ma takiego pliku."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Nie jesteś subskrybowany do tego profilu."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Subskrybowano"
 
@@ -3991,7 +4001,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,16 +4017,16 @@ 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"
 
@@ -4444,22 +4454,22 @@ msgstr "Nie można zaktualizować wiadomości za pomocą nowego adresu URL."
 msgid "DB error inserting hashtag: %s"
 msgstr "Błąd bazy danych podczas wprowadzania znacznika mieszania: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problem podczas zapisywania wpisu. Za długi."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem podczas zapisywania wpisu. Nieznany użytkownik."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4467,38 +4477,57 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problem podczas zapisywania wpisu."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Nie można utworzyć grupy."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Nie można ustawić członkostwa w grupie."
 
@@ -4703,26 +4732,38 @@ 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:827
 msgid "All "
 msgstr "Wszystko "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licencja."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginacja"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Później"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Wcześniej"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Nie można wprowadzić zmian witryny."
@@ -5021,85 +5062,95 @@ 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
+#, fuzzy, 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5113,6 +5164,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"
@@ -5179,19 +5231,19 @@ msgstr ""
 "tracks - jeszcze nie zaimplementowano\n"
 "tracking - jeszcze nie zaimplementowano\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Nie odnaleziono pliku konfiguracji."
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Przejdź do instalatora."
 
@@ -5688,7 +5740,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"
 
@@ -5811,48 +5863,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:558
 msgid "in context"
 msgstr "w rozmowie"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Powtórzone przez"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Odpowiedz na ten wpis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Odpowiedz"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Powtórzono wpis"
 
@@ -5884,10 +5936,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."
@@ -6065,34 +6113,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Nie można usunąć subskrypcji."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6143,67 +6163,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:952
 msgid "a few seconds ago"
 msgstr "kilka sekund temu"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "około minutę temu"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "około %d minut temu"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "około godzinę temu"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "około %d godzin temu"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "blisko dzień temu"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "około %d dni temu"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "około miesiąc temu"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "około %d miesięcy temu"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "około rok temu"
 
index a2c8fd60cc438ffdb729c2f23fe30b101e26b6b0..e742dda19723d740a33800bb5ad2aafec31f780d 100644 (file)
@@ -9,12 +9,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:39+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:34+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr "Impossibilitar registos novos."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -102,7 +102,6 @@ msgstr "Página não encontrada."
 #: 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
 msgid "No such user."
 msgstr "Utilizador não encontrado."
 
@@ -171,8 +170,8 @@ msgstr ""
 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!"
@@ -193,12 +192,12 @@ msgstr "Actualizações de %1$s e amigos no %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Método da API não encontrado."
 
@@ -500,7 +499,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."
@@ -642,7 +641,7 @@ 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."
@@ -653,7 +652,7 @@ msgstr "%1$s actualizações preferidas por %2$s / %2$s."
 msgid "%s timeline"
 msgstr "Notas de %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -669,12 +668,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,7 +683,7 @@ 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"
@@ -694,7 +693,7 @@ msgstr "Repetências de %s"
 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!"
@@ -755,7 +754,7 @@ 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:637
 msgid "Delete"
 msgstr "Apagar"
 
@@ -940,7 +939,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:1197
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com a sua sessão."
 
@@ -972,7 +971,7 @@ msgstr "Apagar esta nota"
 #: 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/settingsaction.php:72
@@ -1003,7 +1002,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:637
 msgid "Delete this notice"
 msgstr "Apagar esta nota"
 
@@ -1256,7 +1255,7 @@ msgstr "descrição é demasiada extensa (máx. %d caracteres)."
 msgid "Could not update group."
 msgstr "Não foi possível actualizar o grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Não foi possível criar sinónimos."
 
@@ -2348,7 +2347,7 @@ msgid "Only "
 msgstr "Apenas "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Formato de dados não suportado."
 
@@ -2795,23 +2794,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Configurações gravadas."
 
@@ -3210,7 +3209,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 +3247,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:656
 msgid "Repeated"
 msgstr "Repetida"
 
@@ -3964,15 +3963,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 +4046,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,16 +4062,16 @@ 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"
 
@@ -4489,22 +4499,22 @@ msgstr "Não foi possível actualizar a mensagem com a nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro na base de dados ao inserir a marca: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problema na gravação da nota. Demasiado longa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema na gravação da nota. Utilizador desconhecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4512,39 +4522,58 @@ msgstr ""
 "Demasiadas mensagens duplicadas, demasiado rápido; descanse e volte a "
 "publicar daqui a alguns minutos."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problema na gravação da nota."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar membros do grupo."
 
@@ -4745,26 +4774,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Tudo "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Posteriores"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Anteriores"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Não pode fazer alterações a este site."
@@ -5066,82 +5107,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 +5207,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 +5272,19 @@ msgstr ""
 "tracks - ainda não implementado.\n"
 "tracking - ainda não implementado.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Ficheiro de configuração não encontrado. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Ir para o instalador."
 
@@ -5727,7 +5780,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"
 
@@ -5852,48 +5905,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:558
 msgid "in context"
 msgstr "no contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Repetida por"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Responder a esta nota"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Nota repetida"
 
@@ -5925,10 +5978,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."
@@ -6105,34 +6154,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Não foi possível apagar a subscrição."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6183,67 +6204,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:952
 msgid "a few seconds ago"
 msgstr "há alguns segundos"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "há cerca de um minuto"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "há cerca de %d minutos"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "há cerca de uma hora"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "há cerca de %d horas"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "há cerca de um dia"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "há cerca de %d dias"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "há cerca de um mês"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "há cerca de %d meses"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "há cerca de um ano"
 
index b9ffc361b4831a0dce2731f5b9b841d3a049177f..18659cecf545b5f1fd1ec3d9999e68cd77903b41 100644 (file)
@@ -11,12 +11,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:37+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr "Desabilita novos registros."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -101,7 +101,6 @@ msgstr "Esta página não existe."
 #: 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
 msgid "No such user."
 msgstr "Este usuário não existe."
 
@@ -195,11 +194,11 @@ msgstr "Atualizações de %1$s e amigos no %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "O método da API não foi encontrado!"
 
@@ -503,7 +502,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."
@@ -763,7 +762,7 @@ 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:637
 msgid "Delete"
 msgstr "Excluir"
 
@@ -945,7 +944,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:1197
 msgid "There was a problem with your session token."
 msgstr "Ocorreu um problema com o seu token de sessão."
 
@@ -974,7 +973,7 @@ msgstr "Excluir esta aplicação"
 #: 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/settingsaction.php:72
@@ -1005,7 +1004,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:637
 msgid "Delete this notice"
 msgstr "Excluir esta mensagem"
 
@@ -1246,7 +1245,7 @@ msgstr "descrição muito extensa (máximo %d caracteres)."
 msgid "Could not update group."
 msgstr "Não foi possível atualizar o grupo."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Não foi possível criar os apelidos."
 
@@ -2343,7 +2342,7 @@ msgid "Only "
 msgstr "Apenas "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Não é um formato de dados suportado."
 
@@ -2786,23 +2785,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "As configurações foram salvas."
 
@@ -3202,7 +3201,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 +3238,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:656
 msgid "Repeated"
 msgstr "Repetida"
 
@@ -3254,9 +3253,9 @@ msgid "Replies to %s"
 msgstr "Respostas para %s"
 
 #: actions/replies.php:127
-#, fuzzy, php-format
+#, 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
 #, php-format
@@ -3324,9 +3323,8 @@ 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"
@@ -3381,9 +3379,9 @@ 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,14 +3424,13 @@ 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."
@@ -3493,9 +3490,9 @@ 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
 msgid "Group profile"
@@ -3618,9 +3615,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 +3951,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:69
+#: 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:145
 msgid "Subscribed"
 msgstr "Assinado"
 
@@ -4026,7 +4034,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,23 +4050,23 @@ 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
+#, 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
 #, php-format
@@ -4343,9 +4351,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"
@@ -4479,22 +4487,22 @@ msgstr "Não foi possível atualizar a mensagem com a nova URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Erro no banco de dados durante a inserção da hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problema no salvamento da mensagem. Ela é muito extensa."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problema no salvamento da mensagem. Usuário desconhecido."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4502,39 +4510,57 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problema no salvamento da mensagem."
 
-#: classes/Notice.php:788
-#, fuzzy
+#: classes/Notice.php:882
 msgid "Problem saving group inbox."
-msgstr "Problema no salvamento da mensagem."
-
-#: classes/Notice.php:848
-#, php-format
-msgid "DB error inserting reply: %s"
-msgstr "Erro no banco de dados na inserção da reposta: %s"
+msgstr "Problema no salvamento das mensagens recebidas do grupo."
 
-#: classes/Notice.php:1271
+#: classes/Notice.php:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Não foi possível criar o grupo."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Não foi possível configurar a associação ao grupo."
 
@@ -4737,26 +4763,38 @@ msgstr ""
 "Conteúdo e dados licenciados pelos colaboradores. Todos os direitos "
 "reservados."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Todas "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licença."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Paginação"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Próximo"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Anterior"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Você não pode fazer alterações neste site."
@@ -4786,32 +4824,33 @@ msgid "Design configuration"
 msgstr "Configuração da aparência"
 
 #: lib/adminpanelaction.php:322
-#, fuzzy
 msgid "User configuration"
-msgstr "Configuração dos caminhos"
+msgstr "Configuração do usuário"
 
 #: lib/adminpanelaction.php:327
-#, fuzzy
 msgid "Access configuration"
-msgstr "Configuração da aparência"
+msgstr "Configuração do acesso"
 
 #: lib/adminpanelaction.php:332
 msgid "Paths configuration"
 msgstr "Configuração dos caminhos"
 
 #: lib/adminpanelaction.php:337
-#, fuzzy
 msgid "Sessions configuration"
-msgstr "Configuração da aparência"
+msgstr "Configuração das sessões"
 
 #: lib/apiauth.php:95
 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
 #, 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"
@@ -5056,82 +5095,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 +5194,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 +5260,19 @@ msgstr ""
 "tracks -  não implementado ainda\n"
 "tracking -  não implementado ainda\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Não foi encontrado nenhum arquivo de configuração. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Ir para o instalador."
 
@@ -5717,7 +5767,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"
 
@@ -5845,48 +5895,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:558
 msgid "in context"
 msgstr "no contexto"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Repetida por"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Responder a esta mensagem"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Responder"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Mensagem repetida"
 
@@ -5918,10 +5968,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."
@@ -6029,7 +6075,7 @@ msgstr "Repetir esta mensagem"
 
 #: lib/router.php:665
 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"
@@ -6098,34 +6144,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Não foi possível excluir a assinatura."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6176,67 +6194,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:952
 msgid "a few seconds ago"
 msgstr "alguns segundos atrás"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "cerca de 1 minuto atrás"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "cerca de %d minutos atrás"
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "cerca de 1 hora atrás"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "cerca de %d horas atrás"
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "cerca de 1 dia atrás"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "cerca de %d dias atrás"
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "cerca de 1 mês atrás"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "cerca de %d meses atrás"
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "cerca de 1 ano atrás"
 
index da1345a0d6359f419a7d374f618bd33a61ef97f8..d4df1a654898d1831d01362b6f618619c47aa8c6 100644 (file)
@@ -12,12 +12,12 @@ 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-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:41+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 (r62925); 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"
@@ -66,7 +66,7 @@ msgstr "Отключить новые регистрации."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -104,7 +104,6 @@ msgstr "Нет такой страницы"
 #: 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
 msgid "No such user."
 msgstr "Нет такого пользователя."
 
@@ -196,11 +195,11 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!"
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "Метод API не найден."
 
@@ -505,7 +504,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."
@@ -761,7 +760,7 @@ 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:637
 msgid "Delete"
 msgstr "Удалить"
 
@@ -942,7 +941,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:1197
 msgid "There was a problem with your session token."
 msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста."
 
@@ -971,7 +970,7 @@ msgstr "Удалить это приложение"
 #: 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/settingsaction.php:72
@@ -1002,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:637
 msgid "Delete this notice"
 msgstr "Удалить эту запись"
 
@@ -1243,7 +1242,7 @@ msgstr "Слишком длинное описание (максимум %d си
 msgid "Could not update group."
 msgstr "Не удаётся обновить информацию о группе."
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Не удаётся создать алиасы."
 
@@ -2335,7 +2334,7 @@ msgid "Only "
 msgstr "Только "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Неподдерживаемый формат данных."
 
@@ -2775,23 +2774,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Настройки сохранены."
 
@@ -3188,7 +3187,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 +3223,7 @@ msgstr "Вы не можете повторить собственную зап
 msgid "You already repeated that notice."
 msgstr "Вы уже повторили эту запись."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "Повторено"
 
@@ -3942,15 +3941,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 "Подписано"
 
@@ -4014,7 +4024,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,16 +4040,16 @@ 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 "СМС"
 
@@ -4464,22 +4474,22 @@ msgstr "Не удаётся обновить сообщение с новым UR
 msgid "DB error inserting hashtag: %s"
 msgstr "Ошибка баз данных при вставке хеш-тегов для %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Проблемы с сохранением записи. Слишком длинно."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при сохранении записи. Неизвестный пользователь."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Слишком много записей за столь короткий срок; передохните немного и "
 "попробуйте вновь через пару минут."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4487,38 +4497,57 @@ msgstr ""
 "Слишком много одинаковых записей за столь короткий срок; передохните немного "
 "и попробуйте вновь через пару минут."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "Вам запрещено поститься на этом сайте (бан)"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Проблемы с сохранением записи."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Добро пожаловать на %1$s, @%2$s!"
 
-#: classes/User_group.php:413
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Не удаётся создать группу."
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Не удаётся назначить членство в группе."
 
@@ -4723,26 +4752,38 @@ msgstr ""
 "Авторские права на содержание и данные принадлежат разработчикам. Все права "
 "защищены."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "All "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "license."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Разбиение на страницы"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Сюда"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Туда"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Вы не можете изменять этот сайт."
@@ -5041,83 +5082,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
+#, 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] "Вы подписаны на этих людей:"
 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5131,6 +5182,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"
@@ -5195,19 +5247,19 @@ msgstr ""
 "tracks — пока не реализовано.\n"
 "tracking — пока не реализовано.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Конфигурационный файл не найден. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr "Конфигурационные файлы искались в следующих местах: "
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr "Возможно, вы решите запустить установщик для исправления этого."
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "Перейти к установщику"
 
@@ -5703,7 +5755,7 @@ msgstr ""
 "вовлечения других пользователей в разговор. Сообщения, получаемые от других "
 "людей, видите только вы."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "от "
 
@@ -5828,48 +5880,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:558
 msgid "in context"
 msgstr "в контексте"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Повторено"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Ответить на эту запись"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Ответить"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Запись повторена"
 
@@ -5901,10 +5953,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 "Не удаётся вставить новую подписку."
@@ -6081,34 +6129,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Не удаётся удалить подписку."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6159,67 +6179,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:952
 msgid "a few seconds ago"
 msgstr "пару секунд назад"
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "около минуты назад"
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "около %d минут(ы) назад"
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "около часа назад"
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "около %d часа(ов) назад"
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "около дня назад"
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "около %d дня(ей) назад"
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "около месяца назад"
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "около %d месяца(ев) назад"
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "около года назад"
 
index d1ee56f2ca67e0c360e4bd55b8e83e373c7494d0..cf44e2d3c960111c3679c3283fb8a86b6278abe0 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-02-24 23:49+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"
@@ -58,7 +58,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -96,7 +96,6 @@ msgstr ""
 #: 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
 msgid "No such user."
 msgstr ""
 
@@ -181,11 +180,11 @@ msgstr ""
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr ""
 
@@ -481,7 +480,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."
@@ -731,7 +730,7 @@ 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:637
 msgid "Delete"
 msgstr ""
 
@@ -909,7 +908,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -935,7 +934,7 @@ msgstr ""
 #: 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/settingsaction.php:72
@@ -964,7 +963,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr ""
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr ""
 
@@ -1201,7 +1200,7 @@ msgstr ""
 msgid "Could not update group."
 msgstr ""
 
-#: actions/editgroup.php:259 classes/User_group.php:423
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr ""
 
@@ -2196,7 +2195,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2628,23 +2627,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr ""
 
@@ -2997,7 +2996,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 +3032,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr ""
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr ""
 
@@ -3697,15 +3696,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: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 ""
+
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr ""
 
@@ -3765,7 +3773,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,16 +3783,16 @@ 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 ""
 
@@ -4178,57 +4186,76 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr ""
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr ""
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 msgid "Problem saving group inbox."
 msgstr ""
 
-#: classes/Notice.php:848
+#: classes/Notice.php:1407
 #, 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/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:385
+#: classes/User.php:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:413
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr ""
 
-#: classes/User_group.php:442
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr ""
 
@@ -4424,26 +4451,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr ""
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4734,80 +4773,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 +4869,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 +4897,19 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr ""
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5266,7 +5315,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 ""
 
@@ -5386,48 +5435,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:558
 msgid "in context"
 msgstr ""
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr ""
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr ""
 
@@ -5459,10 +5508,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 ""
@@ -5639,34 +5684,6 @@ 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."
-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"
@@ -5717,67 +5734,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:952
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:873
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:875
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:877
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:879
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:881
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:883
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:885
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:887
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:889
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr ""
 
index a0d407c5c86645bc5e45b09f98c1106d771eed65..b09823e6bef52d96c6a41f1150b91b68c4362b07 100644 (file)
@@ -9,12 +9,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:57+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:44+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 (r62925); 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"
@@ -62,7 +62,7 @@ msgstr "Inaktivera nya registreringar."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -100,7 +100,6 @@ msgstr "Ingen sådan sida"
 #: 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
 msgid "No such user."
 msgstr "Ingen sådan användare."
 
@@ -169,8 +168,8 @@ msgstr ""
 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!"
@@ -191,12 +190,12 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API-metod hittades inte."
 
@@ -495,7 +494,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."
@@ -635,7 +634,7 @@ 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."
@@ -646,7 +645,7 @@ msgstr "%1$s uppdateringar markerade som favorit av %2$s / %2$s."
 msgid "%s timeline"
 msgstr "%s tidslinje"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -662,12 +661,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,7 +676,7 @@ 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"
@@ -687,7 +686,7 @@ msgstr "Upprepningar av %s"
 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!"
@@ -749,7 +748,7 @@ 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:637
 msgid "Delete"
 msgstr "Ta bort"
 
@@ -931,7 +930,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:1197
 msgid "There was a problem with your session token."
 msgstr "Det var ett problem med din sessions-token."
 
@@ -960,7 +959,7 @@ msgstr "Ta bort denna applikation"
 #: 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/settingsaction.php:72
@@ -991,7 +990,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:637
 msgid "Delete this notice"
 msgstr "Ta bort denna notis"
 
@@ -1232,7 +1231,7 @@ msgstr "beskrivning är för lång (max %d tecken)."
 msgid "Could not update group."
 msgstr "Kunde inte uppdatera grupp."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Kunde inte skapa alias."
 
@@ -2315,7 +2314,7 @@ msgid "Only "
 msgstr "Bara "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Ett dataformat som inte stödjs"
 
@@ -2756,23 +2755,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Inställningar sparade."
 
@@ -3171,7 +3170,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 +3208,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:656
 msgid "Repeated"
 msgstr "Upprepad"
 
@@ -3918,15 +3917,26 @@ 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 ""
+
+#: actions/subscribe.php:107
+#, fuzzy
+msgid "No such profile."
+msgstr "Ingen sådan fil."
+
+#: actions/subscribe.php:117
+#, fuzzy
+msgid "You cannot subscribe to an OMB 0.1 remote profile with this action."
+msgstr "Du är inte prenumerat hos den profilen."
 
-#: actions/subscribe.php:69
+#: actions/subscribe.php:145
 msgid "Subscribed"
 msgstr "Prenumerant"
 
@@ -3990,7 +4000,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,16 +4016,16 @@ 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"
 
@@ -4443,22 +4453,22 @@ msgstr "Kunde inte uppdatera meddelande med ny URI."
 msgid "DB error inserting hashtag: %s"
 msgstr "Databasfel vid infogning av hashtag: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Problem vid sparande av notis. För långt."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Problem vid sparande av notis. Okänd användare."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 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:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4466,38 +4476,57 @@ 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:243
 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:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Problem med att spara notis."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, 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:423
 msgid "Could not create group."
 msgstr "Kunde inte skapa grupp."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Kunde inte ställa in gruppmedlemskap."
 
@@ -4699,26 +4728,38 @@ 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:827
 msgid "All "
 msgstr "Alla "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "licens."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Numrering av sidor"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Senare"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Tidigare"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Du kan inte göra förändringar av denna webbplats."
@@ -5016,81 +5057,91 @@ 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
+#, fuzzy, php-format
+msgid "Unsubscribed  %s"
+msgstr "Prenumeration hos %s avslutad"
+
+#: 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5104,6 +5155,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"
@@ -5168,19 +5220,19 @@ msgstr ""
 "tracks - inte implementerat än.\n"
 "tracking - inte implementerat än.\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Ingen konfigurationsfil hittades. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 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:139
 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:140
 msgid "Go to the installer."
 msgstr "Gå till installeraren."
 
@@ -5673,7 +5725,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"
 
@@ -5799,48 +5851,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:558
 msgid "in context"
 msgstr "i sammanhang"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Upprepad av"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Svara på denna notis"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Svara"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Notis upprepad"
 
@@ -5872,10 +5924,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."
@@ -6052,34 +6100,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Kunde inte ta bort prenumeration."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6130,67 +6150,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:952
 msgid "a few seconds ago"
 msgstr "ett par sekunder sedan"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "för nån minut sedan"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "för %d minuter sedan"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "för en timma sedan"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "för %d timmar sedan"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "för en dag sedan"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "för %d dagar sedan"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "för en månad sedan"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "för %d månader sedan"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "för ett år sedan"
 
index 85719532b8eaf0bf97642aae9711f3f53ccebdbb..37a2582b3056126ffbd568da64956b4ef4e8fbe7 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:16:03+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:47+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 (r62925); 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"
@@ -62,7 +62,7 @@ msgstr "కొత్త నమోదులను అచేతనంచేయి.
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -101,7 +101,6 @@ msgstr "అటువంటి పేజీ లేదు"
 #: 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
 msgid "No such user."
 msgstr "అటువంటి వాడుకరి లేరు."
 
@@ -163,8 +162,8 @@ msgstr ""
 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 ""
@@ -185,12 +184,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "నిర్ధారణ సంకేతం కనబడలేదు."
@@ -494,7 +493,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."
@@ -633,7 +632,7 @@ 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 యొక్క మైక్రోబ్లాగు"
@@ -644,7 +643,7 @@ msgstr "%s యొక్క మైక్రోబ్లాగు"
 msgid "%s timeline"
 msgstr "%s కాలరేఖ"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -660,12 +659,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,7 +674,7 @@ msgstr "అందరి నుండి %s తాజాకరణలు!"
 msgid "Repeated to %s"
 msgstr "%sకి స్పందనలు"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "%s యొక్క పునరావృతాలు"
@@ -685,7 +684,7 @@ msgstr "%s యొక్క పునరావృతాలు"
 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 యొక్క మైక్రోబ్లాగు"
@@ -747,7 +746,7 @@ 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:637
 msgid "Delete"
 msgstr "తొలగించు"
 
@@ -927,7 +926,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -955,7 +954,7 @@ msgstr "ఈ ఉపకరణాన్ని తొలగించు"
 #: 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/settingsaction.php:72
@@ -984,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:637
 msgid "Delete this notice"
 msgstr "ఈ నోటీసుని తొలగించు"
 
@@ -1227,7 +1226,7 @@ msgstr "వివరణ చాలా పెద్దదిగా ఉంది (1
 msgid "Could not update group."
 msgstr "గుంపుని తాజాకరించలేకున్నాం."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "మారుపేర్లని సృష్టించలేకపోయాం."
 
@@ -2247,7 +2246,7 @@ msgid "Only "
 msgstr "మాత్రమే "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2694,24 +2693,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
 #, 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "అమరికలు భద్రమయ్యాయి."
 
@@ -3084,7 +3083,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 +3122,7 @@ msgstr "ఈ లైసెన్సుకి అంగీకరించకపో
 msgid "You already repeated that notice."
 msgstr "మీరు ఇప్పటికే ఆ వాడుకరిని నిరోధించారు."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "సృష్టితం"
@@ -3802,16 +3801,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: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
 #, fuzzy
 msgid "Subscribed"
 msgstr "చందాదార్లు"
@@ -3873,7 +3882,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,16 +3892,16 @@ 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 ""
 
@@ -4291,60 +4300,81 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr "ఈ సైటులో నోటీసులు రాయడం నుండి మిమ్మల్ని నిషేధించారు."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "@%2$s, %1$sకి స్వాగతం!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "గుంపుని సృష్టించలేకపోయాం."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం."
 
@@ -4549,26 +4579,38 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "అన్నీ "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "పేజీకరణ"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "తర్వాత"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "ఇంతక్రితం"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "ఈ సైటుకి మీరు మార్పులు చేయలేరు."
@@ -4875,80 +4917,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 +5013,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 +5041,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "నిర్ధారణ సంకేతం లేదు."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5434,7 +5486,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 "నుండి"
 
@@ -5558,49 +5610,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:558
 msgid "in context"
 msgstr "సందర్భంలో"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "సృష్టితం"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "ఈ నోటీసుపై స్పందించండి"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "స్పందించండి"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "నోటీసుని తొలగించాం."
@@ -5635,10 +5687,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 ""
@@ -5821,36 +5869,6 @@ 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/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 +5921,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:952
 msgid "a few seconds ago"
 msgstr "కొన్ని క్షణాల క్రితం"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "ఓ నిమిషం క్రితం"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d నిమిషాల క్రితం"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "ఒక గంట క్రితం"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d గంటల క్రితం"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "ఓ రోజు క్రితం"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "%d రోజుల క్రితం"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "ఓ నెల క్రితం"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "%d నెలల క్రితం"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "ఒక సంవత్సరం క్రితం"
 
index 5368680c6b5128409b95f6c91382e67301952dd8..149b21292d6fc7a70cd61f3b5e6a3dd425523eaf 100644 (file)
@@ -9,12 +9,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:16:08+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:50+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 (r62925); 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"
@@ -66,7 +66,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -106,7 +106,6 @@ msgstr "Böyle bir durum mesajı yok."
 #: 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
 msgid "No such user."
 msgstr "Böyle bir kullanıcı yok."
 
@@ -169,8 +168,8 @@ msgstr ""
 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 ""
@@ -191,12 +190,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Onay kodu bulunamadı."
@@ -509,7 +508,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."
@@ -655,7 +654,7 @@ 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"
@@ -666,7 +665,7 @@ msgstr "%s adli kullanicinin durum mesajlari"
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -682,12 +681,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,7 +696,7 @@ 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"
@@ -707,7 +706,7 @@ msgstr "%s için cevaplar"
 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"
@@ -771,7 +770,7 @@ 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:637
 msgid "Delete"
 msgstr ""
 
@@ -962,7 +961,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -991,7 +990,7 @@ msgstr "Kendinizi ve ilgi alanlarınızı 140 karakter ile anlatın"
 #: 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/settingsaction.php:72
@@ -1021,7 +1020,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:637
 msgid "Delete this notice"
 msgstr ""
 
@@ -1280,7 +1279,7 @@ msgstr "Hakkında bölümü çok uzun (azm 140 karakter)."
 msgid "Could not update group."
 msgstr "Kullanıcı güncellenemedi."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Avatar bilgisi kaydedilemedi"
@@ -2334,7 +2333,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2794,25 +2793,25 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Ayarlar kaydedildi."
 
@@ -3177,7 +3176,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 +3216,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Yarat"
@@ -3905,17 +3904,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 +3985,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,17 +3995,17 @@ 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 ""
 
@@ -4413,61 +4422,83 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Durum mesajını kaydederken hata oluştu."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "Avatar bilgisi kaydedilemedi"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Abonelik oluşturulamadı."
@@ -4679,28 +4710,40 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "« Sonra"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "Önce »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -5013,80 +5056,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 +5153,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 +5181,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Onay kodu yok."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5569,7 +5623,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 ""
 
@@ -5694,51 +5748,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:558
 #, fuzzy
 msgid "in context"
 msgstr "İçerik yok!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Yarat"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "cevapla"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Durum mesajları"
@@ -5772,10 +5826,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."
@@ -5962,37 +6012,6 @@ 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."
-msgstr ""
-
-#: lib/subs.php:82
-msgid "Could not subscribe other to you."
-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 +6065,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:952
 msgid "a few seconds ago"
 msgstr "birkaç saniye önce"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "yaklaşık bir dakika önce"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "yaklaşık %d dakika önce"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "yaklaşık bir saat önce"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "yaklaşık %d saat önce"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "yaklaşık bir gün önce"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "yaklaşık %d gün önce"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "yaklaşık bir ay önce"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "yaklaşık %d ay önce"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "yaklaşık bir yıl önce"
 
index 5f5fa846e69b1718169aec54b22b9ca108c989f4..c261c310da684250d26a7532dcb4688095020392 100644 (file)
@@ -10,12 +10,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:16:16+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:53+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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr "Скасувати подальшу регістрацію."
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -103,7 +103,6 @@ msgstr "Немає такої сторінки"
 #: 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
 msgid "No such user."
 msgstr "Такого користувача немає."
 
@@ -171,8 +170,8 @@ msgstr ""
 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!"
@@ -193,12 +192,12 @@ msgstr "Оновлення від %1$s та друзів на %2$s!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 msgid "API method not found."
 msgstr "API метод не знайдено."
 
@@ -500,7 +499,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."
@@ -646,7 +645,7 @@ 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."
@@ -657,7 +656,7 @@ msgstr "%1$s оновлення обраних від %2$s / %2$s."
 msgid "%s timeline"
 msgstr "%s стрічка"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -673,12 +672,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,7 +687,7 @@ msgstr "%s оновлення від усіх!"
 msgid "Repeated to %s"
 msgstr "Вторування за %s"
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr "Вторування %s"
@@ -698,7 +697,7 @@ msgstr "Вторування %s"
 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!"
@@ -759,7 +758,7 @@ 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:637
 msgid "Delete"
 msgstr "Видалити"
 
@@ -940,7 +939,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:1197
 msgid "There was a problem with your session token."
 msgstr "Виникли певні проблеми з токеном поточної сесії."
 
@@ -969,7 +968,7 @@ msgstr "Видалити додаток"
 #: 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/settingsaction.php:72
@@ -998,7 +997,7 @@ msgstr "Ви впевненні, що бажаєте видалити цей д
 msgid "Do not delete this notice"
 msgstr "Не видаляти цей допис"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr "Видалити допис"
 
@@ -1239,7 +1238,7 @@ msgstr "опис надто довгий (%d знаків максимум)."
 msgid "Could not update group."
 msgstr "Не вдалося оновити групу."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 msgid "Could not create aliases."
 msgstr "Неможна призначити додаткові імена."
 
@@ -2324,7 +2323,7 @@ msgid "Only "
 msgstr "Лише "
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Такий формат даних не підтримується."
 
@@ -2766,23 +2765,23 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Налаштування збережено."
 
@@ -3179,7 +3178,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 +3215,7 @@ msgstr "Ви не можете вторувати своїм власним до
 msgid "You already repeated that notice."
 msgstr "Ви вже вторували цьому допису."
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 msgid "Repeated"
 msgstr "Вторування"
 
@@ -3928,15 +3927,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: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 "Підписані"
 
@@ -4000,7 +4010,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,16 +4026,16 @@ 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 "СМС"
 
@@ -4450,22 +4460,22 @@ msgstr "Не можна оновити повідомлення з новим UR
 msgid "DB error inserting hashtag: %s"
 msgstr "Помилка бази даних при додаванні теґу: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 msgid "Problem saving notice. Too long."
 msgstr "Проблема при збереженні допису. Надто довге."
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 msgid "Problem saving notice. Unknown user."
 msgstr "Проблема при збереженні допису. Невідомий користувач."
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 "Дуже багато дописів за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 msgid ""
 "Too many duplicate messages too quickly; take a breather and post again in a "
 "few minutes."
@@ -4473,38 +4483,57 @@ msgstr ""
 "Дуже багато повідомлень за короткий термін; ходіть подихайте повітрям і "
 "повертайтесь за кілька хвилин."
 
-#: classes/Notice.php:235
+#: classes/Notice.php:243
 msgid "You are banned from posting notices on this site."
 msgstr "Вам заборонено надсилати дописи до цього сайту."
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Проблема при збереженні допису."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "Вітаємо на %1$s, @%2$s!"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "Не вдалося створити нову групу."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 msgid "Could not set group membership."
 msgstr "Не вдалося встановити членство."
 
@@ -4706,26 +4735,38 @@ msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 "Авторські права на зміст і дані належать розробникам. Всі права захищено."
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "Всі "
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "ліцензія."
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "Нумерація сторінок"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr "Вперед"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 msgid "Before"
 msgstr "Назад"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr "Ви не можете щось змінювати на цьому сайті."
@@ -5023,84 +5064,94 @@ 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] "Ви підписані до цієї особи:"
 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
+#, fuzzy
 msgid ""
 "Commands:\n"
 "on - turn on notifications\n"
@@ -5114,6 +5165,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 +5228,19 @@ msgstr ""
 "tracks — наразі не виконується\n"
 "tracking — наразі не виконується\n"
 
-#: lib/common.php:135
+#: lib/common.php:136
 msgid "No configuration file found. "
 msgstr "Файлу конфігурації не знайдено. "
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr "Шукав файли конфігурації в цих місцях: "
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr "Запустіть файл інсталяції, аби полагодити це."
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr "Іти до файлу інсталяції."
 
@@ -5683,7 +5735,7 @@ msgstr ""
 "повідомлення аби долучити користувачів до розмови. Такі повідомлення бачите "
 "лише Ви."
 
-#: lib/mailbox.php:227 lib/noticelist.php:477
+#: lib/mailbox.php:227 lib/noticelist.php:482
 msgid "from"
 msgstr "від"
 
@@ -5808,48 +5860,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:558
 msgid "in context"
 msgstr "в контексті"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 msgid "Repeated by"
 msgstr "Вторуванні"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr "Відповісти на цей допис"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Відповісти"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 msgid "Notice repeated"
 msgstr "Допис вторували"
 
@@ -5881,10 +5933,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 "Не вдалося додати нову підписку."
@@ -6061,34 +6109,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Не вдалося видалити підписку."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6139,67 +6159,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:952
 msgid "a few seconds ago"
 msgstr "мить тому"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "хвилину тому"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "близько %d хвилин тому"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "годину тому"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "близько %d годин тому"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "день тому"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "близько %d днів тому"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "місяць тому"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "близько %d місяців тому"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "рік тому"
 
index cf152eff5f4d063f0571a73d0287f989e8118211..4dcc584883339d2971423dbc30478ef919a3827c 100644 (file)
@@ -7,12 +7,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:16:19+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:51:57+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 (r62925); 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"
@@ -65,7 +65,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -105,7 +105,6 @@ msgstr "Không có tin nhắn nào."
 #: 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
 msgid "No such user."
 msgstr "Không có user nào."
 
@@ -168,8 +167,8 @@ msgstr ""
 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 ""
@@ -190,12 +189,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "Phương thức API không tìm thấy!"
@@ -511,7 +510,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."
@@ -656,7 +655,7 @@ 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"
@@ -667,7 +666,7 @@ msgstr "Tất cả các cập nhật của %s"
 msgid "%s timeline"
 msgstr "Dòng tin nhắn của %s"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -683,12 +682,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,7 +697,7 @@ 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"
@@ -708,7 +707,7 @@ msgstr "Trả lời cho %s"
 msgid "Notices tagged with %s"
 msgstr "Thông báo được gắn thẻ %s"
 
-#: actions/apitimelinetag.php: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"
@@ -774,7 +773,7 @@ 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:637
 #, fuzzy
 msgid "Delete"
 msgstr "Xóa tin nhắn"
@@ -966,7 +965,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:1197
 #, 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."
@@ -996,7 +995,7 @@ msgstr "Xóa tin nhắn"
 #: 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/settingsaction.php:72
@@ -1027,7 +1026,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:637
 #, fuzzy
 msgid "Delete this notice"
 msgstr "Xóa tin nhắn"
@@ -1299,7 +1298,7 @@ msgstr "Lý lịch quá dài (không quá 140 ký tự)"
 msgid "Could not update group."
 msgstr "Không thể cập nhật thành viên."
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "Không thể tạo favorite."
@@ -2423,7 +2422,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "Không hỗ trợ định dạng dữ liệu này."
 
@@ -2891,26 +2890,26 @@ 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
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "Đã lưu các điều chỉnh."
 
@@ -3295,7 +3294,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 +3335,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:656
 #, fuzzy
 msgid "Repeated"
 msgstr "Tạo"
@@ -4044,17 +4043,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 +4124,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,17 +4134,17 @@ 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"
 
@@ -4565,61 +4574,83 @@ msgstr "Không thể cập nhật thông tin user với địa chỉ email đã
 msgid "DB error inserting hashtag: %s"
 msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, 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:226
 #, 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:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "Có lỗi xảy ra khi lưu tin nhắn."
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, 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:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "Không thể tạo favorite."
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "Không thể tạo đăng nhận."
@@ -4836,28 +4867,40 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "Sau"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "Trước"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5176,82 +5219,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 +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"
@@ -5292,20 +5346,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "Không có mã số xác nhận."
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5791,7 +5845,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ừ "
@@ -5919,52 +5973,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:558
 #, fuzzy
 msgid "in context"
 msgstr "Không có nội dung!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "Tạo"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "Trả lời tin nhắn này"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr "Trả lời"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "Tin đã gửi"
@@ -6001,10 +6055,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."
@@ -6197,39 +6247,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "Không thể xóa đăng nhận."
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6286,70 +6303,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:952
 msgid "a few seconds ago"
 msgstr "vài giây trước"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "1 phút trước"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d phút trước"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "1 giờ trước"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d giờ trước"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "1 ngày trước"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "%d ngày trước"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "1 tháng trước"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "%d tháng trước"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "1 năm trước"
 
index a7aeec7ca5c6be5d90671f69f530febaa7798d24..60ca89d66c99339d7351d0ea21869a2ce008ec0d 100644 (file)
@@ -10,12 +10,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:16:22+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:52:00+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 (r62925); 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"
@@ -68,7 +68,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -107,7 +107,6 @@ msgstr "没有该页面"
 #: 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
 msgid "No such user."
 msgstr "没有这个用户。"
 
@@ -170,8 +169,8 @@ msgstr ""
 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 和好友的更新!"
@@ -192,12 +191,12 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!"
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "API 方法未实现!"
@@ -509,7 +508,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."
@@ -654,7 +653,7 @@ 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 通告。"
@@ -665,7 +664,7 @@ msgstr "%s 收藏了 %s 的 %s 通告。"
 msgid "%s timeline"
 msgstr "%s 时间表"
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -681,12 +680,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,7 +695,7 @@ 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 的回复"
@@ -706,7 +705,7 @@ msgstr "%s 的回复"
 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 的更新!"
@@ -769,7 +768,7 @@ 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:637
 #, fuzzy
 msgid "Delete"
 msgstr "删除"
@@ -962,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:1197
 #, fuzzy
 msgid "There was a problem with your session token."
 msgstr "会话标识有问题,请重试。"
@@ -992,7 +991,7 @@ msgstr "删除通告"
 #: 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/settingsaction.php:72
@@ -1023,7 +1022,7 @@ msgstr "确定要删除这条消息吗?"
 msgid "Do not delete this notice"
 msgstr "无法删除通告。"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 #, fuzzy
 msgid "Delete this notice"
 msgstr "删除通告"
@@ -1287,7 +1286,7 @@ msgstr "描述过长(不能超过140字符)。"
 msgid "Could not update group."
 msgstr "无法更新组"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "无法创建收藏。"
@@ -2373,7 +2372,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr "不支持的数据格式。"
 
@@ -2831,25 +2830,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
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "无法保存个人信息。"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr "设置已保存。"
 
@@ -3227,7 +3226,7 @@ msgid "URL of your profile on another compatible microblogging service"
 msgstr "您在其他兼容的微博客服务的个人信息URL"
 
 #: actions/remotesubscribe.php:137 lib/subscribeform.php:139
-#: lib/userprofile.php:365
+#: lib/userprofile.php:368
 msgid "Subscribe"
 msgstr "订阅"
 
@@ -3270,7 +3269,7 @@ msgstr "您必须同意此授权方可注册。"
 msgid "You already repeated that notice."
 msgstr "您已成功阻止该用户:"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "创建"
@@ -3973,17 +3972,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 "没æ\9c\89è¿\99个ç\94¨æ\88·。"
+msgid "No such profile."
+msgstr "没æ\9c\89è¿\99份é\80\9aå\91\8a。"
 
-#: 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 "订阅"
@@ -4044,7 +4053,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,17 +4063,17 @@ 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短信"
 
@@ -4490,61 +4499,84 @@ msgstr "无法添加新URI的信息。"
 msgid "DB error inserting hashtag: %s"
 msgstr "添加标签时数据库出错:%s"
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。"
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 #, 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:243
 msgid "You are banned from posting notices on this site."
 msgstr "在这个网站你被禁止发布消息。"
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr "保存通告时出错。"
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, fuzzy, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr "发送给 %1$s 的 %2$s 消息"
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 msgid "Could not create group."
 msgstr "无法创建组。"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "无法删除订阅。"
@@ -4757,28 +4789,40 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr "全部"
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr "注册证"
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr "分页"
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 #, fuzzy
 msgid "After"
 msgstr "« 之后"
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "之前 »"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 #, fuzzy
 msgid "You cannot make changes to this site."
@@ -5093,80 +5137,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 +5233,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 +5261,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "没有验证码"
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 #, fuzzy
 msgid "Go to the installer."
 msgstr "登入本站"
@@ -5659,7 +5713,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 " 从 "
@@ -5786,53 +5840,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:558
 #, fuzzy
 msgid "in context"
 msgstr "没有内容!"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "创建"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 #, fuzzy
 msgid "Reply to this notice"
 msgstr "无法删除通告。"
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 #, fuzzy
 msgid "Reply"
 msgstr "回复"
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "消息已发布。"
@@ -5867,11 +5921,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 "无法添加新的订阅。"
@@ -6063,37 +6112,6 @@ 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/subs.php:158
-msgid "Couldn't delete subscription."
-msgstr "无法删除订阅。"
-
 #: lib/subscriberspeopleselftagcloudsection.php:48
 #: lib/subscriptionspeopleselftagcloudsection.php:48
 msgid "People Tagcloud as self-tagged"
@@ -6151,70 +6169,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:952
 msgid "a few seconds ago"
 msgstr "几秒前"
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr "一分钟前"
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr "%d 分钟前"
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr "一小时前"
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr "%d 小时前"
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr "一天前"
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr "%d 天前"
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr "一个月前"
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr "%d 个月前"
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr "一年前"
 
index 815f95eacddd782c9d829cbad3d51bc9ee04c3c6..ff517edec039acc47fede09ce19d9c280747c796 100644 (file)
@@ -7,12 +7,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:16:25+0000\n"
+"POT-Creation-Date: 2010-02-24 23:49+0000\n"
+"PO-Revision-Date: 2010-02-24 23:52:03+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 (r62925); 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"
@@ -63,7 +63,7 @@ msgstr ""
 #: 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/subscriptions.php:208 actions/tagother.php:154
 #: actions/useradminpanel.php:293 lib/applicationeditform.php:333
 #: lib/applicationeditform.php:334 lib/designsettings.php:256
 #: lib/groupeditform.php:202
@@ -103,7 +103,6 @@ msgstr "無此通知"
 #: 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
 msgid "No such user."
 msgstr "無此使用者"
 
@@ -166,8 +165,8 @@ msgstr ""
 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 ""
@@ -188,12 +187,12 @@ msgstr ""
 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112
 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137
 #: 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:195 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:207 actions/apiusershow.php:101
 #, fuzzy
 msgid "API method not found."
 msgstr "確認碼遺失"
@@ -501,7 +500,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."
@@ -645,7 +644,7 @@ 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的微型部落格"
@@ -656,7 +655,7 @@ msgstr "&s的微型部落格"
 msgid "%s timeline"
 msgstr ""
 
-#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126
+#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126
 #: actions/userrss.php:92
 #, php-format
 msgid "Updates from %1$s on %2$s!"
@@ -672,12 +671,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,7 +686,7 @@ msgstr ""
 msgid "Repeated to %s"
 msgstr ""
 
-#: actions/apitimelineretweetsofme.php:112
+#: actions/apitimelineretweetsofme.php:114
 #, php-format
 msgid "Repeats of %s"
 msgstr ""
@@ -697,7 +696,7 @@ msgstr ""
 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的微型部落格"
@@ -761,7 +760,7 @@ 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:637
 msgid "Delete"
 msgstr ""
 
@@ -952,7 +951,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:1197
 msgid "There was a problem with your session token."
 msgstr ""
 
@@ -981,7 +980,7 @@ msgstr "請在140個字以內描述你自己與你的興趣"
 #: 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/settingsaction.php:72
@@ -1011,7 +1010,7 @@ msgstr ""
 msgid "Do not delete this notice"
 msgstr "無此通知"
 
-#: actions/deletenotice.php:146 lib/noticelist.php:624
+#: actions/deletenotice.php:146 lib/noticelist.php:637
 msgid "Delete this notice"
 msgstr ""
 
@@ -1268,7 +1267,7 @@ msgstr "自我介紹過長(共140個字元)"
 msgid "Could not update group."
 msgstr "無法更新使用者"
 
-#: actions/editgroup.php:259 classes/User_group.php:390
+#: actions/editgroup.php:259 classes/User_group.php:433
 #, fuzzy
 msgid "Could not create aliases."
 msgstr "無法存取個人圖像資料"
@@ -2293,7 +2292,7 @@ msgid "Only "
 msgstr ""
 
 #: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040
-#: lib/api.php:1068 lib/api.php:1178
+#: lib/api.php:1068 lib/api.php:1177
 msgid "Not a supported data format."
 msgstr ""
 
@@ -2740,25 +2739,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
 #, fuzzy
 msgid "Couldn't save tags."
 msgstr "無法儲存個人資料"
 
-#: actions/profilesettings.php:387 lib/adminpanelaction.php:137
+#: actions/profilesettings.php:391 lib/adminpanelaction.php:137
 msgid "Settings saved."
 msgstr ""
 
@@ -3114,7 +3113,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 +3152,7 @@ msgstr ""
 msgid "You already repeated that notice."
 msgstr "無此使用者"
 
-#: actions/repeat.php:114 lib/noticelist.php:642
+#: actions/repeat.php:114 lib/noticelist.php:656
 #, fuzzy
 msgid "Repeated"
 msgstr "新增"
@@ -3836,17 +3835,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 +3915,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,17 +3925,17 @@ 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 ""
 
@@ -4335,61 +4343,82 @@ msgstr ""
 msgid "DB error inserting hashtag: %s"
 msgstr ""
 
-#: classes/Notice.php:214
+#: classes/Notice.php:222
 #, fuzzy
 msgid "Problem saving notice. Too long."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:218
+#: classes/Notice.php:226
 #, fuzzy
 msgid "Problem saving notice. Unknown user."
 msgstr "儲存使用者發生錯誤"
 
-#: classes/Notice.php:223
+#: classes/Notice.php:231
 msgid ""
 "Too many notices too fast; take a breather and post again in a few minutes."
 msgstr ""
 
-#: classes/Notice.php:229
+#: classes/Notice.php:237
 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:243
 msgid "You are banned from posting notices on this site."
 msgstr ""
 
-#: classes/Notice.php:294 classes/Notice.php:319
+#: classes/Notice.php:309 classes/Notice.php:335
 msgid "Problem saving notice."
 msgstr ""
 
-#: classes/Notice.php:788
+#: classes/Notice.php:882
 #, 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:1407
 #, 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:372
 #, php-format
 msgid "Welcome to %1$s, @%2$s!"
 msgstr ""
 
-#: classes/User_group.php:380
+#: classes/User_group.php:423
 #, fuzzy
 msgid "Could not create group."
 msgstr "無法存取個人圖像資料"
 
-#: classes/User_group.php:409
+#: classes/User_group.php:452
 #, fuzzy
 msgid "Could not set group membership."
 msgstr "註冊失敗"
@@ -4596,27 +4625,39 @@ msgstr ""
 msgid "Content and data copyright by contributors. All rights reserved."
 msgstr ""
 
-#: lib/action.php:826
+#: lib/action.php:827
 msgid "All "
 msgstr ""
 
-#: lib/action.php:831
+#: lib/action.php:833
 msgid "license."
 msgstr ""
 
-#: lib/action.php:1130
+#: lib/action.php:1132
 msgid "Pagination"
 msgstr ""
 
-#: lib/action.php:1139
+#: lib/action.php:1141
 msgid "After"
 msgstr ""
 
-#: lib/action.php:1147
+#: lib/action.php:1149
 #, fuzzy
 msgid "Before"
 msgstr "之前的內容»"
 
+#: lib/activity.php:382
+msgid "Can't handle remote content yet."
+msgstr ""
+
+#: lib/activity.php:410
+msgid "Can't handle embedded XML content yet."
+msgstr ""
+
+#: lib/activity.php:414
+msgid "Can't handle embedded Base64 content yet."
+msgstr ""
+
 #: lib/adminpanelaction.php:96
 msgid "You cannot make changes to this site."
 msgstr ""
@@ -4919,80 +4960,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 +5057,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 +5085,20 @@ msgid ""
 "tracking - not yet implemented.\n"
 msgstr ""
 
-#: lib/common.php:135
+#: lib/common.php:136
 #, fuzzy
 msgid "No configuration file found. "
 msgstr "無確認碼"
 
-#: lib/common.php:136
+#: lib/common.php:137
 msgid "I looked for configuration files in the following places: "
 msgstr ""
 
-#: lib/common.php:138
+#: lib/common.php:139
 msgid "You may wish to run the installer to fix this."
 msgstr ""
 
-#: lib/common.php:139
+#: lib/common.php:140
 msgid "Go to the installer."
 msgstr ""
 
@@ -5469,7 +5521,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 ""
 
@@ -5594,50 +5646,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:558
 #, fuzzy
 msgid "in context"
 msgstr "無內容"
 
-#: lib/noticelist.php:572
+#: lib/noticelist.php:583
 #, fuzzy
 msgid "Repeated by"
 msgstr "新增"
 
-#: lib/noticelist.php:598
+#: lib/noticelist.php:610
 msgid "Reply to this notice"
 msgstr ""
 
-#: lib/noticelist.php:599
+#: lib/noticelist.php:611
 msgid "Reply"
 msgstr ""
 
-#: lib/noticelist.php:641
+#: lib/noticelist.php:655
 #, fuzzy
 msgid "Notice repeated"
 msgstr "更新個人圖像"
@@ -5671,10 +5723,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 "無法新增訂閱"
@@ -5858,36 +5906,6 @@ 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
-#, 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 +5959,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:952
 msgid "a few seconds ago"
 msgstr ""
 
-#: lib/util.php:872
+#: lib/util.php:954
 msgid "about a minute ago"
 msgstr ""
 
-#: lib/util.php:874
+#: lib/util.php:956
 #, php-format
 msgid "about %d minutes ago"
 msgstr ""
 
-#: lib/util.php:876
+#: lib/util.php:958
 msgid "about an hour ago"
 msgstr ""
 
-#: lib/util.php:878
+#: lib/util.php:960
 #, php-format
 msgid "about %d hours ago"
 msgstr ""
 
-#: lib/util.php:880
+#: lib/util.php:962
 msgid "about a day ago"
 msgstr ""
 
-#: lib/util.php:882
+#: lib/util.php:964
 #, php-format
 msgid "about %d days ago"
 msgstr ""
 
-#: lib/util.php:884
+#: lib/util.php:966
 msgid "about a month ago"
 msgstr ""
 
-#: lib/util.php:886
+#: lib/util.php:968
 #, php-format
 msgid "about %d months ago"
 msgstr ""
 
-#: lib/util.php:888
+#: lib/util.php:970
 msgid "about a year ago"
 msgstr ""
 
diff --git a/plugins/Autocomplete/jquery-autocomplete/indicator.gif b/plugins/Autocomplete/jquery-autocomplete/indicator.gif
new file mode 100644 (file)
index 0000000..d0bce15
Binary files /dev/null and b/plugins/Autocomplete/jquery-autocomplete/indicator.gif differ
index 300d1e9a2488e7430becd87e7c5f0a95cafae092..29cb3004bf95df1ecb8543002b273aaca258e4b7 100644 (file)
@@ -68,7 +68,7 @@ class CometPlugin extends RealtimePlugin
         $ours = array('jquery.comet.js', 'cometupdate.js');
 
         foreach ($ours as $script) {
-            $scripts[] = common_path('plugins/Comet/'.$script);
+            $scripts[] = 'plugins/Comet/'.$script;
         }
 
         return $scripts;
index 4266b886d9cae1c9e9162e692de4fe5b9004ba13..78c9054e14818c1444e4d39e0173b2424b03a5e3 100644 (file)
@@ -181,7 +181,7 @@ class FacebookPlugin extends Plugin
         if ($this->reqFbScripts($action)) {
 
             $apikey      = common_config('facebook', 'apikey');
-            $plugin_path = common_path('plugins/Facebook');
+            $plugin_path = 'plugins/Facebook';
 
             $login_url  = common_local_url('FBConnectAuth');
             $logout_url = common_local_url('logout');
index 8437a705a7b7858ce5f4ecc416843ddd15182da2..f65b97c865587d10b675be04b558344b8fa3a936 100644 (file)
@@ -89,7 +89,7 @@ class FacebookAction extends Action
 
     function showScripts()
     {
-        $this->script(common_path('plugins/Facebook/facebookapp.js'));
+        $this->script('plugins/Facebook/facebookapp.js');
     }
 
     /**
index b49b6a4bad1dc63c296edab6b6a8bbc5fe735c72..69def60641d778decdf5e3ba8bf7e3cbed2633f9 100644 (file)
@@ -86,7 +86,11 @@ class MinifyPlugin extends Plugin
         $url = parse_url($src);
         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
         {
-            $src = $this->minifyUrl($src);
+            if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
+                $src = $this->minifyUrl($src);
+            } else {
+                $src = $this->minifyUrl('js/'.$src);
+            }
         }
     }
 
@@ -96,7 +100,7 @@ class MinifyPlugin extends Plugin
             && is_null(common_config('theme', 'path'))
             && is_null(common_config('theme', 'server'));
         $url = parse_url($src);
-        if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment))
+        if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
         {
             if(!isset($theme)) {
                 $theme = common_config('site', 'theme');
index 3b1329d6c5d1ad2f926a7582c1f42041c6bc105c..e7ffd6cc2c765647edafdefa4f9a513f449f42a2 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
 {
@@ -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,7 +98,7 @@ class OStatusPlugin extends Plugin
      */
     function onStartEnqueueNotice($notice, &$transports)
     {
-        $transports[] = 'hubdistrib';
+        $transports[] = 'ostatus';
         return true;
     }
 
@@ -112,21 +106,26 @@ class OStatusPlugin extends Plugin
      * 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.
@@ -138,23 +137,6 @@ class OStatusPlugin extends Plugin
             $salmon = common_local_url($salmonAction, array('id' => $id));
             $feed->addLink($salmon, array('rel' => 'salmon'));
         }
-    }
-
-    /**
-     * 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 +153,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 +201,47 @@ 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;
+    function onStartFindMentions($sender, $text, &$mentions)
+    {
+        preg_match_all('/(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)/',
+                       $text,
+                       $wmatches,
+                       PREG_OFFSET_CAPTURE);
 
-                $endpoint_uri = '';
+        foreach ($wmatches[1] as $wmatch) {
 
-                $result = $w->lookup($webfinger);
-                if (empty($result)) {
-                    continue;
-                }
+            $webfinger = $wmatch[0];
 
-                foreach ($result->links as $link) {
-                    if ($link['rel'] == 'salmon') {
-                        $endpoint_uri = $link['href'];
-                    }
-                }
+            $this->log(LOG_INFO, "Checking Webfinger for address '$webfinger'");
 
-                if (empty($endpoint_uri)) {
-                    continue;
-                }
+            $oprofile = Ostatus_profile::ensureWebfinger($webfinger);
 
-                // FIXME: this needs to go out in a queue handler
+            if (empty($oprofile)) {
 
-                $xml = '<?xml version="1.0" encoding="UTF-8" ?>';
-                $xml .= $notice->asAtomEntry();
+                $this->log(LOG_INFO, "No Ostatus_profile found for address '$webfinger'");
 
-                $salmon = new Salmon();
-                $salmon->post($endpoint_uri, $xml);
-            }
-        }
-    }
+            } else {
 
-    /**
-     * 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();
+                $this->log(LOG_INFO, "Ostatus_profile found for address '$webfinger'");
+
+                $profile = $oprofile->localProfile();
+
+                $mentions[] = array('mentioned' => array($profile),
+                                    'text' => $wmatch[0],
+                                    'position' => $wmatch[1],
+                                    'url' => $profile->profileurl);
             }
         }
+
         return true;
     }
 
@@ -276,17 +251,464 @@ 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;
     }
 
     function onEndShowStatusNetStyles($action) {
-        $action->cssLink(common_path('plugins/OStatus/theme/base/css/ostatus.css'));
+        $action->cssLink('plugins/OStatus/theme/base/css/ostatus.css');
         return true;
     }
 
     function onEndShowStatusNetScripts($action) {
-        $action->script(common_path('plugins/OStatus/js/ostatus.js'));
+        $action->script('plugins/OStatus/js/ostatus.js');
+        return true;
+    }
+
+    /**
+     * 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') {
+            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);
+
+        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;
+
+        $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);
+
+        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)) {
+                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);
+        }
+    }
+
+    /**
+     * 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);
+
+        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);
+
+        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)
+    {
+        $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');
+        }
+
+        return true;
+    }
+
+    /**
+     * 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);
+        }
+
         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 d21774420dd4c984d7a894bffe707663ade6cf13..3f2f6368f6038b94092e8fc0090fd8cfa4c5e18f 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)
+    {
+        $w = new Webfinger;
 
-              $user = User::staticGet('nickname', $this->nickname);
+        $result = $w->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 = $w->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..12832cdcfb2fab8b2a0e4a8298ef42ecd99bd68e 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,426 @@ 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.
+     * Show the preview-and-confirm form. We've got a valid remote
+     * profile and are ready to poke it!
      *
-     * All sub-functions reload the form with a message -- success or failure.
-     *
-     * @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('Subscribe'), '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;
     }
 
-    
     /**
-     * Set up and add a feed
+     * 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);
+    }
+
+    /**
+     * 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}");
+        if ($this->oprofile->isGroup()) {
+            $group = $this->oprofile->localGroup();
+            if ($user->isMember($group)) {
+                $this->showForm(_m('Already a member!'));
+            } elseif (Group_member::join($this->oprofile->group_id, $user->id)) {
+                $this->successGroup();
             } 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;
-                }
+                $this->showForm(_m('Remote group join failed!'));
             }
-            
-            // 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)) {
                 $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!'));
+                $this->showForm(_m('Remote subscription failed!'));
             }
         }
     }
 
-    
-    function previewFeed()
+    function prepare($args)
     {
-        $profile = $this->munger->ostatusProfile();
-        $notice = $this->munger->notice(0, true); // preview
+        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;
+        }
 
-        if ($notice) {
-            $this->element('b', null, 'Preview of latest post from this feed:');
+        $this->profile_uri = $this->arg('profile');
 
-            $item = new NoticeList($notice, $this);
-            $item->show();
+        return true;
+    }
+
+    /**
+     * Handle the submission.
+     */
+    function handle($args)
+    {
+        parent::handle($args);
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->handlePost();
         } else {
-            $this->element('b', null, 'No posts in this feed yet.');
+            if ($this->arg('profile')) {
+                $this->validateFeed();
+            }
+            $this->showForm();
         }
     }
 
 
+    /**
+     * Handle posts to this form
+     *
+     * @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->validateFeed()) {
+            if ($this->arg('submit')) {
+                $this->saveFeed();
+                return;
+            }
+        }
+        $this->showForm();
+    }
+
+    /**
+     * 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->showPage();
+        }
+    }
+
+    /**
+     * Title of the page
+     *
+     * @return string Title of the page
+     */
+
+    function title()
+    {
+        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 2601a377a0bdf2d5b32246a05d3e43cc9dfb6686..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 = '';
@@ -59,11 +60,19 @@ class PushCallbackAction extends Action
         }
 
         $post = file_get_contents('php://input');
-        $profile->postUpdates($post, $hmac);
+
+        // Queue this to a background process; we should return
+        // as quickly as possible from a distribution POST.
+        // 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()
     {
@@ -72,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 901c18f70285f2ac302a35d4216eae7e97501b6f..f33690bc4999acc89c1974913ea95a59d9d130ef 100644 (file)
@@ -44,7 +44,7 @@ class PushHubAction extends Action
         // PHP converts '.'s in incoming var names to '_'s.
         // It also merges multiple values, which'll break hub.verify and hub.topic for publishing
         // @fixme handle multiple args
-        $arg = str_replace('.', '_', $arg);
+        $arg = str_replace('hub.', 'hub_', $arg);
         return parent::arg($arg, $def);
     }
 
@@ -59,95 +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.");
+        }
+
+        $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.");
         }
 
-        common_log(LOG_DEBUG, __METHOD__ . ': setting up');
-        $sub = new HubSub();
-        $sub->topic = $feed;
-        $sub->callback = $callback;
-        $sub->secret = $this->arg('hub.secret', null);
-        $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?
-
-        common_log(LOG_DEBUG, __METHOD__ . ': inserting');
-        $ok = $sub->insert();
-        
-        if (!$ok) {
-            throw new ServerException("Failed to save subscription record", 500);
+        $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.");
         }
 
-        // @fixme check errors ;)
+        $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.");
+        }
+
+        $sub = HubSub::staticGet($sub->topic, $sub->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)
     {
@@ -157,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;
+    }
+
+}
index 75ba16638ba26f93ed2cfd138c0426caabea7887..34336a9039bf7869b428e39f742396e2aa1c147c 100644 (file)
@@ -37,7 +37,7 @@ class WebfingerAction extends Action
 
         return true;
     }
-        
+
     function handle()
     {
         $acct = Webfinger::normalize($this->uri);
@@ -55,18 +55,50 @@ class WebfingerAction extends Action
 
         $xrd->subject = $this->uri;
         $xrd->alias[] = common_profile_url($nick);
-        $xrd->links[] = array('rel' => 'http://webfinger.net/rel/profile-page',
+        $xrd->links[] = array('rel' => Webfinger::PROFILEPAGE,
+                              'type' => 'text/html',
+                              'href' => common_profile_url($nick));
+
+        $xrd->links[] = array('rel' => Webfinger::UPDATESFROM,
+                              'href' => common_local_url('ApiTimelineUser',
+                                                         array('id' => $this->user->id,
+                                                               'format' => 'atom')),
+                              'type' => 'application/atom+xml');
+
+        // hCard
+        $xrd->links[] = array('rel' => 'http://microformats.org/profile/hcard',
                               'type' => 'text/html',
                               'href' => common_profile_url($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_url = common_local_url('salmon',
                                        array('id' => $this->user->id));
 
         $xrd->links[] = array('rel' => 'salmon',
                               '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();
+        }
+        
+        $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL,
+                              'href' => 'data:application/magic-public-key;'. $magickey->keypair);
         
         // TODO - finalize where the redirect should go on the publisher
-        $url = common_local_url('ostatussub') . '?feed={uri}';
+        $url = common_local_url('ostatussub') . '?profile={uri}';
         $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe',
                               'template' => $url );
 
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..1ac181feeb946db8097f0f0954892f3658ea1b0b 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));
     }
 
@@ -152,83 +148,125 @@ 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'));
+        }
+
+        $data = array('sub' => clone($this),
+                      'atom' => $atom,
+                      'retries' => $retries);
+        $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 +275,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 +287,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..681aec1
--- /dev/null
@@ -0,0 +1,219 @@
+<?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)
+    {
+        return parent::staticGet(__CLASS__, $k, $v);
+    }
+
+
+    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 insert()
+    {
+        $this->keypair = $this->toString();
+
+        return parent::insert();
+    }
+
+    public function generate($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->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 ($matches[4]) {
+            $private_exp = base64_url_decode($matches[4]);
+        }
+
+        $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 'sha256';
+        }
+
+    }
+    
+    public function sign($bytes)
+    {
+        $sig = $this->_rsa->createSign($bytes, null, 'sha256');
+        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)
+    {
+        $result =  $this->_rsa->validateSign($signed_bytes, $signature, null, 'sha256');
+        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 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 b750e188396345d94579e52c1698e47a961cc1c8..a366c1c2cf4b96fe5d7eea042c1358bedc774ca2 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,99 +142,37 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
-     * @param FeedMunger $munger
-     * @param boolean $isGroup is this a group record?
-     * @return Ostatus_profile
+     * Returns an ActivityObject describing this remote user or group profile.
+     * Can then be used to generate Atom chunks.
+     *
+     * @return ActivityObject
      */
-    public static function ensureProfile($munger)
+    function asActivityObject()
     {
-        $profile = $munger->ostatusProfile();
-
-        $current = self::staticGet('feeduri', $profile->feeduri);
-        if ($current) {
-            // @fixme we should probably update info as necessary
-            return $current;
-        }
-
-        $profile->query('BEGIN');
-
-        // Awful hack! Awful hack!
-        $profile->verify = common_good_rand(16);
-        $profile->secret = common_good_rand(32);
+        if ($this->isGroup()) {
+            $object = new ActivityObject();
+            $object->type = 'http://activitystrea.ms/schema/1.0/group';
+            $object->id = $this->uri;
+            $self = $this->localGroup();
 
-        try {
-            $local = $munger->profile();
-
-            if ($entity->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);
+            // @fixme put a standard getAvatar() interface on groups too
+            if ($self->homepage_logo) {
+                $object->avatar = $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])) {
+                    // @fixme this ain't used/saved yet
+                    $object->avatarType = $map[$extension];
                 }
-                $profile->profile_id = $local->id;
-            }
-
-            $profile->created = sql_common_date();
-            $profile->lastupdate = sql_common_date();
-            $result = $profile->insert();
-            if (empty($result)) {
-                throw new FeedDBException($profile);
             }
 
-            $entity->query('COMMIT');
-        } catch (FeedDBException $e) {
-            common_log_db_error($e->obj, 'INSERT', __FILE__);
-            $entity->query('ROLLBACK');
-            return false;
-        }
-
-        $avatar = $munger->getAvatar();
-        if ($avatar) {
-            try {
-                $this->updateAvatar($avatar);
-            } catch (Exception $e) {
-                common_log(LOG_ERR, "Exception setting OStatus avatar: " .
-                                    $e->getMessage());
-            }
-        }
-
-        return $entity;
-    }
-
-    /**
-     * Download and update given avatar image
-     * @param string $url
-     * @throws Exception in various failure cases
-     */
-    public function updateAvatar($url)
-    {
-        // @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);
-        $imagefile = new ImageFile($profile->id, $temp_filename);
-        $filename = Avatar::filename($profile->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);
+            $object->link = $this->uri; // @fixme accurate?
+            return $object;
         } else {
-            $profile = $this->localProfile();
-            $profile->setOriginal($filename);
+            return ActivityObject::fromProfile($this->localProfile());
         }
     }
 
@@ -304,13 +182,14 @@ 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()) {
@@ -334,8 +213,8 @@ class Ostatus_profile extends Memcached_DataObject
             $self = $this->localProfile();
             $avatar = $self->getAvatar(AVATAR_PROFILE_SIZE);
             if ($avatar) {
-                $avatarHref = $avatar->
-                $avatarType = $avatar->mediatype;
+                  $avatarHref = $avatar->url;
+                  $avatarType = $avatar->mediatype;
             }
         }
         $xs->elementStart('activity:' . $element);
@@ -347,7 +226,7 @@ class Ostatus_profile extends Memcached_DataObject
         $xs->element(
             'id',
             null,
-            $this->homeuri); // ?
+            $this->uri); // ?
         $xs->element('title', null, $self->getBestName());
 
         $xs->element(
@@ -364,100 +243,84 @@ class Ostatus_profile extends Memcached_DataObject
     }
 
     /**
-     * Damn dirty hack!
+     * @return boolean true if this is a remote group
      */
     function isGroup()
     {
-        return (strpos($this->feeduri, '/groups/') !== false);
+        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");
+        }
     }
 
     /**
-     * Send a subscription request to the hub for this feed.
-     * The hub will later send us a confirmation POST to /main/push/callback.
+     * 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.
      *
-     * @return bool true on success, false on failure
+     * @param User $user
+     * @return boolean success
+     * @throws FeedException
      */
-    public function subscribe($mode='subscribe')
+    public function subscribeLocalToRemote(User $user)
     {
-        if (common_config('feedsub', 'nohub')) {
-            // Fake it! We're just testing remote feeds w/o hubs.
-            return true;
+        if ($this->isGroup()) {
+            throw new ServerException("Can't subscribe to a remote group");
         }
-        // @fixme use the verification token
-        #$token = md5(mt_rand() . ':' . $this->feeduri);
-        #$this->verify_token = $token;
-        #$this->update(); // @fixme
-        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');
+
+        if ($this->subscribe()) {
+            if ($user->subscribeTo($this->localProfile())) {
+                $this->notify($user->getProfile(), ActivityVerb::FOLLOW, $this);
                 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");
-            return false;
         }
+        return false;
     }
 
     /**
-     * Save PuSH subscription confirmation.
-     * Sets approximate lease start and end times and finalizes state.
+     * Mark this remote profile as subscribing to the given local user,
+     * and send appropriate notifications to the user.
      *
-     * @param int $lease_seconds provided hub.lease_seconds parameter, if given
+     * This will generally be in response to a subscription notification
+     * from a foreign site to our local Salmon response channel.
+     *
+     * @param User $user
+     * @return boolean success
      */
-    public function confirmSubscribe($lease_seconds=0)
+    public function subscribeRemoteToLocal(User $user)
     {
-        $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;
+        if ($this->isGroup()) {
+            throw new ServerException("Remote groups can't subscribe to local users");
         }
-        $this->lastupdate = common_sql_date();
 
-        return $this->update($original);
+        Subscription::start($this->localProfile(), $user->getProfile());
+
+        return true;
     }
 
     /**
-     * Save PuSH unsubscription confirmation.
-     * Wipes active PuSH sub info and resets state.
+     * 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 confirmUnsubscribe()
+    public function subscribe()
     {
-        $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);
+        $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...");
+        }
     }
 
     /**
@@ -465,55 +328,148 @@ class Ostatus_profile extends Memcached_DataObject
      * 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() {
-        return $this->subscribe('unsubscribe');
+        $feedsub = FeedSub::staticGet('uri', $this->feeduri);
+        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...");
+        }
+    }
+
+    /**
+     * Check if this remote profile has any active local subscriptions, and
+     * if not drop the PuSH subscription feed.
+     *
+     * @return boolean
+     */
+    public function garbageCollect()
+    {
+        if ($this->isGroup()) {
+            $members = $this->localGroup()->getMembers(0, 1);
+            $count = $members->N;
+        } else {
+            $count = $this->localProfile()->subscriberCount();
+        }
+        if ($count == 0) {
+            common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $oprofile->feeduri");
+            $this->unsubscribe();
+            return true;
+        } else {
+            return false;
+        }
     }
 
     /**
      * 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');
+
+            $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);
+        }
+        return false;
+    }
+
+    /**
+     * 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)
+    {
+        if ($this->salmonuri) {
+            $salmon = new Salmon();
+            return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry));
+        }
+
+        return false;
+    }
+
+    /**
+     * 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)
+    {
+        if ($this->salmonuri) {
+            $data = array('salmonuri' => $this->salmonuri,
+                          'entry' => $this->notifyPrepXml($entry));
+
+            $qm = QueueManager::get();
+            return $qm->enqueue($data, 'salmon');
+        }
+
+        return false;
+    }
+
+    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");
         }
     }
 
@@ -531,7 +487,7 @@ class Ostatus_profile extends Memcached_DataObject
         $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('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');
 
@@ -542,14 +498,14 @@ class Ostatus_profile extends Memcached_DataObject
         $feed->setUpdated(time());
         $feed->setPublished(time());
 
-        $feed->addLink(common_url('ApiTimelineUser',
-                                  array('id' => $actor->id,
-                                        'type' => 'atom')),
+        $feed->addLink(common_local_url('ApiTimelineUser',
+                                        array('id' => $actor->id,
+                                              'type' => 'atom')),
                        array('rel' => 'self',
                              'type' => 'application/atom+xml'));
 
-        $feed->addLink(common_url('userbyid',
-                                  array('id' => $actor->id)),
+        $feed->addLink(common_local_url('userbyid',
+                                        array('id' => $actor->id)),
                        array('rel' => 'alternate',
                              'type' => 'text/html'));
 
@@ -561,84 +517,808 @@ class Ostatus_profile extends Memcached_DataObject
      * Currently assumes that all items in the feed are new,
      * coming from a PuSH hub.
      *
-     * @param string $xml source of Atom or RSS feed
-     * @param string $hmac X-Hub-Signature header, if present
+     * @param DOMDocument $feed
+     */
+    public function processFeed($feed, $source)
+    {
+        $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry');
+        if ($entries->length == 0) {
+            common_log(LOG_ERR, __METHOD__ . ": no entries in feed update, ignoring");
+            return;
+        }
+
+        for ($i = 0; $i < $entries->length; $i++) {
+            $entry = $entries->item($i);
+            $this->processEntry($entry, $feed, $source);
+        }
+    }
+
+    /**
+     * Process a posted entry from this feed source.
+     *
+     * @param DOMElement $entry
+     * @param DOMElement $feed for context
      */
-    public function postUpdates($xml, $hmac)
+    public function processEntry($entry, $feed, $source)
     {
-        common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->feeduri\"! $hmac $xml");
+        $activity = new Activity($entry, $feed);
 
-        if ($this->secret) {
-            if (preg_match('/^sha1=([0-9a-fA-F]{40})$/', $hmac, $matches)) {
-                $their_hmac = strtolower($matches[1]);
-                $our_hmac = hash_hmac('sha1', $xml, $this->secret);
-                if ($their_hmac !== $our_hmac) {
-                    common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bad SHA-1 HMAC: got $their_hmac, expected $our_hmac");
-                    return;
-                }
+        if ($activity->verb == ActivityVerb::POST) {
+            $this->processPost($activity, $source);
+        } else {
+            common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb");
+        }
+    }
+
+    /**
+     * 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
+     */
+    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 = 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 {
+            // 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 {
-                common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bogus HMAC '$hmac'");
-                return;
+                common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri");
+                return false;
             }
-        } else if ($hmac) {
-            common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with unexpected HMAC '$hmac'");
-            return;
+            $oprofile = $this;
         }
 
-        require_once "XML/Feed/Parser.php";
-        $feed = new XML_Feed_Parser($xml, false, false, true);
-        $munger = new FeedMunger($feed);
+        // 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;
+        }
 
-        $hits = 0;
-        foreach ($feed as $index => $entry) {
-            // @fixme this might sort in wrong order if we get multiple updates
+        // We'll also want to save a web link to the original notice, if provided.
+        $sourceUrl = null;
+        if ($activity->object->link) {
+            $sourceUrl = $activity->object->link;
+        } else if ($activity->link) {
+            $sourceUrl = $activity->link;
+        } else if (preg_match('!^https?://!', $activity->object->id)) {
+            $sourceUrl = $activity->object->id;
+        }
 
-            $notice = $munger->notice($index);
+        // Get (safe!) HTML and text versions of the content
+        $rendered = $this->purify($activity->object->content);
+        $content = html_entity_decode(strip_tags($rendered));
 
-            // Double-check for oldies
-            // @fixme this could explode horribly for multiple feeds on a blog. sigh
+        $options = array('is_local' => Notice::REMOTE_OMB,
+                        'url' => $sourceUrl,
+                        'uri' => $sourceUri,
+                        'rendered' => $rendered,
+                        'replies' => array(),
+                        'groups' => array());
 
-            $dupe = Notice::staticGet('uri', $notice->uri);
+        // Check for optional attributes...
 
-            if (!empty($dupe)) {
-                common_log(LOG_WARNING, __METHOD__ . ": tried to save dupe notice for entry {$notice->uri} of feed {$this->feeduri}");
-                continue;
+        if (!empty($activity->time)) {
+            $options['created'] = common_sql_date($activity->time);
+        }
+
+        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;
+                }
             }
 
-            // @fixme need to ensure that groups get handled correctly
-            $saved = Notice::saveNew($notice->profile_id,
-                                     $notice->content,
+            $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;
+                }
+            }
+        }
+
+        try {
+            $saved = Notice::saveNew($oprofile->profile_id,
+                                     $content,
                                      'ostatus',
-                                     array('is_local' => Notice::REMOTE_OMB,
-                                           'uri' => $notice->uri,
-                                           'lat' => $notice->lat,
-                                           'lon' => $notice->lon,
-                                           'location_ns' => $notice->location_ns,
-                                           'location_id' => $notice->location_id));
-
-            /*
-            common_log(LOG_DEBUG, "going to check group delivery...");
-            if ($this->group_id) {
-                $group = User_group::staticGet($this->group_id);
+                                     $options);
+            if ($saved) {
+                Ostatus_source::saveNew($saved, $this, $method);
+            }
+        } 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;
+    }
+
+    /**
+     * Clean up HTML
+     */
+    protected function purify($html)
+    {
+        require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php';
+        $config = array('safe' => 1);
+        return htmLawed($html, $config);
+    }
+
+    /**
+     * 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
+     */
+    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;
+            }
+
+            // 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) {
-                    common_log(LOG_INFO, __METHOD__ . ": saving to local shadow group $group->id $group->nickname");
-                    $groups = array($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_INFO, __METHOD__ . ": lost the local shadow group?");
+                    common_log(LOG_DEBUG, "Skipping reply to bogus group $recipient");
                 }
-            } else {
-                common_log(LOG_INFO, __METHOD__ . ": no local shadow groups");
-                $groups = array();
             }
-            common_log(LOG_DEBUG, "going to add to inboxes...");
-            $notice->addToInboxes($groups, array());
-            common_log(LOG_DEBUG, "added to inboxes.");
-            */
 
-            $hits++;
+            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;
+    }
+
+    /**
+     * @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();
+        $feeduri = $discover->discoverFromURL($profile_uri);
+
+        //$feedsub = FeedSub::ensureFeed($feeduri, $discover->feed);
+        $huburi = $discover->getAtomLink('hub');
+        $salmonuri = $discover->getAtomLink('salmon');
+
+        if (!$huburi) {
+            // We can only deal with folks with a PuSH hub
+            throw new FeedSubNoHubException();
         }
-        if ($hits == 0) {
-            common_log(LOG_INFO, __METHOD__ . ": no updates in packet for \"$this->feeduri\"! $xml");
+
+        // 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, $feeduri, $salmonuri, $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, $feeduri, $salmonuri, $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, $feeduri, $salmonuri, $hints);
+
+            }
+
+            $author = ActivityUtils::child($entry, Activity::AUTHOR, Activity::ATOM);
+
+            if (!empty($author)) {
+                $authorObject = new ActivityObject($author);
+                return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri, $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->avatar) {
+            return $object->avatar;
+        } 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
+     */
+
+    protected static function getAvatar($actor, $feed)
+    {
+        $url = '';
+        $icon = '';
+        if ($actor->avatar) {
+            $url = trim($actor->avatar);
+        }
+        if (!$url) {
+            // Check <atom:logo> and <atom:icon> on the feed
+            $els = $feed->childNodes();
+            if ($els && $els->length) {
+                for ($i = 0; $i < $els->length; $i++) {
+                    $el = $els->item($i);
+                    if ($el->namespaceURI == Activity::ATOM) {
+                        if (empty($url) && $el->localName == 'logo') {
+                            $url = trim($el->textContent);
+                            break;
+                        }
+                        if (empty($icon) && $el->localName == 'icon') {
+                            // Use as a fallback
+                            $icon = trim($el->textContent);
+                        }
+                    }
+                }
+            }
+            if ($icon && !$url) {
+                $url = $icon;
+            }
+        }
+        if ($url) {
+            $opts = array('allowed_schemes' => array('http', 'https'));
+            if (Validate::uri($url, $opts)) {
+                return $url;
+            }
+        }
+        return common_path('plugins/OStatus/images/96px-Feed-icon.svg.png');
+    }
+
+    /**
+     * 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
+     */
+
+    public static function ensureActorProfile($activity, $feeduri=null, $salmonuri=null)
+    {
+        return self::ensureActivityObjectProfile($activity->actor, $feeduri, $salmonuri);
+    }
+
+    public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
+    {
+        $profile = self::getActivityObjectProfile($object);
+        if ($profile) {
+            $profile->updateFromActivityObject($object, $hints);
+        } else {
+            $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints);
+        }
+        return $profile;
+    }
+
+    /**
+     * @param Activity $activity
+     * @return mixed matching Ostatus_profile or false if none known
+     */
+    public static function getActorProfile($activity)
+    {
+        return self::getActivityObjectProfile($activity->actor);
+    }
+
+    protected static function getActivityObjectProfile($object)
+    {
+        $uri = self::getActivityObjectProfileURI($object);
+        return Ostatus_profile::staticGet('uri', $uri);
+    }
+
+    protected static function getActorProfileURI($activity)
+    {
+        return self::getActivityObjectProfileURI($activity->actor);
+    }
+
+    /**
+     * @param Activity $activity
+     * @return string
+     * @throws ServerException
+     */
+    protected static function getActivityObjectProfileURI($object)
+    {
+        $opts = array('allowed_schemes' => array('http', 'https'));
+        if ($object->id && Validate::uri($object->id, $opts)) {
+            return $object->id;
+        }
+        if ($object->link && Validate::uri($object->link, $opts)) {
+            return $object->link;
+        }
+        throw new ServerException("No author ID URI found");
+    }
+
+    /**
+     * @fixme validate stuff somewhere
+     */
+
+    protected static function createActorProfile($activity, $feeduri=null, $salmonuri=null)
+    {
+        $actor = $activity->actor;
+
+        self::createActivityObjectProfile($actor, $feeduri, $salmonuri);
+    }
+
+    /**
+     * Create local ostatus_profile and profile/user_group entries for
+     * the provided remote user or group.
+     *
+     * @param ActivityObject $object
+     * @param string $feeduri
+     * @param string $salmonuri
+     * @param array $hints
+     *
+     * @fixme fold $feeduri/$salmonuri into $hints
+     * @return Ostatus_profile
+     */
+    protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
+    {
+        $homeuri  = $object->id;
+
+        if (!$homeuri) {
+            common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true));
+            throw new ServerException("No profile URI");
+        }
+
+        if (empty($feeduri)) {
+            if (array_key_exists('feedurl', $hints)) {
+                $feeduri = $hints['feedurl'];
+            }
+        }
+
+        if (empty($salmonuri)) {
+            if (array_key_exists('salmon', $hints)) {
+                $salmonuri = $hints['salmon'];
+            }
+        }
+
+        if (!$feeduri || !$salmonuri) {
+            // Get the canonical feed URI and check it
+            $discover = new FeedDiscovery();
+            $feeduri = $discover->discoverFromURL($homeuri);
+
+            $huburi = $discover->getAtomLink('hub');
+            $salmonuri = $discover->getAtomLink('salmon');
+
+            if (!$huburi) {
+                // We can only deal with folks with a PuSH hub
+                throw new FeedSubNoHubException();
+            }
+        }
+
+        $oprofile = new Ostatus_profile();
+
+        $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();
+            self::updateProfile($profile, $object, $hints);
+            $profile->created  = common_sql_now();
+
+            $oprofile->profile_id = $profile->insert();
+            if (!$oprofile->profile_id) {
+                throw new ServerException("Can't save local profile");
+            }
+        } else {
+            $group = new User_group();
+            $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");
+        }
+    }
+
+    /**
+     * Save any updated profile information to our local copy.
+     * @param ActivityObject $object
+     * @param array $hints
+     */
+    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);
+        $profile->fullname = $object->title;
+        if (!empty($object->link)) {
+            $profile->profileurl = $object->link;
+        } else if (array_key_exists('profileurl', $hints)) {
+            $profile->profileurl = $hints['profileurl'];
+        }
+
+        // @fixme bio
+        // @fixme tags/categories
+        // @fixme location?
+        // @todo tags from categories
+        // @todo lat/lon/location?
+
+        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);
+
+        // @fixme need to make nick unique etc *hack hack*
+        $group->nickname = self::getActivityObjectNickname($object, $hints);
+        $group->fullname = $object->title;
+
+        // @fixme no canonical profileurl; using homepage instead for now
+        $group->homepage = $object->id;
+
+        // @fixme homepage
+        // @fixme bio
+        // @fixme tags/categories
+        // @fixme location?
+        // @todo tags from categories
+        // @todo lat/lon/location?
+
+        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 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);
+        }
+
+        // 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, look it up
+
+        $oprofile = Ostatus_profile::staticGet('uri', 'acct:'.$addr);
+
+        if (!empty($oprofile)) {
+            return $oprofile;
+        }
+
+        // Now, try some discovery
+
+        $wf = new Webfinger();
+
+        $result = $wf->lookup($addr);
+
+        if (!$result) {
+            return null;
+        }
+
+        foreach ($result->links as $link) {
+            switch ($link['rel']) {
+            case Webfinger::PROFILEPAGE:
+                $profileUrl = $link['href'];
+                break;
+            case 'salmon':
+                $salmonEndpoint = $link['href'];
+                break;
+            case Webfinger::UPDATESFROM:
+                $feedUrl = $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 we got a feed URL, try that
+
+        if (isset($feedUrl)) {
+            try {
+                $oprofile = self::ensureProfile($feedUrl, $hints);
+                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 {
+                $oprofile = self::ensureProfile($profileUrl, $hints);
+                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'");
+            }
+
+            return $oprofile;
+        }
+
+        return null;
     }
 }
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/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 048efda..0000000
+++ /dev/null
@@ -1,393 +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 getLink($element)
-    {
-        $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK);
-
-        foreach ($links as $link) {
-
-            $rel = $link->getAttribute(self::REL);
-            $type = $link->getAttribute(self::TYPE);
-
-            if ($rel == 'alternate' && $type == 'text/html') {
-                return $link->getAttribute(self::HREF);
-            }
-        }
-
-        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 CONTENT = 'content';
-    const ID      = 'id';
-    const SOURCE  = 'source';
-
-    const NAME  = 'name';
-    const URI   = 'uri';
-    const EMAIL = 'email';
-
-    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->source = $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->_childContent($element, self::SOURCE);
-
-            $this->link = ActivityUtils::getLink($element);
-
-            // XXX: grab PoCo stuff
-        }
-    }
-
-    /**
-     * 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
-     */
-
-    private function _childContent($element, $tag, $namespace=Activity::ATOM)
-    {
-        $els = $element->getElementsByTagnameNS($namespace, $tag);
-
-        if (empty($els) || $els->length == 0) {
-            return null;
-        } else {
-            $el = $els->item(0);
-            return $el->textContent;
-        }
-    }
-}
-
-/**
- * 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::getLink($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;
-    }
-
-    /**
-     * 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
-     */
-
-    private function _child($element, $tag, $namespace=self::SPEC)
-    {
-        $els = $element->getElementsByTagnameNS($namespace, $tag);
-
-        if (empty($els) || $els->length == 0) {
-            return null;
-        } else {
-            return $els->item(0);
-        }
-    }
-}
\ No newline at end of file
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 c895b6c..0000000
+++ /dev/null
@@ -1,349 +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...
-        $remote = Ostatus_profile::staticGet('feeduri', $this->getSelfLink());
-        if ($feed) {
-            return $feed->profile_id;
-        } else {
-            throw new Exception("Can't find feed profile");
-        }
-    }
-
-    /**
-     * 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..81f4609
--- /dev/null
@@ -0,0 +1,172 @@
+<?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)
+    {
+        return 'RSA.79_L2gq-TD72Nsb5yGS0r9stLLpJZF5AHXyxzWmQmlqKl276LEJEs8CppcerLcR90MbYQUwt-SX9slx40Yq3vA==.AQAB.AR-jo5KMfSISmDAT2iMs2_vNFgWRjl5rbJVvA0SpGIEWyPdCGxlPtCbTexp8-0ZEIe8a4SyjatBECH5hxgMTpw==';
+    }
+
+
+    public function signMessage($text, $mimetype, $signer_uri)
+    {
+        $signer_uri = $this->normalizeUser($signer_uri);
+
+        if (!$this->checkAuthor($text, $signer_uri)) {
+            return false;
+        }
+
+        $signature_alg = Magicsig::fromString($this->getKeyPair($signer_uri));
+        $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 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..0da8560
--- /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);
+        }
+    }
+
+    /**
+     * @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..a90f52d
--- /dev/null
@@ -0,0 +1,49 @@
+<?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) {
+            $feedsub->receive($post, $hmac);
+        } else {
+            common_log(LOG_ERR, "Discarding POST to unknown feed subscription id $feedsub_id");
+        }
+        return true;
+    }
+}
index 8c77222a6284ea6c63a85135510e76b0834be0be..b5f178cc6a2e4cec2f191dad33d96ed39aa9a4ad 100644 (file)
  */
 class Salmon
 {
+    /**
+     * 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)
     {
         if (empty($endpoint_uri)) {
-            return FALSE;
+            return false;
+        }
+
+        if (!common_config('ostatus', 'skip_signatures')) {
+            $xml = $this->createMagicEnv($xml);
         }
 
-        $headers = array('Content-type: application/atom+xml');
+        $headers = array('Content-Type: application/atom+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)
     {
+        $magic_env = new MagicEnvelope();
+
+        // TODO: Should probably be getting the signer uri as an argument?
+        $signer_uri = $magic_env->getAuthor($text);
 
+        $env = $magic_env->signMessage($text, 'application/atom+xml', $signer_uri);
 
+        return $magic_env->unfold($env);
     }
 
 
-    public function verifyMagicEnv($env)
+    public function verifyMagicEnv($dom)
     {
+        $magic_env = new MagicEnvelope();
+        
+        $env = $magic_env->fromDom($dom);
 
-
+        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..a031691
--- /dev/null
@@ -0,0 +1,193 @@
+<?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/atom+xml') {
+            $this->clientError(_m('Salmon requires application/atom+xml'));
+        }
+
+        $xml = file_get_contents('php://input');
+
+        $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.'));
+        }
+
+        // Check the signature
+        $salmon = new Salmon;
+        if (!common_config('ostatus', 'skip_signatures')) {
+            if (!$salmon->verifyMagicEnv($dom)) {
+                common_log(LOG_DEBUG, "Salmon signature verification failed.");
+                $this->clientError(_m('Salmon signature verification failed.'));
+            }
+        }
+
+        $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..aa97018
--- /dev/null
@@ -0,0 +1,44 @@
+<?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']));
+
+        $salmon = new Salmon();
+        $salmon->post($data['salmonuri'], $data['entry']);
+
+        // @fixme detect failure and attempt to resend
+        return true;
+    }
+}
index 417d54904b6d85e251f8fec7459ead5b5b4f353a..8a5037629467263f116528ce48494cf9aab9a000 100644 (file)
@@ -32,11 +32,16 @@ define('WEBFINGER_SERVICE_REL_VALUE', 'lrdd');
 /**
  * Implement the webfinger protocol.
  */
+
 class Webfinger
 {
+    const PROFILEPAGE = 'http://webfinger.net/rel/profile-page';
+    const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from';
+
     /**
      * Perform a webfinger lookup given an account.
-     */ 
+     */
+
     public function lookup($id)
     {
         $id = $this->normalize($id);
@@ -46,7 +51,7 @@ class Webfinger
         if (!$links) {
             return false;
         }
-        
+
         $services = array();
         foreach ($links as $link) {
             if ($link['template']) {
@@ -64,7 +69,7 @@ class Webfinger
     function normalize($id)
     {
         if (substr($id, 0, 7) == 'acct://') {
-            return substr($id, 7); 
+            return substr($id, 7);
         } else if (substr($id, 0, 5) == 'acct:') {
             return substr($id, 5);
         }
@@ -86,7 +91,7 @@ class Webfinger
         if ($result->host != $domain) {
             return false;
         }
-        
+
         $links = array();
         foreach ($result->links as $link) {
             if ($link['rel'] == WEBFINGER_SERVICE_REL_VALUE) {
@@ -103,6 +108,10 @@ class Webfinger
 
         $content = $this->fetchURL($url);
 
+        if (!$content) {
+            return false;
+        }
+
         return XRD::parse($content);
     }
 
@@ -140,4 +149,3 @@ class Webfinger
     }
 }
 
-
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..feeeb47d38209c7fa76acbf6ec25c1ec97ae1433 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;
 }
+
+#subscriptions #entity_remote_subscribe {
+padding:0;
+float:right;
+}
+
+#subscriptions .entity_remote_subscribe {
+float:right;
+}
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 ba87b266a03b2588cb62988531838dce483693c0..8af71af747246419595971f272d756128673d795 100644 (file)
@@ -77,9 +77,9 @@ class OrbitedPlugin extends RealtimePlugin
         $root = 'http://'.$server.(($port == 80) ? '':':'.$port);
 
         $scripts[] = $root.'/static/Orbited.js';
-        $scripts[] = common_path('plugins/Orbited/orbitedextra.js');
+        $scripts[] = 'plugins/Orbited/orbitedextra.js';
         $scripts[] = $root.'/static/protocols/stomp/stomp.js';
-        $scripts[] = common_path('plugins/Orbited/orbitedupdater.js');
+        $scripts[] = 'plugins/Orbited/orbitedupdater.js';
 
         return $scripts;
     }
diff --git a/plugins/PostDebug/PostDebugPlugin.php b/plugins/PostDebug/PostDebugPlugin.php
new file mode 100644 (file)
index 0000000..48fe28e
--- /dev/null
@@ -0,0 +1,150 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Debugging helper plugin -- records detailed data on POSTs to log
+ *
+ * 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  Sample
+ * @package   StatusNet
+ * @author    Brion Vibber <brionv@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);
+}
+
+class PostDebugPlugin extends Plugin
+{
+    /**
+     * Set to a directory to dump individual items instead of
+     * sending to the debug log
+     */
+    public $dir=false;
+
+    public function onArgsInitialize(&$args)
+    {
+        if (isset($_SERVER['REQUEST_METHOD']) &&
+            $_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->doDebug();
+        }
+    }
+
+    public function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'PostDebug',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Brion Vibber',
+                            'homepage' => 'http://status.net/wiki/Plugin:PostDebug',
+                            'rawdescription' =>
+                            _m('Debugging tool to record request details on POST.'));
+        return true;
+    }
+
+    protected function doDebug()
+    {
+        $data = array('timestamp' => gmdate('r'),
+                      'remote_addr' => @$_SERVER['REMOTE_ADDR'],
+                      'url' => @$_SERVER['REQUEST_URI'],
+                      'have_session' => common_have_session(),
+                      'logged_in' => common_logged_in(),
+                      'is_real_login' => common_is_real_login(),
+                      'user' => common_logged_in() ? common_current_user()->nickname : null,
+                      'headers' => $this->getHttpHeaders(),
+                      'post_data' => $this->sanitizePostData($_POST));
+        $this->saveDebug($data);
+    }
+
+    protected function saveDebug($data)
+    {
+        $output = var_export($data, true);
+        if ($this->dir) {
+            $file = $this->dir . DIRECTORY_SEPARATOR . $this->logFileName();
+            file_put_contents($file, $output);
+        } else {
+            common_log(LOG_DEBUG, "PostDebug: $output");
+        }
+    }
+
+    protected function logFileName()
+    {
+        $base = common_request_id();
+        $base = preg_replace('/^(.+?) .*$/', '$1', $base);
+        $base = str_replace(':', '-', $base);
+        $base = rawurlencode($base);
+        return $base;
+    }
+
+    protected function getHttpHeaders()
+    {
+        if (function_exists('getallheaders')) {
+            $headers = getallheaders();
+        } else {
+            $headers = array();
+            $prefix = 'HTTP_';
+            $prefixLen = strlen($prefix);
+            foreach ($_SERVER as $key => $val) {
+                if (substr($key, 0, $prefixLen) == $prefix) {
+                    $header = $this->normalizeHeader(substr($key, $prefixLen));
+                    $headers[$header] = $val;
+                }
+            }
+        }
+        foreach ($headers as $header => $val) {
+            if (strtolower($header) == 'cookie') {
+                $headers[$header] = $this->sanitizeCookies($val);
+            }
+        }
+        return $headers;
+    }
+
+    protected function normalizeHeader($key)
+    {
+        return implode('-',
+                       array_map('ucfirst',
+                                 explode("_",
+                                         strtolower($key))));
+    }
+
+    function sanitizeCookies($val)
+    {
+        $blacklist = array(session_name(), 'rememberme');
+        foreach ($blacklist as $name) {
+            $val = preg_replace("/(^|;\s*)({$name}=)(.*?)(;|$)/",
+                                "$1$2########$4",
+                                $val);
+        }
+        return $val;
+    }
+
+    function sanitizePostData($data)
+    {
+        $blacklist = array('password', 'confirm', 'token');
+        foreach ($data as $key => $val) {
+            if (in_array($key, $blacklist)) {
+                $data[$key] = '########';
+            }
+        }
+        return $data;
+    }
+
+}
+
index 6c212453e4455d12499690e2d83b7b984d70c724..e8c44a743ad2ac119bec1d8d9376367c338bc13d 100644 (file)
@@ -117,7 +117,7 @@ class RealtimePlugin extends Plugin
 
     function onEndShowStatusNetStyles($action)
     {
-        $action->cssLink(common_path('plugins/Realtime/realtimeupdate.css'),
+        $action->cssLink('plugins/Realtime/realtimeupdate.css',
                          null, 'screen, projection, tv');
         return true;
     }
@@ -307,7 +307,7 @@ class RealtimePlugin extends Plugin
 
     function _getScripts()
     {
-        return array(common_path('plugins/Realtime/realtimeupdate.js'));
+        return array('plugins/Realtime/realtimeupdate.js');
     }
 
     function _updateInitialize($timeline, $user_id)
index 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..e0d2aa8
--- /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-02-24 16:33-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 2dd815d3ce821eaddf08eb417debab0819b8037f..13e499d65eda5bba9e45c272e76555698706f91b 100644 (file)
@@ -33,11 +33,15 @@ function add_twitter_user($twitter_id, $screen_name)
     // repoed, and things like that.
 
     $luser = Foreign_user::getForeignUser($twitter_id, TWITTER_SERVICE);
-    $result = $luser->delete();
 
-    if ($result != false) {
-        common_log(LOG_INFO,
-            "Twitter bridge - removed old Twitter user: $screen_name ($twitter_id).");
+    if (!empty($luser)) {
+        $result = $luser->delete();
+        if ($result != false) {
+            common_log(
+                LOG_INFO,
+                "Twitter bridge - removed old Twitter user: $screen_name ($twitter_id)."
+            );
+        }
     }
 
     $fuser = new Foreign_user();
index c154932bbc003bdac3cabd62604c9ef714800f5e..cabf69d7a8b47a0e03dc0fad1cf2eb3c877a5ca9 100644 (file)
@@ -131,8 +131,7 @@ class TwitterauthorizationAction extends Action
             } else if ($this->arg('connect')) {
                 $this->connectNewUser();
             } else {
-                common_debug('Twitter Connect Plugin - ' .
-                             print_r($this->args, true));
+                common_debug('Twitter bridge - ' . print_r($this->args, true));
                 $this->showForm(_('Something weird happened.'),
                                 $this->trimmed('newname'));
             }
@@ -172,9 +171,15 @@ class TwitterauthorizationAction extends Action
             $auth_link = $client->getAuthorizeLink($req_tok, $this->signin);
 
         } catch (OAuthClientException $e) {
-            $msg = sprintf('OAuth client error - code: %1s, msg: %2s',
-                           $e->getCode(), $e->getMessage());
-            $this->serverError(_m('Couldn\'t link your Twitter account.'));
+            $msg = sprintf(
+                'OAuth client error - code: %1s, msg: %2s',
+                $e->getCode(),
+                $e->getMessage()
+            );
+            common_log(LOG_INFO, 'Twitter bridge - ' . $msg);
+            $this->serverError(
+                _m('Couldn\'t link your Twitter account.')
+            );
         }
 
         common_redirect($auth_link);
@@ -192,7 +197,9 @@ class TwitterauthorizationAction extends Action
         // token we sent them
 
         if ($_SESSION['twitter_request_token'] != $this->oauth_token) {
-            $this->serverError(_m('Couldn\'t link your Twitter account.'));
+            $this->serverError(
+                _m('Couldn\'t link your Twitter account: oauth_token mismatch.')
+            );
         }
 
         $twitter_user = null;
@@ -212,9 +219,15 @@ class TwitterauthorizationAction extends Action
             $twitter_user = $client->verifyCredentials();
 
         } catch (OAuthClientException $e) {
-            $msg = sprintf('OAuth client error - code: %1$s, msg: %2$s',
-                           $e->getCode(), $e->getMessage());
-            $this->serverError(_m('Couldn\'t link your Twitter account.'));
+            $msg = sprintf(
+                'OAuth client error - code: %1$s, msg: %2$s',
+                $e->getCode(),
+                $e->getMessage()
+            );
+            common_log(LOG_INFO, 'Twitter bridge - ' . $msg);
+            $this->serverError(
+                _m('Couldn\'t link your Twitter account.')
+            );
         }
 
         if (common_logged_in()) {
@@ -279,7 +292,7 @@ class TwitterauthorizationAction extends Action
 
         if (empty($flink_id)) {
             common_log_db_error($flink, 'INSERT', __FILE__);
-                $this->serverError(_('Couldn\'t link your Twitter account.'));
+            $this->serverError(_('Couldn\'t link your Twitter account.'));
         }
 
         return $flink_id;
index b9551b852633cf8104adb8d95ca323c41cc89a2e..9557f392bb15a794eaa36436e0e084e40c2ac78a 100644 (file)
@@ -34,6 +34,8 @@ if (!defined('STATUSNET')) {
     exit(1);
 }
 
+set_include_path(get_include_path() . PATH_SEPARATOR . INSTALLDIR . '/extlib/XMPPHP');
+
 /**
  * Plugin for XMPP
  *
@@ -106,12 +108,15 @@ class XmppPlugin extends ImPlugin
 
         switch ($cls)
         {
+        case 'XMPPHP_XMPP':
+            require_once 'XMPP.php';
+            return false;
         case 'Sharing_XMPP':
         case 'Fake_XMPP':
-            include_once $dir . '/'.$cls.'.php';
+            require_once $dir . '/'.$cls.'.php';
             return false;
         case 'XmppManager':
-            include_once $dir . '/'.strtolower($cls).'.php';
+            require_once $dir . '/'.strtolower($cls).'.php';
             return false;
         default:
             return true;
index d372d898fa23f3d7a003973ac5e9edf4c36a20a0..6dba16f95388a03d9533bcc46a04af6514cfb139 100755 (executable)
@@ -126,8 +126,7 @@ class QueueDaemon extends SpawningDaemon
 class QueueMaster extends IoMaster
 {
     /**
-     * Initialize IoManagers for the currently configured site
-     * which are appropriate to this instance.
+     * Initialize IoManagers which are appropriate to this instance.
      */
     function initManagers()
     {
index f882f673a4d9d00025dcfe0154c7068ce60142c8..61a6ac78331d543f66af381255961b103ee9f15a 100755 (executable)
@@ -63,7 +63,10 @@ xgettext \
     --output=locale/$domain.po \
     --language=PHP \
     --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 +189,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);
     }
 }
 
diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php
new file mode 100644 (file)
index 0000000..5de97d2
--- /dev/null
@@ -0,0 +1,326 @@
+<?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');
+        $this->assertEquals(
+            $act->actor->avatar,
+            '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');
+    }
+
+}
+
+$_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..52f97f6b12b64378be02d92685f87afe49b744e3 100644 (file)
@@ -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;
index a2f10134283210534a36c9f08a13cc25f9fcf31e..deb985909e8cc05e8e334d6ee53230fadb5debd7 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,
@@ -291,6 +292,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 +303,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;
index e214047451efbd8c79a0f33c98a4f61bd3e86de7..0e54d82e2f94d6df3162f8a71a71b8852e1dbd41 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,
@@ -290,6 +291,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 +302,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;